MapReduce原理

简介

MapReduce任务过程分为两个处理阶段:map阶段和reduce阶段。每阶段都以键-值对作为输入和输出,其类型由程序员来选择。程序员还需要写两个函数:map函数和reduce函数。

数据流

Hadoop将作业分成若干个任务(task)来执行,其中包括两类任务:map任务和reduce任务。

map阶段

数据划分

Hadoop将MapReduce的输入数据划分成等长的小数据块,称为输入分片(input split)或简称“分片”。Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数,对分片中的每条记录都调用一次map函数。

并行处理

输入数据划分为若干分片后,将这些分片分别在若干台节点上运行以实现对分片的并行处理。

Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳性能,因为它无需进行节点间的数据传输,这就是所谓的“数据本地化优化”。

map的处理过程按照 Partition->sort->combiner->write to disk 的顺序进行

map任务首先根据多个reduce任务将数据均匀的映射到多个reduce中以实现reduce任务的并行和负载均衡(这个过程称为分区【partition】,默认使用hash函数来分区),然后对每个分区中的数据按map任务输出的key进行内存中排序,若有combiner函数,则在排序后的结果上运行,以使map输出结果更紧凑,减少写到磁盘的数据和传递给reduce人的数据。

map输出

map任务将其输出写入本地硬盘,而非HDFS。因为map的输出是中间结果,该中间结果由reduce任务处理后才产生最终输出结果。如果运行map任务的节点在将map中间结果传送给reduce任务之前失败,Hadoop将在另一个节点上重新运行这个map任务以再次构建map中间结果。

reduce阶段

数据输入

reduce任务不具有数据本地化的优势,单个reduce任务的输入通常来自多个mapper的输出。因此,排过序的map输出需通过网络传输发送到运行reduce任务的节点。

数据处理

数据在reduce端合并,维持其map输出的顺序排序。然后由用户自定义的reduce函数处理,对已排序数据的每个键调用reduce函数。

如果有好多个reduce任务,每个map任务就会针对输出进行分区(partition),即为每个reduce任务建一个分区。每个分区有许多键(机器对应的值),但每个键对应的键-值对记录都在同一分区中。分区可由用户定义的分区函数控制,通常默认的partitioner通过哈希函数来分区,很高效。

reduce输出

reduce的输出通常写到HDFS中以实现可靠存储。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值