shuffle原理

main
Oeljeklaus 7 years ago committed by GitHub
parent 852bdc309a
commit a6f5d7b928
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -580,6 +580,34 @@ spark.shuffle.io.retryWait 5s
3.可以使用压缩算子提前性能。
## 数据倾斜
### shuffle原理
**什么样的情况下会发生shuffle?**
在spark中主要是以下几个算子groupByKey、reduceByKey、countByKey、join等等。
**什么是shuffle?**
groupByKey要把分布在集群各个节点上的数据中的同一个key对应的values都给集中到一块儿集中到集群中同一个节点上更严密一点说就是集中到一个节点的一个executor的一个task中。
然后呢集中一个key对应的values之后才能交给我们来进行处理<key, Iterable<value>>reduceByKey算子函数去对values集合进行reduce操作最后变成一个valuecountByKey需要在一个task中获取到一个key对应的所有的value然后进行计数统计总共有多少个valuejoinRDD<key, value>
RDD<key, value>只要是两个RDD中key相同对应的2个value都能到一个节点的executor的task中给我们进行处理。
**shuffle示意图**
![shuffle示意图](shuffle示意图.png)
1.每一个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, values的汇聚(key ,values)
task会用我们自己定义的聚合函数比如reduceByKey(_+_)把所有values进行一对一的累加聚合出来最终的值。就完成了shuffle
2.shuffle一定是分为两个stage来完成的。因为这其实是个逆向的过程不是stage决定shuffle是shuffle决定stage。
reduceByKey(_+_)在某个action触发job的时候DAGScheduler会负责划分job为多个stage。划分的依据就是如果发现有会触发shuffle操作的算子比如reduceByKey就将这个操作的前半部分以及之前所有的RDD和transformation操作划分为一个stageshuffle操作的后半部分以及后面的直到action为止的RDD和transformation操作划分为另外一个stage。
3.shuffle前半部分的task在写入数据到磁盘文件之前都会先写入一个一个的内存缓冲内存缓冲满溢之后再spill溢写到磁盘文件中。
### 数据倾斜解决方案之原理以及现象分析
**1.数据倾斜的原理**

Loading…
Cancel
Save