【灵光一现】此心安处是吾乡-MapReduce&Shuffle&yarn机制

写在前面

本篇主要介绍mapreduce的工作机制或者shuffle的工作机制,其实mapreduce整个流程就包含了shuffle


先放两张从某谷那扒下来的mapreduce机制图以及单独的shuffle图

mapreduce机制:

shuffle机制:

MapTask

整个MapTask分为五个阶段:READ,MAP,COLLECT,溢写(Spill),Combine

MapTask之前

客户端获取待处理文件,根据其文件大小,参数配置形成一个任务分配规划(切片),之后将切片信息,jar包,xml文件一起提交给yarn,然后计算出maptask的数量后,开辟maptask空间

Read阶段

MapTask通过用户编写的RecordReader(自定义的InputFormat方法)或者初始的InputFormat方法(一行一行读TextInputFormat)来获取一个个的key/value键值对

Map阶段

该阶段主要是将解析出的key/value交给用户编写的map()函数进行处理,并通过写出context.write产生新的key/value

Collect收集阶段

在用户编写map()中当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。

溢写阶段

环形缓冲区有一定的大小可以自行设置,环形缓冲区在到达一定界限后会将缓存的内容写到本地磁盘上生成临时文件,默认的界限是百分之八十。界限值也可以自己设置。而在上传之前会先根据分区进行排序,再根据数据分区号按key值,也可以自己定义key值大小排序(重写Compareto方法)进行快排。并且,在环形缓冲区,会朝左边写数据元数据,右边写实际数据,如下图所示

Combine阶段

当所有数据处理完成后,MapTask对所有临时文件进行归并排序,以确保最终只会生成一个有序数据文件。
在归并过程中,会根据分区进行合并,将多个内部有序得分区不断通过归并算法合并在一起形成一个有序大文件
在combine阶段也可进行压缩

让每个MapTask最终只生成一个数据文件,可避免同时打开大量文件和同时读取大量小文件产生的随机读取带来的开销。

ReduceTask

整个ReduceTask分为四个阶段:Copy,Merge,Sort,Reduce

Copy阶段

ReduceTask从每个Maptask上远程拷贝一片数据到内存中,如果内存到了设定的阈值就写到磁盘中,否则直接放内存中

Merge阶段

对内存和磁盘上的数据进行归并排序以生成一个大的有序的文件

Sort

在此阶段即在进入reduce()之前会对所有键值对按照key值进行聚合,相同的key在一起,也可在此进行辅助排序对key的比较进行定义。

reduce阶段

reduce()函数将计算结果写到HDFS上,如果在函数中定义了逻辑,则按照逻辑执行写入

需注意:maptask的数量又切片数决定,但是reducetask的数量却可以自己设置,比如设置为4
具体设置多少能达到最好的性能需要根据实际情况去测试,并不是设置越多越好,大概是一个正态曲线。

1
2
// 默认值是1,手动设置为4
job.setNumReduceTasks(4);

suffle

suffle就是mapreduce流程中map()方法出来到进入reduce()方法之间那一段流程

yarn作业提交全流程

1.客户端调用job.waitForCompletion(Driver末尾写的)方法向整个集群提交mr作业
2.客户端向RM申请一个作业id
3.RM给客户端返回该job资源的提交路径和作业id
4.客户端提交jar包,切片信息,配置文件到指定的资源提交路径
5.客户端提交完资源后向RM申请运行MRAppMaster
6.RM收到客户端的请求后,将job添加到容量调度器中
7.某空闲的NM领取到该job
8.NM创建Container,并产生MRAppmaster
9.下载客户端提交的资源到本地
10.MrAppMaster向RM申请运行切片数对应的MapTask任务资源
11.RM将MT任务分配给其他NM,NM分别领取到任务创建容器
12.MR向接收到任务的NM发送程序启动脚本,NM启动MapTask对数据分区排序
13.MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask
14.RT向MT获取相应分区的数据
15.程序运行完成后MR向RM申请注销自己

关于资源调度器

分为FIFO,容量,公平三种调度器,可自行设置

FIFO

按照job的到达时间进行服务,先到先服务

容量

1.支持多个队列,每个队列有多个job,采用FIFO调度
2.为防止同一个用户的作业独占资源,会对同一用户提交的作业所占资源进行限制
3.首先计算每个队列正在运行的任务数与其应该分得得计算资源之间得比值,选择比值最小的,即最闲得队列
4.其次按照作业优先级和时间顺序同时考虑用户资源限制和内存限制对队列内任务进行排序
5.多个队列并行执行自己队列中的job任务

公平调度器

缺额:一个job理想情况下需要的资源和实际资源得差值
该调度器支持多个队列,每个队列按照job的优先级进行资源分配,优先级与缺值有关,缺值越大优先级越大,同样支持并行运行

任务推测执行

一个作业由若干个Map任务和Reduce任务构成。因硬件老化、软件Bug等,某些任务可能运行非常慢。
此时可通过更改配置开启推测执行
发现拖后腿的任务,比如某个任务运行速度远慢于任务平均速度。为拖后腿任务启动一个备份任务,同时运行。谁先运行完,则采用谁的结果。

推测执行算法原理

假设推测运行时间为imtime,推测执行完时间为imendtime,备份任务执行完时间为imendtime2
当前时刻为cutime,任务启动时刻为stime,任务平均完成时间为avgtime,任务运行比例为progress

则:
imtime = (cutime+stime)/progress

imendtime = imtime+stime

imendtime2 = stime+avgtime

MR总是选择(imendtime-imendtime2)差值最大的任务来开启备份任务
此方法是以空间换时间,在集群资源紧缺时应避免使用

×

纯属好玩

扫码支持
谢谢你

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 写在前面
    1. 1.1. MapTask
      1. 1.1.1. MapTask之前
      2. 1.1.2. Read阶段
      3. 1.1.3. Map阶段
      4. 1.1.4. Collect收集阶段
      5. 1.1.5. 溢写阶段
      6. 1.1.6. Combine阶段
    2. 1.2. ReduceTask
      1. 1.2.1. Copy阶段
      2. 1.2.2. Merge阶段
      3. 1.2.3. Sort
      4. 1.2.4. reduce阶段
    3. 1.3. suffle
    4. 1.4. yarn作业提交全流程
    5. 1.5. 关于资源调度器
      1. 1.5.1. FIFO
      2. 1.5.2. 容量
      3. 1.5.3. 公平调度器
    6. 1.6. 任务推测执行
      1. 1.6.1. 推测执行算法原理
,