大数据开发:MapReduce任务流程

2021-01-04 17:58:33 浏览数 (1)

作为Hadoop生态核心组件的MapReduce,是实现大数据计算处理的主要引擎,其核心思想是“分而治之”,简单来说就是分为Map和Reduce两个阶段。今天的大数据开发分享,我们主要来讲讲MapReduce具体的任务流程。

MapReduce的任务流程,简单点来说,先进行数据拆分,一个大的MapReduce作业,会被分解为多个小的Map任务。中间环节,可能会有Combiner会处理Map生成的数据;之后数据到达Partitioner,将中间结果分配到对应的Reducer所在节点上;Reducer会处理中间数据,得到最终的结果。

一、Map阶段

MapReduce接收到数据后,需要对数据进行划分。MapReduce中有一个InputFormat类,它会完成如下三个任务:

验证作业数据的输入形式和格式。

将输入数据分割为若干个逻辑意义上的InputSplit,其中每一个InputSplit都将单独作为Map任务的输入。也就是说,InputSplit的个数,代表了Map任务的个数。需要注意,这里并没有做实际切分,仅仅是将数据进行逻辑上的切分。

提供一个RecordReader,用于将Map的输入转换为若干个记录。虽然MapReduce作业可以接受很多种格式的数据,但是Map任务接收的任务其实是键值对类型的数据,因此需要将初始的输入数据转化为键值对。RecordReader对象会从数据分片中读取出数据记录,然后转化为Key-Value键值对,逐个输入到Map中进行处理。

二、Combiner

Combiner组件在实际运行当中,并非必须存在的部分,通常可以按照实际的需求灵活的添加。Combiner组件的主要作用是减少网络传输负载,优化网络数据传输优化。

当我们Map任务处理完成之后,大文本会变成一个一个的Key-Value对。

在没有Combiner组件前提下,这些键值对会直接传输到Reducer端,进行最后的统计工作。但是这一步是可以优化的,因为Map端仅仅是将每行的词拆分了,但是其实可以再做一步统计的。

设计Combiner时,要保证Combiner的key-value和Map的key-value一致。这也意味着,若你设计的Combiner改变了原先Map的键值对设计,那么你的Combiner设计就是不合法的。

三、Partitioner

为了保证所有主键相同的键值对会传输到同一个Reducer节点,以便Reducer节点可以在不访问其他Reducer节点的情况下就可以计算出最终的结果,我们需要对来自Map(如果有Combiner,就是Combiner之后的结果)中间键值对进行分区处理,Partitioner主要就是进行分区处理的。

Partitioner默认的分发规则

根据key的hashcode%reduce task数来分发,所以:如果要按照我们自己的需求进行分组,则需要改写数据分发(分区)组件Partitioner。

Partition的key value,就是Mapper输出的key value

输入是Map的结果对<key,value>和Reducer的数目,输出则是分配的Reducer(整数编号)。就是指定Mappr输出的键值对到哪一个reducer上去。系统缺省的Partitioner是HashPartitioner,它以key的Hash值对Reducer的数目取模,得到对应的Reducer。这样保证如果有相同的key值,肯定被分配到同一个reducre上。如果有N个reducer,编号就为0,1,2,3……(N-1)。

MapReduce中会将map输出的kv对,按照相同key分组,然后分发给不同的reducetask默认的分发规则为:根据key的hashcode%reduce task数来分发,所以:如果要按照我们自己的需求进行分组,则需要改写数据分发(分组)组件Partitioner,自定义一个CustomPartitioner继承抽象类:Partitioner

Partitioner的执行时机,是在Map输出key-value对之后。

四、Reduce

Reduce处理上游(Map,也可能有Combiner)的中间结果。需要注意的是,Map到Reduce整个过程中,键值的变化是不一样的:

初始是文本内容,会被RecordReader处理为键值对<key-value>;

经过Map(也可能有Combiner)后,仍然是键值对形式<key-value>;

经过Partition,到达Reduce的结果是key-list(value)形式,所以在Reduce处理的value其实一个整体;

Reduce会把所有的结果处理完成,输出到对应的输出路径。

关于大数据开发,MapReduce任务流程,以上就为大家做了简单的介绍了。MapReduce在Hadoop生态当中,是重要的数据处理指导思想,理解了MapReduce,对于后续的Spark计算引擎的学习,也有指导意义。

0 人点赞