MapReduce原理(MR1)


1.Map负责将数据打散,Reduce负责对数据进行聚集。

2.MapReduce也采用了Master/Slave结构。Master叫做JobTracker而Slave叫做TaskTracker。用户提交的计算叫做Job,而每一个Job会被划分为若干个Tasks。JobTracker负责Job和Tasks的调度,而TaskTracker负责执行Tasks。

3.向MapReduce 提交作业时,它会首先把计算作业拆分为若干个Map任务,然后分配到不同的节点上去执行,每一个Map任务处理输入数据中的一部分,当Map任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce任务的输入数据。Reduce任务的主要目标就是把前面若干个Map的输出汇总到一起并输出
4.MapReduce的核心过程--Shuffle和Sort。
5.Shuffle是指从Map产出输出开始,包括包括系统执行排序以及传送Map输出到Reducer作为输入的过程。
6.Map产生输出的时候并不是简单的把数据写到磁盘,因为频繁的操作会导致性能的严重下降。它是把数据首先写到内存中的一个缓冲区,并作一些排序,以提升效率。每一个Map任务都有一个用来写入输出数据的循环内存缓冲区,这个缓冲区的默认大小是100M,可以通过io.sort.mb属性来设置具体的大小,当缓冲区中的数据量达到一个特定的阈值(默认为0.8)时,系统将会启动一个后台进程把缓冲区中的内容spill到磁盘。在spill过程中,Map的输出将会继续写入到缓冲区,但如果缓冲区已经满了,Map将会被阻塞直到spill完成。spill线程在把缓冲区的数据写到磁盘前,会对他进行一个二次排序,首先根据数据所属的partition排序,然后每个partition中再按Key排序。输出包括一个索引文件数据文件如果设定了Combiner,将在排序输出的基础上进行。Combiner就是一个Mini Reducer,它在执行Map任务的节点本身运行,先对Map的输出作一次简单的Reduce,使得Map的输出更加紧凑,更少的数据会被写入到磁盘和传送到Reducer。Spill文件保存在由mapred.local.dir指定的目录中,Map任务结束后删除。
每当内存中的数据达到spill阈值的时候,都会产生一个新的spill文件,在Map任务完成前,所有的spill文件将会被归并排序为一个索引文件和数据文件。这是一个多路归并过程,最大归并数由io.sort.factor控制(默认是10)。如果设定了Combiner,并且spill文件的数量至少是3(由min.num.spills.for.combine属性控制),那么Combiner将会在输出文件被写入到磁盘前运行以压缩数据。
    对写入到磁盘的数据进行压缩(这种压缩同Combiner的压缩不一样)通常是一个很好的方法,默认输出是不被压缩的,但可以很简单的设置mapred.compress.map.output为true启用该功能。压缩所使用的库由mapred.map.output.compression.codec来设定。
    当spill文件归并完毕后,Map将删除所有的临时spill文件,并告知TaskTracker任务已经完成。Reducers通过Http来获取对应的数据。用来传输partitions数据的工作线程个数由tasktracker.http.threads控制,这个设定是针对每一个TaskTracker的,并不是单个Map,默认值为40,在运行大作业的大集群上可以增大以提升数据传输速率。
      Map的输出文件放置在运行Map任务的TaskTracker的本地磁盘上(Map输出总是写到本地磁盘,但是Reduce输出不是,一般是写到HDFS),它是运行Reduce任务的TaskTracker所需要的输入数据。Reduce任务的输入数据分布在集群内的多个Map任务的输出中,Map任务可能会在不同的时间内完成,只要有其中一个Map任务完成,Reduce任务就会开始拷贝它的输出。这个阶段称为拷贝阶段,Reduce任务拥有多个拷贝线程,可以并行的获取Map输出。通过设定mapred.reduce.parallel.copies来改变线程数。
    Reduce如何知道哪些TaskTrackers中获取Map的输出呢?当Map任务完成之后,会通知他们的父Tasktracker,告知状态更新,然后TaskTracker再转告JobTracker,这些通知信息是通过心跳通信机制传输的,因此针对以一个特定的作业,jobtracker知道Map输出与tasktrackers的映射关系。Reducer中有一个线程会间歇的向JobTracker询问Map输出的地址,直到所有的数据都取到。在Reducer取走了Map输出之后,TaskTracker不会立即删除这些数据,因为Reducer可能会失败,他们会在整个作业完成之后,JobTracker告知他们要删除的时候才去删除。如果Map输出足够小,他们会被拷贝到Reduce TaskTracker的内存中(缓冲区的大小有mapred.job.shuffle.input.buffer.percnet控制),或者达到了Map输出的阈值大小(由mapred.inmem,merge.threshold控制),缓冲区中的数据将会被归并然后spill到磁盘。
    拷贝来的数据叠加在磁盘上,有一个人后台线程会将它们归并为更大的排序文件,这样节省了后台归并的时间。对于经过压缩的Map输出,系统会自动把它们解压到内存方便对其执行归并。
    当所有的Map输出都被拷贝后,Reduce任务进入排序阶段(更恰当的说法是归并阶段,因为排序在Map端已经完成),这个阶段会对所有的Map输出进行归并排序,这个工作会重复多次才能完成。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值