元数据合并流程
HDFS的读写过程
shuffle过程
job提交流程

元数据合并流程 CheckPoint
edits:日志的元数据
fsImage :镜像的元数据
1)snn会向namenode发送元数据是否合并的检查 1min检查一次
2)namenode需要元数据合并 会向snn进行相应
3)snn向namenode发送元数据合并的 请求
4)namenode将正在编辑的元数据的日志文件进行回滚 变成一个历史日志文件,同时会
生成一个新的正在编辑的日志文件
5)snn将fsimage文件和edits文件拉取到snn的本地
6)snn将上面的文件加载到内存中进行合并 根据edits的操作日志修改fsimage文件
7)合并完成,将合并完成的文件发送给namenode,重命名,生成最新的fsiamge文件 本地也会保存一个

HDFS读写数据流程
写数据
1、 client 发写数据请求
2、 namenode 相应请求,然后做一系列校验,如果能上传该数据,则返回该文件的所有切
块应该被存在哪些 datanode 上的 datanodes 列表
blk-001:hadoop02 hadoop03
blk-002:hadoop03 hadoop04
3、 client 拿到 datanode 列表之后,开始传数据
4、 首先传第一块 blk-001, datanode 列表就是 hadoop02,hadoop03, client 就把 blk-001 传到
hadoop02 和 hadoop03 上
5、 ……… 用传第一个数据块同样的方式传其他的数据块
6、 当所有的数据块都传完之后, client 会给 namenode 返回一个状态信息,表示数据已全
部写入成功,或者是失败的信息
7、 namenode 接收到 client 返回的状态信息来判断当次写入数据的请求是否成功,如果成
功,就需要更新元数据信息
读数据
1、使用 HDFS 提供的客户端 Client,向远程的 namenode 发起 RPC 请求;
2、 namenode 会视情况返回文件的全部 block 列表,对于每个 block, namenode 都会返回有
该 block 拷贝的 datanode 地址;
3、客户端 Client 会选取离客户端最近的 datanode 来读取 block;如果客户端本身就是 datanode,
那么将从本地直接获取数据;
4、读取完当前 block 的数据后,关闭当前的 datanode 链接,并为读取下一个 block 寻找最
佳的 datanode;
5、当读完列表 block 后,且文件读取还没有结束,客户端会继续向 namenode 获取下一批的
block 列表;
6、读取完一个 block 都会进行 checksum 验证,如果读取 datanode 时出现错误,客户端会
通知 namenode,然后再从下一个拥有该 block 拷贝的 datanode 继续读

shuffle过程

	maptask-------reducetask之间
	maptask的数据----收集器----环形缓冲区(100M  0.8)数据:原始 元(分区 key的起始 value的起始 value的长度)---
	进行排序(快速排序)  溢写文件-----归并  排序---一个最终溢写文件  分区 key排好序
	reducetask通过MRappmaster  数据拉取    每一个reducetask只拉取数据自己分区的数据
	---归并排序---分组----reducetask之间

shuffle阶段又可以分为Map端的shuffle和Reduce端的shuffle。

一、Map端的shuffle

Map端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是HDFS。每个Map的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫做spill。

在spill写入之前,会先进行二次排序,首先根据数据所属的partition进行排序,然后每个partition中的数据再按key来排序。partition的目是将记录划分到不同的Reducer上去,以期望能够达到负载均衡,以后的Reducer就会根据partition来读取自己对应的数据。接着运行combiner(如果设置了的话),combiner的本质也是一个Reducer,其目的是对将要写入到磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减少。最后将数据写到本地磁盘产生spill文件(spill文件保存在{mapred.local.dir}指定的目录中,Map任务结束后就会被删除)。

最后,每个Map任务可能产生多个spill文件,在每个Map任务完成前,会通过多路归并算法将这些spill文件归并成一个文件。至此,Map的shuffle过程就结束了。

二、Reduce端的shuffle

Reduce端的shuffle主要包括三个阶段,copy、sort(merge)和reduce。

首先要将Map端产生的输出文件拷贝到Reduce端,但每个Reducer如何知道自己应该处理哪些数据呢?因为Map端进行partition的时候,实际上就相当于指定了每个Reducer要处理的数据(partition就对应了Reducer),所以Reducer在拷贝数据的时候只需拷贝与自己对应的partition中的数据即可。每个Reducer会处理一个或者多个partition,但需要先将自己对应的partition中的数据从每个Map的输出结果中拷贝过来。

接下来就是sort阶段,也成为merge阶段,因为这个阶段的主要工作是执行了归并排序。从Map端拷贝到Reduce端的数据都是有序的,所以很适合归并排序。最终在Reduce端生成一个较大的文件作为Reduce的输入。

最后就是Reduce过程了,在这个过程中产生了最终的输出结果,并将其写到HDFS上。

job提交过程

(1)作业提交

第 0 步:client 调用 job.waitForCompletion 方法,向整个集群提交 MapReduce 作业。

第 1 步:client 向 RM 申请一个作业 id。

第 2 步:RM 给 client 返回该 job 资源的提交路径和作业 id。

第 3 步:client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。

第 4 步:client 提交完资源后,向 RM 申请运行 MrAppMaster。

(2)作业初始化

第 5 步:当 RM 收到 client 的请求后,将该 job 添加到容量调度器中。

第 6 步:某一个空闲的 NM 领取到该 job。

第 7 步:该 NM 创建 Container,并产生 MRAppmaster。

第 8 步:下载 client 提交的资源到本地。

(3)任务分配

第 9 步:MrAppMaster 向 RM 申请运行多个 maptask 任务资源。

第 10 步 :RM 将运行 maptask 任务分配给另外两个 NodeManager,另两个 NodeManager

分别领取任务并创建容器。

(4)任务运行

第 11 步:MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个NodeManager 分别启动 maptask,maptask 对数据分区排序。

第 12 步:MrAppMaster 等待所有 maptask 运行完毕后,向 RM 申请容器,运行 reduce task。

第 13 步:reduce task 向 maptask 获取相应分区的数据。

第 14 步:程序运行完毕后,MR 会向 RM 申请注销自己。

(5)进度和状态更新

YARN 中的任务将其进度和状态(包括 counter)返回给应用管理器, 客户端每秒(通过

mapreduce.client.progressmonitor.pollinterval 设置)向应用管理器请求进度更新, 展示给用户。

(6)作业完成

除了向应用管理器请求作业进度外, 客户端每 5 分钟都会通过调用 waitForCompletion()

来检查作业是否完成。时间间隔可以通过 mapreduce.client.completion.pollinterval 来设置。作

业完成之后, 应用管理器和 container 会清理工作状态。作业的信息会被作业历史服务器存储

以备之后用户核查。

12-19 20:50