以wordcount为例详解shuffle过程

本文详细介绍了Hadoop中shuffle的过程,包括map任务的内存缓冲区、溢写、排序、合并以及reduce任务的拉取、合并和归并。shuffle是MapReduce的核心,通过内存与磁盘的高效交互,确保数据正确分发到reduce任务,实现负载均衡和数据优化。
摘要由CSDN通过智能技术生成

在hadoop中,大部分的map task和reduce task是在不同节点上执行的,reduce常常需要从其他节点上拉map task的结果,同时还要考虑传输数据的速率,我们是要把数据存放在内存还是写到磁盘中?内存当然比磁盘快得多。所以shuffle应该是这样的:

1.完整地从map task 端拉取数据到reduce 端(拉取前先筛选)

2.在跨节点拉取数据时,减少对带宽的消耗(靠近数据源)

3.减少磁盘IO对task执行的影响(尽量用内存)

官方描述:In many ways,the shuffle is the heart of MapReduce and is where the 'magic' happens:



为了尽量使用内存快速读取数据,每个map task都有一个内存缓冲区,存储着map的输出,当缓冲区快满时就将其包成一个临时文件放到磁盘,整个map task结束后再对产生的所有临时文件做合并(combiner),生成最终的正式输出文件,然后把数据给reduce task:


1.HDFS有两种分块,一个是把File分成block,这是在物理上进行数据块划分,配置选项为hadoop-default.xml;第二种分块是逻辑上的划分,block和split的区别参见hadoop block split 区别,总之在进行map task时,其输入的数据input split来源于block,map task个数取决于split长度,比如用户指定了20个map task,但实际的split长度只有5,则只会有5个map task。在wordcount例中,map的输入就是“aaa”这样的字符串。

2.我们知道,mapper处理后的输出时key/value这样的键值对,“aaa”为键,计数的“1”是value,而reduce task不止一个,我们要把数据传到哪一个那里去执行合并操作?Patririoner接口就是干这个活的,默认对key Hash后,以reduce数量取模,主要是为了平均reduce的处理能力,达到负载均衡。决定去哪之后,数据就被写入map task的内存缓冲区,缓冲区是为了批量收集map 结果,减少磁盘IO的影响,当然了,在写入之前key 和value都会被序列化成字节数组。

3.内存缓冲区默认大小100MB,若输入数据达到阈值(一般来说是80%),就会开启单独的溢写进程,把这些数据临时写入磁盘中。溢写开始时会开始对数据进行sort(排序),即对序列化的字节排序:排序的一个重要细节在于,若很多key/value对需要发送到某个reduce端,则他们被拼接到一起。比如“aaa”/1、“aaa”/1这样的键值对,我们就应该把它们的值合在一起,成为“aaa”/2

,这个过程即combine。这个combiner是可以用户设置的,可以做累加、取最值等操作,它被用于减少溢写到磁盘的数据量,对map task的中间结果进行优化,并将结果作为reduuce task的输出。

4.当map task结束时,内存缓冲区内的文件即使不到80%,也会成为一个溢写文件。这里会将溢写文件归并到一起(减少输出),这个过程即为merge.在wordcount中,map task1的“aaa/5”,map task2的“aaa/1”会被merge成一个group,{“aaa”,[5,1,2,3...]},group中的值就是从不同溢写文件中读取出来的,在这里又会做一个combine,比如wordcount,这里又会将“aaa”的value合并(仍然没有计数)。

至此map端工作结束,reduce task不断地通过rpc从jobtracker获取map task是否完成,如果获知某台tasktracker上的map task完成,shuffle的后半段即开始启动。

5.copy过程,其实就是拉数据,通过http请求map task 所在的tasktracker输出本地磁盘上的临时文件。

6.merge过程,把不同map端copy来的值进行归并,copy来的值也会先放入内存缓冲区。值得一提的是,reduce端的内存缓冲区大小更灵活,应该设置尽量多的容量来做shuffle。内存快满时,也会溢写到磁盘上,这个过程同样有combiner,一直到map端的数据传输完毕,然后启动磁盘到磁盘的merge。

7.不断merge后会生成一个最终文件,该文件即作为reducer的输入,可以给reducer做计数统计了。默认情况下,该文件时放在磁盘里的,但通过性能优化也可以出现在内存中,这里不谈优化。当reducer的输入文件确定,shuffle过程就结束了,之后就是reducer的执行,把结果放到HDFS上,我们也就可以看到wordcount程序计算出file1,file2中各个单词出现的次数了。


至此,以wordcount为例的shuffle详解结束,感谢博主MapReduce:详解shuffle,受益匪浅~




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值