HDFS的读写机制

2019-11-09  本文已影响0人  Michaelhbjian

本篇博客讲解了HDFS的读机制和写机制,通过一个实例演示了HDFS的文件存储过程,非常通俗易懂。

1、客户端写文件

下图显示了在读取HDFS上的文件时,客户端、名称节点和数据节点间发生的一些事件以及事件的顺序。

假设一个HDFS客户机想要编写一个大小为248 MB的名为example.txt的文件

209bc3609653458005e81d55994c800c

假设系统块大小配置为128 MB(默认)。因此,客户机将把example.txt文件分成两个块,一个是128 MB(块A),另一个是120 MB(块B)。

Now, the following protocol will be followed whenever the data is written into HDFS:

507451d888ffc05b6ed7712f622d70e8
  1. Set up of Pipeline
  2. Data streaming and replication
  3. Shutdown of Pipeline (Acknowledgement stage)

1.1、Set up of Pipeline

在写入块之前,客户端确认每个ip列表中的datanode是否准备好接收数据。在此过程中,客户端通过连接每个块的相应列表中的各个datanode来为每个块创建一个管道。让我们考虑a块。NameNode提供的datanode列表是:

e3e042f1b98b9ab78329cc0d67bf3d51

So, for block A, the client will be performing the following steps to create a pipeline:

1.2、Data Streaming

在创建管道之后,客户机将把数据推入管道。现在,不要忘记在HDFS中,数据是根据复制因子进行复制的。因此,这里块A将被存储到三个datanode,假设复制因子为3。继续,客户机将仅将块(A)复制到DataNode 1。复制总是按顺序由datanode完成。

6e92a2d4cd28c4e6161a51a028994acb

So, the following steps will take place during replication:

1.3、Shutdown of Pipeline or Acknowledgement stage

一旦将块复制到所有三个DataNode中,将进行一系列确认,以确保客户端和NameNode数据已成功写入。然后,客户端将最终关闭管道以结束TCP会话

总体的具体过程如下:

  1. Client 调用 DistributedFileSystem 对象的 create 方法,创建一个文件输出流(FSDataOutputStream)对象;
  2. 通过 DistributedFileSystem 对象与集群的 NameNode 进行一次 RPC 远程调用,在 HDFS 的 Namespace 中创建一个文件条目(Entry),此时该条目没有任何的 Block,NameNode 会返回该数据每个块需要拷贝的 DataNode 地址信息;
  3. 通过 FSDataOutputStream 对象,开始向 DataNode 写入数据,数据首先被写入 FSDataOutputStream 对象内部的数据队列中,数据队列由 DataStreamer 使用,它通过选择合适的 DataNode 列表来存储副本,从而要求 NameNode 分配新的 block;
  4. DataStreamer 将数据包以流式传输的方式传输到分配的第一个 DataNode 中,该数据流将数据包存储到第一个 DataNode 中并将其转发到第二个 DataNode 中,接着第二个 DataNode 节点会将数据包转发到第三个 DataNode 节点;
  5. DataNode 确认数据传输完成,最后由第一个 DataNode 通知 client 数据写入成功;
  6. 完成向文件写入数据,Client 在文件输出流(FSDataOutputStream)对象上调用 close 方法,完成文件写入;
  7. 调用 DistributedFileSystem 对象的 complete 方法,通知 NameNode 文件写入成功,NameNode 会将相关结果记录到 editlog 中。

2、客户端读文件

如下图所示,确认按相反的顺序发生,即从DataNode 6到4,然后到1。最后,DataNode 1将把三个确认(包括它自己的)推入管道,并将其发送给客户机。客户端将通知NameNode数据已被成功写入。NameNode将更新它的元数据,客户机将关闭管道。

8fd1b583810d80467a9354b2e1668cff

Now, following steps will be taking place while reading the file:

其具体过程总结如下(简单总结一下):

  1. Client 通过 DistributedFileSystem 对象与集群的 NameNode 进行一次 RPC 远程调用,获取文件 block 位置信息;
  2. NameNode 返回存储的每个块的 DataNode 列表;
  3. Client 将连接到列表中最近的 DataNode;
  4. Client 开始从 DataNode 并行读取数据;
  5. 一旦 Client 获得了所有必须的 block,它就会将这些 block 组合起来形成一个文件。

在处理 Client 的读取请求时,HDFS 会利用机架感知选举最接近 Client 位置的副本,这将会减少读取延迟和带宽消耗。

3、参考资料

https://www.edureka.co/blog/apache-hadoop-hdfs-architecture/

https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

上一篇 下一篇

猜你喜欢

热点阅读