Hadoop_day02 学习笔记 —— HDFS

HDFS

1. 简介

  • Hadoop Distributed File System,hadoop分布式文件存储系统
  • 分布式的,可扩展,可靠的文件系统
  • 包含三个主要的进程
    • NameNode
    • DataNode
    • SecondaryNameNode
      三个进程一般分布在不同的主机上。
  • 特点:
    Hadoop_day02 学习笔记 —— HDFS
    Hadoop_day02 学习笔记 —— HDFS

2. HDFS架构

Hadoop_day02 学习笔记 —— HDFS
Hadoop_day02 学习笔记 —— HDFS

2.1 Block

  • 数据块是hdfs存储的最基本的单位
  • hdfs可以存储无限量数据,但是数据都是被切成标准块来分布式的存储到不同的节点上面
  • 为什么要切块
    1、切完块是为了方便存储大量文件。
    2、有利于数据的复制,快速备份
  • block默认的大小在hadoop1.0是64m,在hadoop2.0时是128M
  • 在hdfs中,如果一个小文件存储时,并不会占用数据块的存储空间。
  • Block复本放置策略:
    1. 第一个副本:如果是集群内部提交,那么哪一个DataNode提交的就将该复本放在哪个节点上。如果是集群之外的客户端上传的数据,那么就随机选择一台磁盘不太满,cpu不太忙的节点进行存储
    2. 第二个副本:放置在第一个复本不同机架的节点上
    3. 第三个副本:放置在与第二个副本相同机架的节点上
    4. 更多副本:随机节点(哪个节点比较空闲,就放到哪个节点上)
  • 扩展:机架感知策略
    Hadoop_day02 学习笔记 —— HDFS

2.2 NameNode

  • 启动nameNode
    hadoop-daemons.sh start namenode

Hadoop_day02 学习笔记 —— HDFS

  • 合并时机:
    1、根据设置的时间:fs.checkpoint.period=3600
    2、根据文件大小:edits文件大小超过64M就要去合并
    3、当hdfs启动的时候,也会触发合并
    4、可以手动通过命令来进行合并。

2.3 DataNode

namenode和DataNode之间:rpc传输协议,比http速度快
Hadoop_day02 学习笔记 —— HDFS

2.4 SecondaryNameNode

Hadoop_day02 学习笔记 —— HDFS

3. 基本命令

  • 常见命令
    Hadoop_day02 学习笔记 —— HDFS
    递归查询:hadoop fs -lsr /
  • 其他命令
    Hadoop_day02 学习笔记 —— HDFS

4. 回收站机制

在HDFS中,回收站机制默认是关闭的,即从HDFS上删除文件的时候是立即删除的。
Hadoop_day02 学习笔记 —— HDFS

5. dfs目录

Hadoop_day02 学习笔记 —— HDFS
Hadoop_day02 学习笔记 —— HDFS

6. 执行流程

6.1 删除原理

  1. 客户端会发送请求到NameNode
  2. NameNode会把对应节点的元数据删掉
  3. NameNode并不会主动联系DataNode删除数据,而是等到DataNode主动和NameNode汇报自身情况的时候,告诉DataNode,元数据已经被删除了,你可以把你自身的数据删掉了

6.2 读数据的原理

Hadoop_day02 学习笔记 —— HDFS

  1. 客户端发送请求给NameNode(读取数据)
  2. NameNode要判断客户端是否有权限
  3. NameNode会把要读取的文件的元数据信息,放到队列当中发送给客户端
    注意:如果文件特别大,块的数据返回给客户端时会分批返回
  4. 客户端拿到元数据信息后,就知道了到底哪台服务器有所需的数据。只需要按顺序读取即可,但是读取时有不同的副本,要看哪个副本离得最近。
    读取完一个block会对block进行校验,以保证读取的数据是完整的。如果读取失败,会联系NameNode读取其他副本
  5. 如果block数量非常多,读取完一批后,会联系NameNode读取下一批。

6.3 写数据的原理

Hadoop_day02 学习笔记 —— HDFS

  1. 客户端向NameNode发送RPC请求
  2. NameNode检查要创建的文件是否已经存在,判断客户端是否有权限,成功则为文件创建一个目录(即NameNode记录元数据),否则让客户端抛出异常
  3. 客户端写入文件时,会将文件分成多个数据包(packets),并向NameNode申请新的地址,用来存储副本的合适的DataNode列表,列表大小由NameNode中对副本的设置决定
  4. 客户端获取到地址后,以流的方式把数据包写入第一个DataNode中,第一个DataNode成功存储数据包后,在管道里再将其传递给第二个DataNode,流水线的方式,直到传递给最后一个DataNode
  5. 最后一个DataNode成功存储后返回一个ack信号,在管道里传递给上一个DataNode,一级一级直到传递给客户端。客户端收到ack信号后会继续写下一个Block
  6. 如果传输过程中,有某个DataNode出现了故障,则当前的管道会被关闭,出现故障的DataNode会从当前的管道中移除, 剩余的Block会继续剩下的DataNode中继续以管道的形式传输,同时NameNode会分配一个新的DataNode,保持 replications设定的数量。

7. API操作

  • 读取文件
    Hadoop_day02 学习笔记 —— HDFS
  • 上传文件
    Hadoop_day02 学习笔记 —— HDFS
  • 删除文件Hadoop_day02 学习笔记 —— HDFS
  • 在hdfs上创建文件夹
    Hadoop_day02 学习笔记 —— HDFS
  • 查询hdfs指定目录下的文件
  • 递归查询指定目录下的文件
    Hadoop_day02 学习笔记 —— HDFS
  • 重命名
    Hadoop_day02 学习笔记 —— HDFS
  • 获取文件的块信息
    Hadoop_day02 学习笔记 —— HDFS