Hadoop MapReduce Shuffle and Sort

Hadoop 确保每个reduce 的输入都是按 key 排序的。系统执行排序的过程称为shuffle.

Map 端, map 产生输出时,并不是简单的把数据写到磁盘。会先缓冲在内存中,并进行一些预排序。
每个map 任务都有一个环形内存缓冲区,默认为 100M,通过 io.sort.mb设置,一旦缓冲区内容达到80%( io.sort.spill.percent,设置为0.80),后台线程会把内容写到磁盘中。

输出会写到由  mapred.local.dir  设置的目录中。

在数据被写入磁盘之前,会 根据reduce数目 进行分区(partitions)动作。在每个分区中,进行排序,然后运行 combiner,减少写到磁盘中的数据。

一旦内存缓冲区达到输出限制,会新建一个溢出写文件,在map任务完成前,会有几个 溢出写文件。多个 溢出写文件会被合并成一个已分区且已排序的输出文件。 默认一次合并10个文件,通过   io.sort.factor设置。

如果剩下多于3个溢出文件(通过 min.num.spills.for.combine设置 ),会再运行一次 combiner

可以 对map输出压缩,设置 mapred.compress.map.output 和  mapred.map.output.compression.codec 属性。

Reduce端,map 输出文件位于运行map任务的tasktracker的本地磁盘。reduce 任务需要集群上若干个map 任务的输出。

只要有一个map任务完成,reduce任务就开始复制输出。reduce有多个复制线程可以并行运行。可以通过  mapred.reduce.parallel.copies  设置并行复制线程数,默认为 5.

如果 map 输出小于   mapred.job.shuffle.input.buffer.percent  设置 JVM heap大小,就会被复制到 reduce tasktracker 的内存中,否则被复制到磁盘中。如果内存占用达到  mapred.job.shuffle.merge.percent  定义或复制的 map 输出数达到  mapred.inmem.merge.threshold  ,就会合并到磁盘,会 运行   combiner, 减少写到磁盘中的数据。

当所有 map 输出都被复制完后,reduce 进入 sort 阶段。在这个阶段,根据  io.sort.factor定义的合并因子,进行循环处理。例如合并因子设置为10(默认),有50个map 输出,会进行5次合并,每次合并10个map 输出,做后会得到5个中间文件, 最后把5个中间文件 传递给reduce 函数.

转载于:https://my.oschina.net/Yaland/blog/424912

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值