Hadoop笔记之shuffle工作流程图及其原理分析

Map函数开始产生输出时,并不是简单地将数据写到本地磁盘,这个过程很复杂,他利用缓冲的方式写到内存,并出于效率的考虑进行与排序

与其说shuffle为mapreduce之间的独立处理函数 不如说是map中数据输入reduce一通道,因为shuffle一部分属于对map task  另一部分为reduce task

名词翻译:

input split  输入流切分                      buffer  in memory  缓冲区存储器                       partition  划分                                 sort  排序                            

spill  to  disk   溢出到磁盘                fetch  取出                                                               merge合并                                     merge on disk 合并到磁盘上

map  task 

    每个 map 任务都有一个环形内存缓冲区,用于存储任务的输出,一旦缓冲内容达到域值(默认值缓冲区大小的80%即80MB),一个后台线程便开始把内容写到(spill)本地磁盘中。在写磁盘过程中, map 输出继续被写到缓冲区,但如果在此期间缓冲区被填满,map 会阻塞直到写磁盘过程完成。在写磁盘之前, 线程首先根据数据最终要传送到的 reducer 把数据划分成相应的分区(partition)。在每个分区中,后台线程按键进行内排序,如果有一个 combiner,它会在排序后的输出上运行。

   一旦内存缓冲区达到溢出域值,就会新建一个溢出写文件,因此在 map 任务写完其最后一个输出记录之后,会有几个溢出写文件。在任务完成之前,溢出写文件被合并成一个已分区且已排序的输出文件。

         如果已经指定 combiner,并且溢出写次数至少为 3时,则 combiner 就会在输出文件写到磁盘之前运行。运行 combiner 的意义在于使 map 输出更紧凑,使得写到本地磁盘和传给 reducer 的数据更少。


    写磁盘时压缩 map 输出往往常用方法,因为这样会让写磁盘的速度更快,节约磁盘空间,并且减少侍给 reducer 的数据量。默认情况下,输出是不压缩的,但只要将mapred.compress.map.output 设置为 true,就可以轻松启用此功能。使用的压缩库由 mapred。map. output. compression. codec 指定.


       通过 HTTP 方式得到输出文件的分区。用于文件分区的工作线程的数量由任务的 tracker. http。 threads 属性控制,此设置针对每个tasktracker,而不是针对每个 map 任务槽。默认值是 40,在运行大型作业的大型集群上,此值可以根据需要而增加。


reduce  task


由上图之,map task合并的磁盘分区分别被多个reduce处理,而一个reduce处理多个map产生的数据,即是多对多关系

reduce合并来自多个map的磁盘中数据



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值