0%

hadoop-HDFS流程解析

介绍了HDFS读写数据、NameNode和SecondaryNameNode、DataNode和NameNode的交互

HDFS写数据

流程图

readHDFS.png

具体步骤

  1. 客户端调用DS模块向NameNode请求上传文件。
  2. NameNode会检查目标文件和父目录是否已存在,再返回是否可以上传
  3. 假设文件为200M,客户端请求上传第一个 Block ,希望得到DataNode服务器位置。
  4. NameNode返回3个DataNode节点,分别为dn1、dn2、dn3,用它们存储数据。
  5. 客户端通过FSDataOutputStream模块请求dn1建立上传数据通道,dn1收到请求会继续请求dn2,然后dn2请求dn3,直到将这个通信管道建立完成。
  6. dn3、dn2、dn1逐级应答客户端。
  7. 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。(类似队列,以Packet为单位)
  8. 当一个Block(0-128M)传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
  9. 向NameNode汇报上传完毕。

注意事项

  • DataNode位置选择,以默认3副本为例:第一个副本是最近的一般是它自己;第二个副本选择同一机架(同一路由)的不同节点;第三个副本是另一机架的随机节点。
  • 数据传递以包为单位,第一个节点收到一个包,就把包传递给下一个DataNode。并不是等数据传完,再传递。

HDFS读数据

流程图

writeHDFS.png

具体步骤

  1. 客户端调用DS模块向NameNode请求下载文件。
  2. NameNode会检查目标文件是否存在,再通过查询元数据,返回文件块所在的DataNode地址。
  3. 客户端通过FSDataInputStream模块向dn1(就近挑选)请求读取 Block1。
  4. DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
  5. 当一个Block(0-128M)传输完成之后,客户端再次请求下载Block2。(重复执行2-4步)。
  6. 向NameNode汇报下载完毕。

注意事项

  • 如果块的第一个副本请求失败,会向第二个副本请求,依次类推。

NameNode和SecondaryNameNode

流程图

NNand2NN.png

具体步骤

第一阶段:NameNode

  1. 第一次启动NameNode(格式化)后,会创建Fsimage(镜像文件)和Edits(编辑日志)文件。以后启动,会直接加载镜像文件和编辑日志到内存,此时会进行合并操作。
  2. 假设此时客户端提出了增删改的请求。
  3. NameNode记录之前的编辑日志(edits_n),更新新日志到滚动日志(edits_inprogress_n)中。
  4. 日志记录完毕后,NameNode在内存中对数据进行增删改。

第二阶段:SecondaryNameNode

  1. Secondary NameNode向NameNode询问是否需要CheckPoint。
  2. 如果需要,Secondary NameNode请求执行CheckPoint。
  3. NameNode滚动日志。
  4. 将滚动前的编辑日志(edits_001)和镜像文件(fsimage)拷贝到Secondary NameNode。
  5. Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
  6. 合并后,生成新的镜像文件fsimage.chkpoint。
  7. 拷贝fsimage.chkpoint到NameNode。
  8. NameNode将fsimage.chkpoint重新命名成fsimage。

注意事项

  • Fsimage 和 Edits文件?

fsimage是NameNode内存中元数据序列化后形成的文件。Edits中记录客户端更新元数据信息的每一步操作。每次执行增删改时,先改日志再改文件。好处是:如果保证中途gg,可以保证操作不丢失,便于复原。

  • 为啥要Secondary NameNode?

首先要知道只有NameNode重启时,edit.log才会合并到fsimage文件中,所以运行时间久了就会有3个问题:edis.log文件会变的很大;NameNode下次重启会花费很长时间;fsimage文件文件很旧,如果中途挂掉就很睿智。

为了解决上述问题,SecondaryNameNode诞生,每隔一定时间辅助合并NameNode的edit.log到fsimage文件中。从上述流程图就可以发现,它做的就是这个。

  • 什么时候执行CheckPoint?

(1) 用户定时 (2)edit.log 满了

  • Secondary NameNode是热备份吗?

不是,可以发现Secondary NameNode合并的是滚动前的edis,它总是比NameNode的编辑日志少一点。

DataNode和NameNode

流程图

DataNode.png

具体步骤

  1. DataNode启动后向NameNode注册。
  2. NameNode告知注册成功。
  3. DataNode周期性(1小时)的向NameNode上报所有的块信息。
  4. DataNode每3秒发送一次心跳,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。
  5. 超过10分钟没有收到心跳,表示该节点不可用。

注意事项

  • 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度、校验和 以及时间戳。
  • 节点增加:新节点配置好后,自动向NameNode注册的。
  • 节点退役:NameNode可以通过白名单指定需要的节点;通过黑名单指定不要的节点。