MapReduce之数据流
MapReduce作业是客户端需要执行的衣蛾工作单元,它包括输入数据、MapReduce程序和配置信息。Hadoop将作业分成若干个任务来执行,包括map任务和reduce任务。这些任务运行在集群的节点上,并通过YARN进行调度。
分片
Hadoop将MapReduce的输入数据划分成等长的小数据块,称为输入分片(input split
)。Hadoop为每个分片构建一个map任务,并由该任务来运行用户定义的map函数从而处理分片中的每条记录。
对于大多数作业而言,一个合理的分片大小趋向于HDFS一个块的大小,默认是128MB。
map
Hadoop在存储有输入数据的节点上运行map任务,可以避免使用集群带宽资源,提高性能(数据本地化优化data locality optimization
)。
map任务将其输出写入本地磁盘而非HDFS。因为map的输出是中间结果,一旦作业完成,map的结果就可以删除。如果运行map任务的节点在将map中间结果传送给reduce任务之前失败,Hadoop将在另一个节点上重新运行这个map任务以再次构建map中间结果。
reduce
reduce任务并不具备数据本地化的优势,单个reduce任务的输入通常来自于所有的mapper的输出。数据在reduce端合并,然后由用户定义的reduce函数处理。reduce输出的结果通常存储在HDFS上。
reduce任务的数量并非由输入数据的大小决定,而是独立指定的。
如果有多个reduce任务,每个map任务就会针对输出进行分区,即为每个reduce任务建一个分区。每个分区有许多键(及其对应的值),但每个键对应的键-值对记录都在同一分区中。默认通过哈希函数分区。
- 一个reduce任务的MapReduce数据流
- 多个reduce任务的MapReduce数据流
- 当数据处理完全并行,无需shuffle
combiner函数
集群上的可用带宽限制了MapReduce作业的数量,因此避免map和reduce任务之间的数据传输是有利的。Hadoop允许用户针对map任务的输出指定一个combiner,其输出作为reduce函数的输入。
combiner属于优化方案,所以Hadoop无法确定要对一个指定的map任务输出记录调用多少次combiner。不管调用多少次,reduce的结果都是一样的。