Hadoop 【5】- HDFS入门(三)工作机制

HDFS的工作机制

NameNode负责管理整个文件系统元数据, DataNode负责管理具体文件数据块存储, Secondary NameNode协助NameNode进行元数据的备份。

HDFS的内部工作机制对对客户端保持透明, 客户端请求访问HDFS都是通过向NameNode申请来进行。

Hadoop 【5】- HDFS入门(三)工作机制

一、HDFS写数据流程

详细步骤:

  • client发起文件上传请求, 通过RPC与NameNOde建立通讯, NameNode检查目标文件是否存在, 父目录是否存在, 返回是否可以上传。

  • client请求第一个block该传输到哪些DataNode服务器上。

  • NameNode根据配置文件中指定的备份数及机架感知原理进行文件配置, 返回可用的DataNode的地址: A, B, C。

注: Hadoop在设计时考虑数据的安全与搞笑, 数据文件默认在HDFS上存三份, 存储策略为本地一份, 同机架内其它某一节点一份, 不同机架上的某一节点上一份

  • client请求3台DataNode中的一台A上传数据(本质是一个RPC调用,建立pipeline), A收到请求会调用B, 然后B调用C, 将整个pipeline建立完成, 后逐级返回client。

  • client开始往A上传第一个block(先从磁盘读取数据放到本地内存缓存),以packet为单位(默认64k), A收到一个packet就会传给B, B传给C, A每传一个packet会放入一个应答队列等待应答。

  • 数据被分割成一个个packet数据包在pipeline上一次传输。在pipeline反方向上,逐个发送 ack (命令正确应答),最终由pipeline中第一个DataNode节点A将pipeline ack发送给client。

  • 当一个block传输完成后, client再请求NameNode上传第二个block到服务器。

流程图

Hadoop 【5】- HDFS入门(三)工作机制

二、HDFS读数据流程

详细步骤

  • Client向NameNode发起RPC请求, 来确定请求文件block所在位置。

  • Name会视情况返回文件部分或全部block列表,对于每个block, NameNode都会返回含有该block副本的DataNode地址。

  • 这些返回的DataNode地址, 会按照集群拓扑结构得出DataNode与客户端的距离, 然后进行排序, 排序两个规则:网络拓扑结构中距离Client近的排靠前, 心跳机制中超时汇报的DataNode状态STALE, 这样的排靠后。

  • Client选取排序靠前的DataNode来读取block, 如果客户端本身就是DataNode, 那么将从本地直接获取数据。

  • 底层上本质是建立Socket Stream(FSDataInputStream)。 重复的调用父类DataInputStream的read方法, 知道这个块上的数据读取完毕。

  • 当读完列表的block后, 若文件读取还没有结束,客户端会继续向NameNode获取下一批的block列表。

  • 读取完一个block都会进行checksum验证, 如果读取DataNode时出现错误,客户端会通知NameNode, 然后再从下一个拥有该block副本的Datanode继续读。

  • read方法是并行的读取block信息, 不是一块一块的读取, NameNode只返回client请求包含的DataNode地址, 并不是返回请求块的数据。

  • 最终读取来的所有block会合并成一个完成的最终文件。

流程图

Hadoop 【5】- HDFS入门(三)工作机制

参考资料:

【1】 腾讯课堂-大数据hadoop入门