这是我参与「第四届青训营 」笔记创作活动的第9天
今日带来的是大数据 Shuffle 中的参数问题
shuffle概述
数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段通过shuffle读取数据并输出到对应的Reduce,而Reduce阶段负责从Map端拉取数据并进行计算。在整个shuffle过程中,往往伴随着大量的磁盘和网络I/O。所以shuffle性能的高低也直接决定了整个程序的性能高低。而Spark也会有自己的shuffle实现过程。
Spark中的 shuffle 介绍
在DAG调度的过程中,Stage 阶段的划分是根据是否有shuffle过程,也就是存在 宽依赖 的时候,需要进行shuffle,这时候会将 job 划分成多个Stage,每一个 Stage 内部有很多可以并行运行的 Task。
stage与stage之间的过程就是 shuffle 阶段,在 Spark 中,负责 shuffle 过程的执行、计算和处理的组件主要就是 ShuffleManager 。ShuffleManager 随着Spark的发展有两种实现的方式,分别为 HashShuffleManager 和 SortShuffleManager ,因此spark的Shuffle有 Hash Shuffle 和 Sort Shuffle 两种。
使用到的参数
1 spark.shuffle.file.buffer:
buffer大小默认是32K,为了减少磁盘溢写的次数,可以适当调整这个数值的大小。降低磁盘IO
2 spark.reducer.MaxSizeFlight:
ReduceTask 拉取数据量的大小,默认48M
3 spark.shuffle.memoryFraction:
shuffle聚合内存的比例,占用executor内存比例的大小
4 spark.shuffle.io.maxRetries:
拉取数据重试次数,防止网络抖动带来的影响
5 spark.shuffle.io.retryWait:
调整到重试间隔时间,拉取失败后多久才重新进行拉取
6 spark.shuffle.consolidateFiles:
针对 HashShuffle 合并机制
7 spark.shuffle.sort.bypassMergeThreshold:
SortShuffle bypass机制,默认200次
8 spark.sql.shuffle.partitions:
默认200,shuffle时所使用到的分区数,也就是你生成的 part-00000,part-00001···最多也就只能 part-00199 了