MapReduce工作流程
一、工作流程概述
待处理的大数据存储于HDFS中,被分成多个分片Split,每个分片由一个Map任务处理,这样可并行处理海量数据。
Map输出分区的数量取决于Reduce任务的数量。
每个Map任务的每个分区都要经过Shuffle处理(对Map的输出进行排序、合并,生成<key, value-list>)后分发给每个Reduce任务进行并行处理。

不同的Map任务之间不会进行通信
不同的Reduce任务之间也不会发生任何信息交换
用户不能显式地从一台机器向另一台机器发送消息
所有的数据交换都是通过MapReduce框架自身去实现的
二、MapReduce各个执行阶段

大的文件存放在HDFS中,可能存放在多个数据节点上。可通过HDFS客户端读取文件。
1、InputFormat(输入格式化):
(1)从HDFS中读取待处理文件,对读取的文件进行格式验证;
(2)对大的文件切分为多个分片Split(只是逻辑上的切分,不是物理切分)。
2、Split(分片):
文件的逻辑分片。InputFormat分片后,会确定每个分片的起始位置和长度。分片可以跨越多个HDFS数据块

HDFS 以固定大小的block 为基本单位存储数据,而对于MapReduce 而言,其处理单位是split。split 是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。
3、RecordReader:
RR,记录阅读器,依据分片的起始位置和长度从HDFS读取分片数据。以<key, value>的形式输出。
4、Map:
用户自己编写Map函数,处理RR输出的原始键值对<key, value>。
Map输出中间结果键值对<key, value>。
5、Shuffle(洗牌):
对Map输出的中间结果键值对<key, value>进行分区、排序、合并;
Shuffle会把中间结果键值对中相同key的键值对合并,输出<key,value-List>键值对
然后把<key,value-List>键值对对分发给Reduce任务处理
6、Reduce:
用户自己编写Reduce函数,处理Shuffle输出的<key,value-List>键值;
输出<key, value>键值对
7、OutputFormat:
对Reduce输出<key, value>键值对进行格式检查;
检查HDFS中输出结果目录是否存在;
把Reduce输出<key, value>键值对写入到HDFS中。
8、Map任务数量
Map任务数量取决于分片数量。
分片数量太大,Map就非常大,影响Map任务的频繁调度资源。分片数量太小,会降低了并行处理效率。
不同的数据块可能存放在不同的数据节点中。
大多数情况下,理想的分片大小是一个HDFS块(64或128M)。这样Map任务就运行在分片对应的HDFS块所在的节点,可避免从其他节点读取数据,节省带宽和时间。
9、Reduce任务的数量
最优的Reduce任务个数取决于集群中可用的reduce任务槽(slot)的数目
通常设置比reduce任务槽数目稍微小一些的Reduce任务个数(这样可以预留一些系统资源处理可能发生的错误)
浙公网安备 33010602011771号