5.1 HDFS 工作机制

任务目的

  • 掌握 HDFS 集群三大重要角色的主要工作职责
  • 理解 HDFS 写数据的详细流程
  • 理解 HDFS 读数据的详细流程

任务清单

  • 任务1:HDFS 概述
  • 任务2:HDFS 写数据流程
  • 任务3:HDFS 读数据流程

详细任务步骤

任务1:HDFS 概述

  1. HDFS 集群分为三大角色: NameNodeDataNodeSecondaryNameNode
  2. NameNode 负责管理整个文件系统的元数据(简单的说,元数据就是描述文件的数据,如文件名、目录名、文件大小、文件创建时间等),并且负责响应客户端的请求
  3. DataNode 负责管理用户的文件数据块(即文件内容本身),并且通过心跳机制汇报给 NameNode。
  4. SecondaryNameNode 主要负责辅助 NameNode,分担其工作量,定期合并 fsimage 和 edits,并推送给 NameNode,在紧急情况下,可辅助恢复 NameNode 的数据。
  5. 文件会按照固定的大小(blocksize,Hadoop2.x 中默认为128M)切成若干块后分布式存储在若干台 DataNode 上。
  6. 每一个文件块可以有多个副本(默认为3份),并存放在不同的 DataNode上。
  7. DataNode 会定期向 NameNode 汇报自身所保存的文件 block 信息,而 NameNode 则会负责保持文件的副本数量。
  8. HDFS 的内部工作机制对客户端保持透明,客户端请求访问 HDFS 都是通过向 NameNode 申请来进行。

任务2:HDFS 写数据流程

2.1 写数据流程概述

  客户端要向 HDFS 写数据,首先要跟 NameNode 通信,确认可以写文件并获得接收文件 block 的 DataNode,然后,客户端按顺序将文件逐个 block 传递给相应 DataNode,并由接收到 block 的 DataNode 负责向其他 DataNode 复制 block 的副本。

2.2 写数据详细流程

Vditor

图1

  1. 使用 HDFS 提供的客户端 Client,向远程的 NameNode 发起 RPC 请求;
  2. NameNode 会检查要创建的文件是否已经存在,创建者是否有权限进行操作;
  3. 检查通过则会为文件创建一个记录,否则会让客户端抛出异常;
  4. Client 请求第一个 block 该传输到哪些 DataNode 服务器上,DataNode 列表的大小根据 NameNode 中 replication 的设定而定;
  5. NameNode 查询 DataNode 信息(考虑因素有:空间和距离);
  6. NameNode 返回 3 台可用的 DataNode 服务器 node1,node2,node3 给 Client;
  7. Client 请求 3 台 DataNode 中的一台 node1 上传数据,本质是一个 RPC 调用,建立传输管道 pipeline,node1 收到请求会继续调用 node2,让 node2 准备接收数据,然后 node2 调用 node3,将整个 pipeline 建立完成,逐级应答给 Client;
  8. Client 开始往 node1 写入第一个 block 的数据(先从磁盘读取数据放到一个本地内存缓存),以 packet(数据包,默认 64KB)为单位,并在内部以数据队列“data queue(数据队列)”的形式管理这些 packets,node1 收到一个 packet 就会传给 node2,然后 node2 再传递给 node3,这种写数据的方式呈流水线的形式;
  9. node1 每传一个 packet 就会放入一个到 “ack queue”(应答队列)中等待应答,等到最后一个 DataNode 成功存储之后,会将确认消息传给 Client 该 packet 才会从“ack queue” 中移除;
  10. 当一个 block 传输完成之后,Client 再次向 NameNode 请求上传第二个 block 的 DataNode 列表(重复4-9步),直至所有block写入完毕;
  11. 客户端完成数据的写入后,会对数据流调用 close() 方法,关闭数据流。

  如果传输过程中,有某个 DataNode 出现了故障,怎么办?

  1. 首先关闭当前的 pipeline;
  2. 将“ack queue” 中的数据块放回“data queue”的最前端;
  3. 当前的数据块在已经写入的 DataNode 中被 NameNode 赋予新的标识,则错误的 DataNode 重启后能够察觉其 block 是过时的,会被删除。
  4. 出现故障的 DataNode 会从当前的 pipeline 中移除,剩余的 block 会在剩下的 DataNode 中继续以 pipeline 的形式传输,同时 NameNode 会分配一个新的 DataNode,保持 replicas 设定的数量;
  5. 有时候会遇到多个 DataNode 失败,这种非常少见。只要写入了 dfs.replication.min(最小)的副本数(默认为 1),写操作就会成功,并且这个块可以在集群中异步复制,直到达到其目标副本数(dfs.replication 的默认值为 3),因为 NameNode 已经知道文件由哪些块组成,所以它在返回成功前只需要等待数据块进行最小量的复制。

任务3:HDFS 读数据流程

3.1 读数据流程概述

  客户端将要读取的文件路径发送给 NameNode, NameNode 获取文件的元信息(主要是 block 的存放位置信息)返回给客户端,客户端根据返回的信息找到相应 DataNode 逐个获取文件的 block 并在客户端本地进行数据追加合并从而获得整个文件。

3.2 读数据详细流程

Vditor

图2

  1. 使用 HDFS 提供的客户端 Client,向远程的 Namenode 发起 RPC 请求;
  2. NameNode 会视情况返回文件的全部 block 列表,对于每个 block,NameNode 都会返回有该 block 副本的 DataNode 地址;
  3. 客户端 Client 会选取离客户端最近的 DataNode 来读取 block;如果客户端本身就是 DataNode,那么将从本地直接获取数据,就近原则;
  4. 建立 socket 流,DataNode 开始发送数据(从磁盘里面读取数据放入流,以 packet 为单位来做校验),client 以 packet 为单位接收,先在本地缓存,然后写入目标文件。读取完当前 block 的数据后,关闭当前的 DataNode 连接,并为读取下一个 block 寻找最佳的 DataNode。
  5. 当读完列表 block 后,且文件读取还没有结束,客户端会继续向 NameNode 获取下一批的 block 列表;
  6. 后面的 block 块就相当于是 append 到前面的 block 块,最后合成最终需要的文件;
  7. 另外,需要注意的是,读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的 DataNode 继续读。

猜你喜欢

转载自blog.csdn.net/c_lanxiaofang/article/details/107805343