图文详解HDFS工作机制( 二 )


3.3 写原理
假如我们要一个文件名字“example.txt”,248M 。

图文详解HDFS工作机制

文章插图
假设block.size设置的128M,因此client会把该文件切分成两个block,分布是 128M和120M 。
每当向HDFS写数据的时候,都遵循下面的几个流程
  • HDFS client 向NameNode 发送 两个blocks(blockA、blockB)的写入请求
  • NameNode给client进行写入授权并提供用来进行存储和复制的DataNodes IP
  • DataNodes基于HDFS可用性、复制因子和机架感知的选择是完全随机的
  • 假设复制因子设置的是3,那么NameNode将为每个blocks提供3个DataNodes IP 。相对每个block提供的3个DataNodes都是唯一的 。假设NameNode提供的DataNodes列表如下:
For Block A, list A = {IP of DataNode 1, IP of DataNode 4, IP of DataNode 6}For Block B, set B = {IP of DataNode 3, IP of DataNode 7, IP of DataNode 9}
  • 每个block将在三个不同的DataNode进行复制,维持整个集群的复制因子一致性
  • 接下来整个数据将会经历下面三个阶段:1建立管道 2数据流与复制 3管道关闭及确认
3.3.1 建立管道
client在blocks写入之前会确保提供的DataNodes是否已经做好接受数据的准备 。在这样的情况下,client会连接该block列表中的各个DataNodes,为每个block建一个管道 。以BlockA举例,它的DN(DataNode)列表是 { DN 1 IP,DN 4 IP, DN 6 IP }
图文详解HDFS工作机制

文章插图
如上图,大概有一下几个步骤:
  • client 拿着 blockA 向 NameNode发起写请求
  • NameNode返回一组可供存储和复制的DN IP列表
  • client向 DN1 进行写入准备确认,同时会告诉DN1接下来要进行复制的DN4和DN6的IP
  • DN1 会向 DN4发起写入准备确认,依次类推DN4给DN6发送确认
  • DN6 确认完毕回传给 DN4,DN4确认后会将自己以及DN6的确认信息给DN1,最后DN1将三个DN的确认结果答复给client
  • 管道建立完毕,client将开始进行数据复制或者数据处理
3.3.2 数据流与复制
当client与DataNodes之间的管道建立之后,client将开始将推送数据到管道 。我们这里假设的复制因子是3,所以blockA将被复制三份,但是注意的是client只会将blockA推送到DN1,然后由DataNodes自己按照顺序进行复制 。
图文详解HDFS工作机制

文章插图
如上图所示,整个复制过程步骤如下:
  • client 将blockA写入DN1,接着DN1连接DN4
  • DN1通过管道向DN4复制数据
  • DN4数据写完后会继续连接DN6进行最后一份数据的复制
3.3.3 管道关闭和确认
当block复制3份完成后,client和NameNode会有一系列的ack确认来保证数据被成功写入 。
如下图所示,DataNodes的确认和写入的顺序恰好相反,DN6写入成功后会给DN4发送确认消息,接着DN4会将DN6和自己的确认消息发送给DN1,最后DN1将所有的确认消息发送给client,client再给NameNode确认block写入成功,然后NameNode更新对应的元数据,最终client关闭管道 。
图文详解HDFS工作机制

文章插图
以上的所有流程,我们都是针对blockA进行解说,而blockB是完全一样的,blockB有自己的管道、自己的DataNodes并行的进行写入 。
图文详解HDFS工作机制

文章插图
如上图所示,有两个管道分别为blokA和blockB提供,他们各自的流程顺序如下:
  • For Block A: 1A -> 2A -> 3A -> 4A
  • For Block B: 1B -> 2B -> 3B -> 4B -> 5B -> 6B
3.4 读原理
读的原理相对写更容易理解,我们同样以example.txt举例 。
图文详解HDFS工作机制

文章插图
如上图所示,有以下几个步骤
  • client请求NameNode 要读取example.txt的数据,NameNode查询元数据,将该文件对应的所有block及对应的DataNode列表返回
  • client并行的分别从DataNodes读取blockA和blockB的数据 。为了保证低延迟和节约带宽,通常会选择离client近的副本进行读取,如果可能,会选择和阅读节点在同一个机架上的副本(如图中所示,选择了Rack1, blockA和blockB都有对应的副本)
  • client一旦获取到所有的block,就会开始组装成文件,并返回 。
最后
本篇先以漫画的方式阐述场景HDFS 读写流程,然后又以HDFS里的概念进行进一步的描述,相信大家已经对此有所了解 。

【图文详解HDFS工作机制】


推荐阅读