Spark面试题(八)——Spark的Shuffle配置调优

2021年11月26日 阅读数:10
这篇文章主要向大家介绍Spark面试题(八)——Spark的Shuffle配置调优,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

Spark系列面试题

一、Shuffle优化配置 -spark.shuffle.file.buffer

默认值:32k
参数说明:该参数用于设置shuffle write task的BufferedOutputStream的buffer缓冲大小。将数据写到磁盘文件以前,会先写入buffer缓冲中,待缓冲写满以后,才会溢写到磁盘。
调优建议:若是做业可用的内存资源较为充足的话,能够适当增长这个参数的大小(好比64k),从而减小shuffle write过程当中溢写磁盘文件的次数,也就能够减小磁盘IO次数,进而提高性能。在实践中发现,合理调节该参数,性能会有1%~5%的提高。面试

二、Shuffle优化配置 -spark.reducer.maxSizeInFlight

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

三、Shuffle优化配置 -spark.shuffle.io.maxRetries

默认值:3
参数说明:shuffle read task从shuffle write task所在节点拉取属于本身的数据时,若是由于网络异常致使拉取失败,是会自动进行重试的。该参数就表明了能够重试的最大次数。若是在指定次数以内拉取仍是没有成功,就可能会致使做业执行失败。
调优建议:对于那些包含了特别耗时的shuffle操做的做业,建议增长重试最大次数(好比60次),以免因为JVM的full gc或者网络不稳定等因素致使的数据拉取失败。在实践中发现,对于针对超大数据量(数十亿~上百亿)的shuffle过程,调节该参数能够大幅度提高稳定性。ide

四、Shuffle优化配置 -spark.shuffle.io.retryWait

默认值:5s
参数说明: shuffle read task从shuffle write task所在节点拉取属于本身的数据时,若是由于网络异常致使拉取失败,是会自动进行重试的,该参数表明了每次重试拉取数据的等待间隔,默认是5s。
调优建议:建议加大间隔时长(好比60s),以增长shuffle操做的稳定性。性能

五、Shuffle优化配置 -spark.shuffle.memoryFraction

默认值:0.2
参数说明:该参数表明了Executor内存中,分配给shuffle read task进行聚合操做的内存比例,默认是20%。
调优建议:在资源参数调优中讲解过这个参数。若是内存充足,并且不多使用持久化操做,建议调高这个比例,给shuffle read的聚合操做更多内存,以免因为内存不足致使聚合过程当中频繁读写磁盘。在实践中发现,合理调节该参数能够将性能提高10%左右。大数据

六、Shuffle优化配置 -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。优化

七、Shuffle优化配置 -spark.shuffle.sort.bypassMergeThreshold

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

八、Shuffle优化配置 -spark.shuffle.consolidateFiles

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

总结:

一、spark.shuffle.file.buffer:主要是设置的Shuffle过程当中写文件的缓冲,默认32k,若是内存足够,能够适当调大,来减小写入磁盘的数量。
二、spark.reducer.maxSizeInFight:主要是设置Shuffle过程当中读文件的缓冲区,一次可以读取多少数据,若是内存足够,能够适当扩大,减小整个网络传输次数。
三、spark.shuffle.io.maxRetries:主要是设置网络链接失败时,重试次数,适当调大可以增长稳定性。
四、spark.shuffle.io.retryWait:主要设置每次重试之间的间隔时间,能够适当调大,增长程序稳定性。
五、spark.shuffle.memoryFraction:Shuffle过程当中的内存占用,若是程序中较多使用了Shuffle操做,那么能够适当调大该区域。
六、spark.shuffle.manager:Hash和Sort方式,Sort是默认,Hash在reduce数量 比较少的时候,效率会很高。
七、spark.shuffle.sort. bypassMergeThreshold:设置的是Sort方式中,启用Hash输出方式的临界值,若是你的程序数据不须要排序,并且reduce数量比较少,那推荐能够适当增大临界值。
八、spark. shuffle.cosolidateFiles:若是你使用Hash shuffle方式,推荐打开该配置,实现更少的文件输出。排序