1、MR执行流程
作业的提交
1)启动客户端Client,运行Job;
2)客户端向资源管理器(ResourceManager)提交任务,请求一个新的ID号;
3)客户端将Job所需的资源发送给HDFS;
4)客户端向RM提交作业;
作业的初始化
5)RM将作业请求发送给Yarn调度器(Scheduler),调度器给作业分配容器,然后在该容器中启动Application Master;
6)NodeManager接受任务的进度和完成报告;
7)Application Master接受来自HDFS的在客户端计算的输入分片;
作业的分配
8)在执行过程中,若有不合适的容器,便会再次向ResourceManager申请容器;
作业的执行
9)启动容器;
10)从HDFS中读取Job需要的作业的配置、JAR文件、文件等资源,即资源本地化;
11)运行MR;
进度和状态的更新
作业的完成
作业完成后,会把作业的状态设置为“成功”
2、Partition的作用
分区操作时shuffle中的重要的一个过程,作用就是将Map端的结果按照指定的规则分发到不同Reduce端进行处理,默认是使用hash计算分区,但是也可以自行定义分区规则。
3、Combiner的作用
在Map中可能产生大量的结果,让Reduce直接去读取Map产生的结果会导致网络带宽增高,为此,可以再Map端进行Combiner操作,Combiner实际上就是运行在Map端的Reducer操作,这样,可以减少带宽的使用。
(以下红色部分是微博易的一位很好的大哥告诉我的,非常感谢)
请记住:符合交换律和结合律的可以使用Combiner进行减少带宽压力,
例如:a+b+c+d,无论怎么交换顺序,结果不会改变;而
什么时候运行Combiner?
1、当job设置了Combiner,并且spill的个数到min.num.spill.for.combine(默认是3)的时候,那么combiner就会Merge之前执行;
2、但是有的情况下,Merge开始执行,但spill文件的个数没有达到需求,这个时候Combiner可能会在Merge之后执行;
3、Combiner也有可能不运行,Combiner会考虑当时集群的一个负载情况。如果集群负载量很大,会尽量提早执行完map,空出资源,所以,就不会去执行。
---------------------
作者:李国冬
来源:CSDN
原文:https://blog.csdn.net/scgaliguodong123_/article/details/46483455
版权声明:本文为博主原创文章,转载请附上博文链接!
4、Shuffle过程
分为map端和reduce端
map端:
每个mapper任务都有一个环形的内存缓冲区,用于存储map任务的输出,默认是100MB,一旦达到阈值0.8,后台线程就把内容溢写(spill)到磁盘指定目录下生成新的溢写文件;
写磁盘前,要进行分区(Partition),每个分区中排序(Sort),排序后合并(Combiner);在写磁盘时,还会进行任务的输出,此时可能导致两种情况:要不就是磁盘写出已完成,不会影响到后续任务的输出;要不磁盘写出未完成,导致mapper阻塞;
等全部记录写完后,合并所有的溢出文件,若被合并后的文件个数大于等于设定值(默认为3),则再次合并,直到小于设定值。
reduce端:
Reduce主动去找自己负责的分区的数据;
复制来自多个Mapper的数据后进行merge合并操作,合并后,进行分组、排序;
在reducer中进行处理上述的数据结果,并将最终结果输出到指定目录
扩展:
mapper一般执行输入格式解析、投影(选择相关的字段)和过滤(去掉无关记录)
给张剖析MapReduce作业运行机制的图(摘录自《Hadoop权威指南》)