HDFS、MapReduce最重要的五个图

–SecondayNamenode的工作机制(检查点机制)

在这里插入图片描述

通过上图,可以总结如下:
	1. SecondaryNamenode请求Namenode停止使用正在编辑的editlog文件,Namenode会创建新的 editlog文件(小了吧),同时更新seed_txid文件。 
	2. SecondaryNamenode通过HTTP协议获取Namenode上的fsimage和editlog文件。 
	3. SecondaryNamenode将fsimage读进内存当中,并逐步分析editlog文件里的数据,进行合并 操作,然后写入新文件fsimage_x.ckpt文件中。 
	4. SecondaryNamenode将新文件fsimage_x.ckpt通过HTTP协议发送回Namenode。 
	5. Namenode再进行更名操作。

–HDFS读流程的详解

在这里插入图片描述

1.客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象是DistributedFileSystem,它通过使用远程过程调用(RPC)来调用namenode,以确定文件起始块 的位置 
2.对于每一个块,NameNode返回存有该块副本的DataNode地址,并根据距离客户端的远近来排序。 3.DistributedFileSystem实例会返回一个FSDataInputStream对象(支持文件定位功能)给客 户端以便读取数据,接 着客户端对这个输入流调用read()方法 
4.FSDataInputStream随即连接距离最近的文件中第一个块所在的DataNode,通过对数据流反复 调用read()方法,可以 将数据从DataNode传输到客户端 
5.客户端会将第一块儿数据保存到本地的文件中,后续的第二块儿数据会在第一块儿后面进行追加. 
6.当读取到块的末端时,FSInputStream关闭与该DataNode的连接,然后寻找下一个块的最佳 DataNode 
7.客户端从流中读取数据时,块是按照打开FSInputStream与DataNode的新建连接的顺序读取的。它也会根据需要询问 NameNode来检索下一批数据块的DataNode的位置。一旦客户端完成读取,就对FSInputStream调 用close方法

注意点:在读取数据的时候,如果FSInputStream与DataNode通信时遇到错误,会尝试从这个块 的最近的DataNode读取数据,并且记住那个故障的DataNode,保证后续不会反复读取该节点上后 续的块。FInputStream也 会通过校验和确认从DataNode发来的数据是否完整。如果发现有损 坏的块,FSInputStream会从其他的块读取副 本,并且将损坏的块通知给NameNode

–HDFS写流程的详解

图中的12. 客户端(操作者)通过调用DistributedFileSystem对象的create()方法(内部会调 用HDFSClient对象的 create()方法),实现在namenode上创建新的文件并返回一个FSDataOutputStream对象
1.DistributedFileSystem要通过RPC调用namenode去创建一个没有blocks关联的新文件,此时 该文件中还没有相应的 数据块信息 
2.但是在新文件创建之前,namenode执行各种不同的检查,以确保这个文件不存在以及客户端有新 建该文件的权限。如果检查通过,namenode就会为创建新文件记录一条事务记录(否则,文件 创建失败并向客户端抛出一个IOException异常)。DistributedFileSystem向客户端返回一个 FSDataOuputStream对象 
3.FSDataOutputStream被封装成DFSOutputStream。DFSOutputStream能够协调namenode和 datanode。客户端开始 写数据到DFSOutputStream,DFSOutputStream会把数据分成一个个 的数据包(packet),并写入一个内部队列,这个队 列称为“数据队列”(data queue) 
4.DataStreamer会去处理接受data quene,它先询问namenode这个新的block最适合存储的在 哪几个datanode里(比方副本数是3。那么就找到3个最适合的datanode),把他们排成一个 pipeline。DataStreamer把packet按队列输出到 管道的第一个datanode中。第一个 datanode又把packet输出到第二个datanode中。以此类推。DataStreamer在将一个 个 packet流式的传到第一个DataNode节点后,还会将packet从数据队列移动到另一个队列确认队列 (ack queue).确认队列也是由packet组成,作用是等待datanode完全接收完数据后接收响应. 
5.datanode写入数据成功之后,会为ResponseProcessor线程发送一个写入成功的信息回执,当 收到管道中所有的datanode确认信息后,ResponseProcessoer线程会将该数据包从确认队列中 删除。 
6.客户端写完数据后会调用close()方法,关闭写入流.
7.DataStreamer把剩余的包都刷到pipeline里,然后等待ack信息,收到最后一个ack后,客户 端通过调用DistributedFileSystem对象的complete()方法来告知namenode数据传输完成.

注意点1 如果任何datanode在写入数据期间发生故障,则执行以下操作
1. 首先关闭管道,把确认队列中的所有数据包都添加回数据队列的最前端,以确保故障节点下游 的datanode不会漏掉任何一个数据包 
2. 为存储在另一正常datanode的当前数据块制定一个新标识,并将该标识传送给namenode,以 便故障datanode在恢复后可以删除存储的部分数据块 
3. 从管道中删除故障datanode,基于两个正常datanode构建一条新管道,余下数据块写入管道 中正常的datanode 4. namenode注意到块复本不足时,会在一个新的Datanode节点上创建一个新的复本。

注意点2
注意:在一个块被写入期间可能会有多个datanode同时发生故障,但概率非常低。只要写入了 dfs.namenode.replication.min的复本数(默认1),写操作就会成功,并且这个块可以在集群 中异步复制,直到达到其目标复本数dfs.replication的数量(默认3)

注意点3
client运行write操作后,写完的block才是可见的,正在写的block对client是不可见的,仅仅 有调用sync方法。client才确保该文件的写操作已经全部完毕。当client调用close方法时,会 默认调用sync方法。

–YARN的 Job 提交

在MR程序运⾏时,有五个独⽴的进程:

- YarnRunner:⽤于提交作业的客户端程序
- ResourceManager:yarn资源管理器,负责协调集群上计算机资源的分配
- NodeManager:yarn节点管理器,负责启动和监视集群中机器上的计算容器
(container)
- Application Master:负责协调运⾏MapReduce作业的任务,他和任务都在容器中运
⾏,这些容器由资源管理器分配并由节点管理器进⾏管理。
- HDFS:⽤于共享作业所需⽂件。

在这里插入图片描述

1. 调⽤waitForCompletion⽅法每秒轮询作业的进度,内部封装了submit()⽅法,⽤于
创建JobCommiter实例,并且调⽤其的submitJobInternal⽅法。提交成功后,如果有状
态改变,就会把进度报告到控制台。错误也会报告到
控制台
2. JobCommiter实例会向ResourceManager申请⼀个新应⽤ID,⽤于MapReduce作业
ID。这期间JobCommiter也会进⾏检查输出路径的情况,以及计算输⼊分⽚。
3. 如果成功申请到ID,就会将运⾏作业所需要的资源(包括作业jar⽂件,配置⽂件和计算
所得的输⼊分⽚元数据⽂件)上传到⼀个⽤ID命名的⽬录下的HDFS上。此时副本个数默认是
104. 准备⼯作已经做好,再通知ResourceManager调⽤submitApplication⽅法提交作
业。
5. ResourceManager调⽤submitApplication⽅法后,会通知Yarn调度器
(Scheduler),调度器分配⼀个容器,在节点管理器的管理下在容器中启动
application master进程。
6. application master的主类是MRAppMaster,其主要作⽤是初始化任务,并接受来
⾃任务的进度和完成报告。
7. 然后从HDFS上接受资源,主要是split。然后为每⼀个split创建MapTask以及参数指
定的ReduceTask,任务ID在此时分配
8. 然后Application Master会向资源管理器请求容器,⾸先为MapTask申请容器,然后
再为ReduceTask申请容器。(5%9. ⼀旦ResourceManager中的调度器(Scheduler),为Task分配了⼀个特定节点上的
容器,Application Master就会与NodeManager进⾏通信来启动容器。
10. 运⾏任务是由YarnChild来执⾏的,运⾏任务前,先将资源本地化(jar⽂件,配置⽂
件,缓存⽂件)
11. 然后开始运⾏MapTask或ReduceTask。
12. 当收到最后⼀个任务已经完成的通知后,application master会把作业状态设置为
success。然后Job轮询时,知道成功完成,就会通知客户端,并把统计信息输出到控制台

– shuffle整体流程图(参考)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值