Hadoop基础 二

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lianghecai52171314/article/details/102762081

HDFS

Yarn

在这里插入图片描述
Yarn 调度 MR 任务的过程
客户端执行 hadoop jar ****命令来请求执行某个 MR 任务。
由JobClient.java 请求连接 ResourceManager。
ResourceManager 创建任务 ID。
JobClient.java 得到任务 ID 后,将任务保存到 HDFS 上。
JobClient.java 获取元信息(数据的元信息,任务的元信息)。
JobClient.java 将任务 ID,数据的元信息,任务的元信息提交给 Yarn。
ResourceManager 初始化任务(谁来执行,需要多少资源)。
ResourceManager 将通过心跳检测,将任务 ID,数据的元信息,任务的元信息分配给最不忙的 NodeManager 来执行。
NodeManager 根据得到的元信息访问 HDFS 获取数据和任务,并执行。
NodeManager 将结果写回 HDFS。

HDFS读流程图

在这里插入图片描述

  1. 客户端发出读数据请求,Open File指定读取的文件路径,去找namenode要元数据信息。
  2. namenode将文件的元数据信息返回给客户端。
  3. 客户端根据返回的元数据信息,去对应的datanode去读块数据。
    假如一个文件特别大,比如1TB,会分成好多块,此时,namenode并是不一次性把所有的元数据信息返回给客户端。
  4. 客户端读完此部分后,再去想namenode要下一部分的元数据信息,再接着读。
  5. 读完之后,通知namenode关闭流

在这里插入图片描述

读过程

1.初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件
2.FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。
3.FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据。
4.DFSInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端(client)
5.当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
6.当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。
7.在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。
8.失败的数据节点将被记录,以后不再连接。

HDFS写流程

在这里插入图片描述

  1. 发起一个写数据请求,并指定上传文件的路径,然后去找namenode。namenode首先会判断路径合法性,然后会判断此客户端是否有写权限。然后都满足,namenode会给客户端返回一个输出流。此外,namenode会为文件分配块存储信息。注意,namenode也是分配块的存储信息,但不做物理切块工作。
  2. 客户端拿到输出流以及块存储信息之后,就开始向datanode写数据。因为一个块数据,有三个副本,所以图里有三个datanode。packet初学时可以简单理解为就是一块数据。
    pipeLine:[bl1,datanode01-datanode03-datanode-07]
  3. 数据块的发送,先发给第一台datanode,然后再有第一台datanode发往第二台datanode,……。实际这里,用到了pipeLine 数据流管道的思想。
  4. 通过ack确认机制,向上游节点发送确认,这么做的目的是确保块数据复制的完整性。
  5. 通过最上游节点,向客户端发送ack,如果块数据没有发送完,就继续发送下一块。如果所有块数据都已发完,就可以关流了。
  6. 所有块数据都写完后,关流。

在这里插入图片描述

写过程

1.初始化FileSystem,客户端调用create()来创建文件
2.FileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。
3.FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。
4.DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
5.DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
6.当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。
7.如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

猜你喜欢

转载自blog.csdn.net/lianghecai52171314/article/details/102762081