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任务个数(这样可以预留一些系统资源处理可能发生的错误)

posted on 2017-06-28 19:56  ostin  阅读(828)  评论(0)    收藏  举报