赞
踩
Hadoop 2.x
开始,必须要结合yarn去学习client:负责提交MR作业
Resource Manager
Node Manager
Application master
分布式文件系统(一般为HDFS):在其他实体间共享作业文件
调用Job的submit()
方法,提交一个MR作业。实质上,submit()
方法会创建一个Submitter
实例,并其submitJobInternal()
提交作业。
作业提交后,waitForComletion()
方法每隔一秒会轮询作业的状态,当作业失败或成功时,会退出该方法
对应图中的步骤1
Submitter
实例向Resource Manager申请一个新的Application ID
对应图中的步骤2
Submitter会检查输出说明: 如果没有指定输出目录或输出目录已经存在,则不提交作业
Submitter计算作业的输入split: 如果输入split无法计算,如输入目录不存在,则不提交作业
submitter负责将作业运行所需的资源拷贝到以job ID
命名的共享目录下,包括jar文件、配置文件、计算所得的输入split
对应图中的步骤3
Submitter调用Resource Manager的submitApplication()
方法,向yarn提交一个Application
对应图中的步骤4
Resource Manager中的scheduler为Application master分配一个容器
在Resource Manger的指令下,Node Manager启动该容器并运行Application master,其主类是MRAppMaster
对应图中的步骤5
Application master初始化作业:创建多个簿记对象以保持对作业进度的跟踪
对应图中的步骤6
Application master接收共享目录中的、计算出的输入split,创建对应数量的map任务。同时,也根据设置创建确定数量的reduce任务
对应图中的步骤7
接下来,Application master需要根据作业的大小决定是否需要向Resource Manager申请container以运行map或reducer任务
(1)如果任务可以与Application master在同一个JVM中运行:其开销小于为这些任务单独申请container并运行的开销 —— 这样的作业称为uberized
(2)任务无法与Application master在同一个JVM中运行,则向Resource Manager为所有的map任务和reduce任务申请container
(3)container的请求顺序:首先为map任务请求container,且其优先级高于reduce任务的优先级。
(4) 实际上,直到有5%的map任务运行完成,reduce任务的资源请求才会发出
对应图中的步骤8
一旦scheduler分配好了container,则Application master会与container所在的Node Manager建立通信,以启动container,从而运行任务
对应图中的步骤9
任务的运行是由名为YarnChild
的主类来执行的,YarnChild
首先会将任务所需资源本地化(jar包、作业配置、输入数据等),然后再运行具体的map任务或reduce任务
对应图中的步骤10和11
任务进度和状态的更新
umbilical
接口向Application master上报自身进度和状态getStatus()
方法获取JobStatus
实例,它包含作业的所有状态信息作业执行完成
成功
waitForCompletion()
轮询时,发现作业已完成,退出执行task失败,实际是task attempt失败,有两种情况
failed
并释放其占用的containertask挂起
umbilical
接口,每隔三秒向Application master报告任务进度和状态以上三种情况,都会认为task失败
maxattempts
属性,控制其最多尝试次数maxattempts
的默认值为4,当任务失败4次后,则不会再失败重启。这意味着,整个MR作业失败特殊情况
killed
)task attempt,则任务会被标记为killed
。maxattempts
一样,Application master也有自己的最大尝试次数,默认为2Application master的失败与恢复
Node Manager失败的处理
Resource Manger在HA下的失败处理
Resource Manager的状态区,需要存储的信息相对MR的jobtracker非常少:
灵魂
每个map任务都有一个环形的缓冲区,一般为100 MB
,用于缓存map任务的输出。
数据写入缓冲区前,会按照reduce任务的个数计算其对应的分区编号,存入元数据中
当缓存内容达到设定的阈值,一般为
80
%
80\%
80%,即80 MB
时,会将缓冲区中的内容溢写到磁盘。
对应图中,map端的spill操作
将数据溢写到磁盘前,会按照数据的分区编号,将相同分区的数据合并到一起
对应图中,map端的partition操作
针对同一分区的数据,会对其按照key进行排序。
如果存在combiner函数,还会对排序后的结果进行处理,时map任务的输出更紧凑
对应图中,map端的sort操作
直到map任务结束,一般会产生多个溢写文件。
这些溢写文件会合并成一个大的的输出文件,这个输出文件是已经分区且排序的文件
如果溢写文件超过3个(该值可以设置),combiner函数会在溢写文件合并到磁盘前,再次执行combine操作
对应图中,map端的merge on disk 操作
reduce任务通过HTTP从多个map输出中获取对应分区的数据,这也就是reduce任务的复制阶段。
reduce任务存在少量的copy线程,可以实现分区的并行复制
reduce任务如何知道map输出地址的?
① map任务通过心跳告知Application master
,map输出与主机之间的映射关系址。
② reduce任务存在一个线程,定期询问Application master,以获取map输出的地址
对应图中,reduce端的copy阶段
reduce任务将从不同map输出获取到的分区进行排序,准确的说是合并。这也就是reduce任务的排序阶段
排序阶段,会将多个map输出进行合并,直到产生一个reduce输入。
如果有50个map输出,合并因子为10,则每次合并10个map输出,最终产生5个中间文件
注意:map输出个数和合并因子的比值,并非一定是合并次数。
例如,40个map输出,可以使用5次合并,最后一次的合并来自磁盘和内存
对应图中,reduce端的sort阶段
结合yarn,描述MR任务的具体工作流程
waitForCompletion()
轮询作业状态,作业失败或成功,退出该方法submitApplication()
方法,向yarn提交一个applicationMRAppMaster
YarnChild
中运行,YarnChild
会先从共享目录获取资源,然后再执行任务MR任务再运行过程中,可能出现的各种失败情况
关于shuffle
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。