MapReduce的优化组件和Shuffle阶段

    技术2022-07-10  133

    优化组件Combiner、Partitioner和Shuffle阶段

    1、Combiner类2、Partitioner类3、Shuffle阶段3.1、Map端的Shuffle3.2、Reduce端的Shuffle

    1、Combiner类

    Combiner类是用来优化MapReduce的,它可以提高MapReduce的运行效率。在MapReduce作业运行过程中,通常每一个Map都会产生大量的本地输出,Combiner的作用就是在Map端对输出结果先做一次合并,以减少传输到Reduce端的数据量。 Combiner并没有自己的基类,而是继承Reduce,它们对外的功能是一样的,只是使用的位置和使用的上下文不太一样,Combiner操作发生在Map端。Combiner并不会影响原有的逻辑,也就是不影响最后的运行结果,它影响的只是效率。

    2、Partitioner类

    前面提到使用Combiner类是可以提升MapReduce作业的执行效率,本次介绍MapReduce的另一个优化组件–>Partitioner类。 Partitioner的功能是在Map端对key进行分区。Map端最终处理的键值对(<key,value>对)需要发送到Reduce端去合并,合并的时候,相同分区的键值对(<key,value>对)会分配到同一个Reduce上,这个分配过程就是由Partitioner(分区)决定的。 MapReduce默认的Partitioner是HashPartitioner。其计算方法如下:

    Partitioner先计算key的散列值(通常是MD5值)。通过Reduce个数执行取模运算:Key.hashCode%numReduce。

    3、Shuffle阶段

    它的大致处理过程就是把Map任务的输出结果有效地传送到Reduce端,也可以理解为Shuffle就是描述数据从Map任务输出到Reduce任务输入的这段过程。Shuffle阶段包括Map端的Shuffle和Reduce段的Shuffle。

    3.1、Map端的Shuffle

    MapReduce提交作业时,Map端的Shuffle过程如下: (1)拆分。InputSplit将作业拆分成若干个Map任务。 (2)执行自定义map()方法。Map过程开始处理,Mapper任务会接受输入分片,通过不断地调用map()方法对数据进行处理。处理完毕后,转换为新的<key,value>对输出。 (3)缓存。Map端的输出结果先写到内存中的一个缓冲区。 (4)分区(Partitioner)。在内存中进行分区,默认是HashPartitioner,目的是将Map端的结果分给不同的Reduce。 (5)排序。分区结束后,针对不同分区的数据,会按照key进行排序,要求key必须实现WritableComparable接口。 (6)分组。排序后的数据按key进行分组,将相同key的<key,value>对分到一个组中,最终,每个分组将会调用一次reduce()方法。 (7)合并(Combiner)。排序分组后,相同key的数据组成一个列表,如果设置了Combiner,就合并数据,可以减少写入磁盘的记录数。 (8)溢写(spill)。当内存中的数据达到一个特定的阈值时,系统会自动将记录溢写到磁盘中,形成一个spill文件。 (9)合并文件(Merge)。Map过程结束时会把溢写出来的多个文件合并一个。Merge过程最多将10个(默认)文件同时合并成一个文件,多余的文件将分多次合并。 经过上面的流程,Map端Shuffle过程完毕,数据都有序地存放在磁盘里,等待Reduce去拉取数据。

    3.2、Reduce端的Shuffle

    Reduce在执行前,都是重复地拉取数据合并,Reduce端的Shuffle过程如下: (1)复制过程。Reduce端启动一些数据复制线程(Fetcher),通过HTTP方式请求获取Map任务的输出文件。 (2)合并阶段。这里的合并与Map端的合并类似,只是处理的数据是从不同Map端复制过来的。 (3)Reduce的输入文件。经过不断地合并后,生成一个最终文件,当Reduce的输入文件已定,整个Shuffle过程才最终结束,然后就由Reduce执行,把结果放到HDFS上。

    ps:上文提到MapReduce核心思想及其运行流程介绍 ps:望多多支持,后续更新中。。。

    Processed: 0.013, SQL: 9