【Spark篇】---Spark中内存管理和Shuffle参数调优

1、前述网络

Spark内存管理ide

Spark执行应用程序时,Spark集群会启动Driver和Executor两种JVM进程,Driver负责建立SparkContext上下文,提交任务,task的分发等。Executor负责task的计算任务,并将结果返回给Driver。同时须要为须要持久化的RDD提供储存。Driver端的内存管理比较简单,这里所说的Spark内存管理针对Executor端的内存管理。性能

Spark内存管理分为静态内存管理和统一内存管理,Spark1.6以前使用的是静态内存管理,Spark1.6以后引入了统一内存管理。大数据

静态内存管理存储内存、执行内存和其余内存的大小在 Spark 应用程序运行期间均为固定的,但用户能够应用程序启动前进行配置优化

统一内存管理与静态内存管理的区别在于储存内存和执行内存共享同一块空间能够互相借用对方的空间。编码

Spark1.6以上版本默认使用的是统一内存管理,能够经过参数spark.memory.useLegacyMode 设置为true(默认为false)使用静态内存管理。spa

2、具体细节blog

 

 一、静态内存管理分布图排序

 

二、统一内存管理分布图索引

 

三、reduce 中OOM如何处理?

 

   拉取数据的时候一次都放不下,放下的话能够溢写磁盘

   1) 减小每次拉取的数据量

   2) 提升shuffle聚合的内存比例

   3) 提升Excutor的总内存

 

 四、Shuffle调优

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


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

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


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|hash
参数说明:该参数用于设置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.shffle.manager参数手动指定为hash,使用HashShuffleManager,同时开启consolidate机制。在实践中尝试过,发现其性能比开启了bypass机制的SortShuffleManager要高出10%~30%。

 

五、Shuffle调优设置

      SparkShuffle调优配置项如何使用?

     1) 在代码中,不推荐使用,硬编码。

     new SparkConf().set(“spark.shuffle.file.buffer”,”64”)

     2) 在提交spark任务的时候,推荐使用。

     spark-submit --conf spark.shuffle.file.buffer=64 –conf ….

     3) conf下的spark-default.conf配置文件中,不推荐,由于是写死后全部应用程序都要用。

相关文章
相关标签/搜索