Spark性能优化-Shuffer调优

from:http://spark.apache.org/docs/1.6.2/configuration.html#shuffle-behavior

spark.shuffle.file.buffer

以下是 Shffule 过程中的一些主要参数,这里详细讲解了各个参数的功能、默认值以及基于实践经验给出的调优建议。
默认值: 32k
参数说明:该参数用于设置
shufflewrite task BufferedOutputStream buffer 缓冲大小。将数据写到磁盘文件之前,会先写入 buffer 缓冲中,待缓冲写满之后,才会溢写到磁盘。
调优建议:
  
如果作业可用的内存资源较为充足的话,可以适当增加这个参数的大小(比如 64k ),从而减少 shuffle write 过程中溢写磁盘文件的次数,也就可以减少磁盘 IO 次数,进而提升性能。在实践中发现,合理调节该参数,性能会有 1%~5% 的提升。

spark.reducer.maxSizeInFlight

默认值: 48m
参数说明:
   该参数用于设置
shuffle read task buffer 缓冲大小,而这个 buffer 缓冲决定了每次能够拉取多少数据。
调优建议:
   如果作业可用的内存资源较为充足的话,可以适当增加这个参数的大小(比如
96m ),从而减少拉取数据的次数,也就可以减少网络传输的次数,进而提升性能。在实践中发现,合理调节该参数,性能会有 1%~5% 的提升。

spark.shuffle.io.maxRetries

默认值: 3
参数说明:
  
shuffle read task shufflewrite task 所在节点拉取属于自己的数据时,如果因为网络异常导致拉取失败,是会自动进行重试的。该参数就代表了可以重试的最大次数。如果在指定次数之内拉取还是没有成功,就可能会导致作业执行失败

调优建议:
   对于那些包含了特别耗时的
shuffle 操作的作业,建议增加重试最大次数(比如 60 次),以避免由于 JVM full gc 或者网络不稳定等因素导致

spark.shuffle.io.retryWait


默认值:5s
参数说明:
   具体解释同上,该参数代表了每次重试拉取数据的等待间隔,默认是
5s
调优建议:
   建议加大间隔时长(比如
60s),以增加shuffle操作的稳定性。

spark.shuffle.memoryFraction

默认值: 0.2
   
参数说明:该参数代表了 Executor 内存中,分配给 shuffle read task 进行聚合操作的内存比例,默认是 20%
   调优建议:在资源参数调优中讲解过这个参数。如果内存充足,而且很少使用持久化操作,建议调高这个比例,给
shuffle read 的聚合操作更多内存,以避免由于内存不足导致聚合过程中频繁读写磁盘。在实践中发现,合理调节该参数可以将性能提升 10% 左右。

spark.shuffle.manager

默认值: sort
参数说明:
   该参数用于设置
ShuffleManager 的类型。 Spark 1.5 以后,有三个可选项: hash sort tungsten-sort HashShuffleManager Spark 1.2 以前的默认选项,但是 Spark 1.2 以及之后的版本默认都是 SortShuffleManager 了。 tungsten-sort sort 类似,但是使用了 tungsten 计划中的堆外内存管理机制,内存使用效率更高。
调优建议:
   由于
SortShuffleManager 默认会对数据进行排序,因此如果你的业务逻辑中需要该排序机制的话,则使用默认的 SortShuffleManager 就可以;而如果你的业务逻辑不需要对数据进行排序,那么建议参考后面的几个参数调优,通过 bypass 机制或优化的 HashShuffleManager 来避免排序操作,同时提供较好的磁盘读写性能。这里要注意的是, tungsten-sort 要慎用,因为之前发现了一些相应的 bug

spark.shuffle.sort.bypassMergeThreshold

默认值: 200
参数说明:
   当
ShuffleManager SortShuffleManager 时,如果 shuffle read task 的数量小于这个阈值(默认是 200 ),则 shuffle write 过程中不会进行排序操作,而是直接按照未经优化的 HashShuffleManager 的方式去写数据,但是最后会将每个 task 产生的所有临时磁盘文件都合并成一个文件,并会创建单独的索引文件。
调优建议:
   当你使用
SortShuffleManager 时,如果的确不需要排序操作,那么建议将这个参数调大一些,大于 shuffle read task 的数量。那么此时就会自动启用 bypass 机制, map-side 就不会进行排序了,减少了排序的性能开销。但是这种方式下,依然会产生大量的磁盘文件,因此 shuffle write 性能有待提高。

spark.shuffle.consolidateFiles

默认值: false
参数说明:
   如果使用
HashShuffleManager ,该参数有效。如果设置为 true ,那么就会开启 consolidate 机制,会大幅度合并 shuffle write 的输出文件,对于 shuffle read task 数量特别多的情况下,这种方法可以极大地减少磁盘 IO 开销,提升性能。
调优建议:
   如果的确不需要
SortShuffleManager 的排序机制,那么除了使用 bypass 机制,还可以尝试将 spark.shuffle.manager 参数手动指定为 hash ,使用 HashShuffleManager ,同时开启 consolidate 机制。在实践中尝试过,发现其性能比开启了 bypass 机制的 SortShuffleManager 要高出 10%~30%




shuffle总结:

              spark.shuffle.file.buffer

                     ---->shuffle wirte的时候的buffer的大小,也就是bucket的默认大小:32k

                     在持久化不多的情况下,可以调大

              spark.reducer.maxSizeInFlight

                     ---->shuffle read的每次拉取shuffle write文件中的最大的数据体积:48M

                     ----做相应修改

              spark.shuffle.io.maxRetries

                     ---->shuffle read拉取shufflewrite结果的最大的次数:3次

              spark.shuffle.io.retryWait

                     ---->重新拉取数据的间隔等待时间

              spark.shuffle.memoryFraction

                     ---->executor分配给shuffle read聚合的内存区域比例:0.2

                     在持久化不多的情况下,可以调大,也就意味着要将spark.storage.memoryFraction调低(0.5)

              spark.shuffle.manager

                     指定我们进行shuffle操作的管理类:在1.5之后默认为sort|hash

                     如果在shuffle过程中,不需要进行排序的话,可以将其指定为hash,反之使用默认sort即可

              spark.shuffle.sort.bypassMergeThreshold:200

                     当在执行shuffle操作的时候,如果task的个数不足该参数(和spark.default.parallelism 200一样)的时候,使用的

                     shuffleManager为hash而不是sort,

                     所以如果在shuffle过程中如果不需要排序的话,另外一种方式就是调大改参数的值,就可以不用走sort了。

              spark.shuffle.consolidateFiles

                     如果在走的是hashshuffleWriter,那么这是时候建议开启consolidate机制,可以大大的降低shuffleblockFile的个数,

                     降低磁盘IO,提高程序的性能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值