【史上最全】Hadoop 核心 - HDFS 分布式文件系统详解(上万字建议收藏) (4)

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 将 pipelineack 发送给 Client;

当一个 block 传输完成之后,Client 再次请求 NameNode 上传第二个 block,重复步骤 2;

7.1 网络拓扑概念

在本地网络中,两个节点被称为“彼此近邻”是什么意思?在海量数据处理中,其主要限制因素是节点之间数据的传输速率——带宽很稀缺。这里的想法是将两个节点间的带宽作为距离的衡量标准。

节点距离:两个节点到达最近的共同祖先的距离总和。

例如,假设有数据中心d1机架r1中的节点n1。该节点可以表示为/d1/r1/n1。利用这种标记,这里给出四种距离描述。

Distance(/d1/r1/n1, /d1/r1/n1)=0(同一节点上的进程)

Distance(/d1/r1/n1, /d1/r1/n2)=2(同一机架上的不同节点)

Distance(/d1/r1/n1, /d1/r3/n2)=4(同一数据中心不同机架上的节点)

Distance(/d1/r1/n1, /d2/r4/n2)=6(不同数据中心的节点)

机架

7.2 机架感知(副本节点选择)

1)低版本Hadoop副本节点选择

第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。

第二个副本和第一个副本位于不相同机架的随机节点上。

第三个副本和第二个副本位于相同机架,节点随机。

机架感知

Hadoop2.7.2 副本节点选择

第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。

第二个副本和第一个副本位于相同机架,随机节点。

第三个副本位于不同机架,随机节点。

机架感知

8.HDFS 文件读取过程(非常重要)

HDFS 文件读取过程

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

NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 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 会合并成一个完整的最终文件。

从 HDFS 文件读写过程中,可以看出,HDFS 文件写入时是串行写入的,数据包先发送给节点A,然后节点A发送给B,B在给C;而HDFS文件读取是并行的, 客户端 Client 直接并行读取block所在的节点。

9. NameNode 工作机制以及元数据管理(重要)

NameNode 工作机制

9.1 namenode 与 datanode 启动

namenode工作机制

第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

客户端对元数据进行增删改的请求。

namenode记录操作日志,更新滚动日志。

namenode在内存中对数据进行增删改查。

secondary namenode

secondary namenode询问 namenode 是否需要 checkpoint。直接带回 namenode 是否检查结果。

secondary namenode 请求执行 checkpoint。

namenode 滚动正在写的edits日志。

将滚动前的编辑日志和镜像文件拷贝到 secondary namenode。

secondary namenode 加载编辑日志和镜像文件到内存,并合并。

生成新的镜像文件 fsimage.chkpoint。

拷贝 fsimage.chkpoint 到 namenode。

namenode将 fsimage.chkpoint 重新命名成fsimage。

9.2 FSImage与edits详解

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwydx.html