本笔记主要总结记录2.4节 横向扩展。

本小结简单介绍了Hadoop中MapReduce的执行流程,即对数据流的处理过程,和多map对应多reduce的情况。

数据流

Mapduce主要分成一下五步:
1. MapReeduce作业(job) :客户端需要执行的一个工作单元,包括输入数据、MapReduce程序和配置信息。其主要分为两大类任务:map任务和reduce任务,这些任务运行在集群节点上,由yarn调度。
2. 输入分片(input spilt):简称分片,Hadoop将MapReduce输入数据分成等长小数据块即分片,并为每片构建一个map任务。默认分片大小最好HDFS的一个块的大小,一般为128MB。
3. 在存储输入数据(HDFS中的数据)的节点上运行map任务,因为这样减少不同节点间的数据传输,节约带宽资源,叫做“数据本地优化“(data locality optimization)。如果一个map任务的所有HDFS副本存在的节点都不空闲,则需要其他节点运行该任务,这样是无法实现“数据本地优化“的;
4. map将其输入写入本地硬盘而非HDFS。因为map的输入为中间结果,一旦作业完成,中间结果可以被删除,因此如果存在HDFS上有些小题大做;
5. reduce的输入通常来自所有mapper的输出,因此不具有“数据本地化“优势,reduce的输出通常存储在HDFS中以实现可靠存储;

备注:HDFS为Hadoop分布式文件系统(Hadoop Distribute File System),其将数据备份多次存储在不同节点,和本地硬盘相比有更高的稳定性但同时代价更大。因此在第4步中才说对于中间结果存储在HDFS上有些小题大做。


多map与多reduce

每个mao任务回针对输出进行分区(partition),即为每个reduce任务建立一个分区。分区通常使用默认的partitioner通过哈希函数分区, 也可以用户用分区函数定义分区规则。

查看mapreduce作业使用的资源 mapreduce作业主要包括_查看mapreduce作业使用的资源


图1 多map单reduce

查看mapreduce作业使用的资源 mapreduce作业主要包括_Hadoop_02


图2 多map多reduce

这也是map任务和reduce任务之间的数据流成为混洗(shuffle)的原因。当数据可完全并行时,会出现无reduce的情况。

查看mapreduce作业使用的资源 mapreduce作业主要包括_HDFS_03


图3 无reduce


combiner函数

在每个节点的map之后执行,节约map和reduce之间的数据传输量。当然也受制于可用的函数类型。
比如在[12,4,90,23,12,9]中找到最大值。假设该Hadoop有两个节点,两个map分别为[12, 4, 90]和[23,12,9],如果不做combiner则共传输6个数字,但若在每个map后执行combiner,传输该map中的最大值就可以将数据量减少到2个数字。当然可以看出,如果是求平均值则无法简单调用combiner 。


结语

本章简单介绍了Hadoop的流程,对应《Hadoop权威指南》2.4节 横向扩展,有兴趣的朋友可阅读原文。