参数 | 默认值 | 描述 |
---|---|---|
spark.reducer.maxSizeInFlight | 48M | 每次reduce的时候fetch数据的最大值,默认是48M。 如果网络状态OK,Spark的数据量是比较多的,可以尽可能的拉大这个值,例如96M。 |
spark.shuffle.compress | true | Shuffle-write写数据到磁盘文件,是否开启压缩机制,默认是true。 开启压缩,需要配合spark.io.compression.codec(压缩方式)使用。 |
spark.shuffle.file.buffer | 32k | shuffle-write的时候,一个磁盘文件对应第一个缓冲区,默认的大小是32kb。 为了尽可能的减少写磁盘的次数,可以将这个值调大,例如64kb。 |
spark.shuffle.io.maxReties | 3 | shuffle过程中,配置的失败重试的次数,默认是3次。 如果Shuffle的数据量比较大,就越容易出错,此时可以把这个值调大,例如10次。 |
spark.shuffle.io.retryWait | 5s | 两次Shuffle重试之间的时间间隔,默认5s。 如果多次失败,可能是网络波动,为了保证程序的稳定,可以把这个值调大,例如30s,60s |
spark.shuffle.sort.bypassMergeThreshold | 200 | 是否开启ByPass机制 |
spark.shuffle.memoryFraction | 0.2 | 在executor中reduce拉取数据进行合并占用的内存大小,默认占executor的20%。 如果持久化操作比较少,Shuffle比较多,可以适当的调整这个值,例如0.3 |
三种ShuffleWriter Handle在什么情况下产生
1.BypassMergeSortShuffleHandle
1)不能在map端(分区内)进行combine 并且 numPartitions< =spark.shuffle.sort.bypassMergeThreshold (200)
2)不满足上面条,再看Serializer支持重定位(即使用KryoSerializer),且分区数目小于16777216(最大分区号)时使用SerializedShuffleHandle。
3)上面都不满足再用BaseShuffleHandle