10 shuffle调优原理概述-性能优化

什么的情况下会发生shuffle?
在spark中,最主要是以下几个算子:groupByKey,reduceByKey,countByKey ,join等
什么是shuffle?
groupBykey ,把分布在集群各个节点上的数据中,同一个key,对应的values,都给集中到一块,集中到集群中的同一个节点,更严密的一点说,就是集中到一个节点的一个executor的一个task中。
然后呢,集中一个key对应的values之后,才能交给我们来进行处理,<key,iterable<value>>;
reduceByKey算子函数去对values集合进行reduce操作,最后变成一个value;
countByKey需要在一个task中,获取到一个key对应的所有Value,然后进行计数,统计总共有多少个value。
join操作RDD<key,value>,Rdd<key,value>只要是两个rdd中,key相同,对应2个value,能到一个节点的executor的task中,给我们进行处理。

每一个shuffle的前半部分stage的task,每一个task都会创建下一个stage的task数量相同的文件,比如下一个stage会有100个task,那么当前的stage每个task都会创建100份文件;会将同一个key对应的values,一定是写入同一个文件中的;不同节点上的task,也一定会将同一个key对应的values写入下一个stage,同一个task对应的文件中
shuffle的后半部分stage的task,每个task都会从各个节点上的task写的属于自己的那一份文件中,拉去key,value对,然后task会有一个内存缓冲区,然后利用hashmap,进行key,value的汇聚,生成(key,value)的对,task会用我们自己定义的聚合函数,比如reduceByKey(_+_),把所有的value进行一对一的累加,聚合出来最终的值,完成了shuffle。

shuffle一定是分为两个stage完成的,因为这其实是一个逆向过程,不是stage决定shuffle,是shuffle决定stage。
reduceByKey(_+_)在某个action触发job的时候,DAGScheduler会负责划分job为多个stage,划分的依据就是如果发现会有触发shuffle操作的算子,比如reduceByKey,就将这个操作的前半部分以及之前所有rdd的transformation操作划分为一个stage;shuffle操作的后半部分以及后面的transformation,直到shuffle算子或者action划分为另一个stage。

shuffle前半部分的task在写入数据到磁盘文件之前,都会先输入到内存缓存中,内存缓存溢满之后,在spill溢写到磁盘文件中。

2018/03/12 13:31

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值