Spark调优部分参数
可以在创建SparkSession对象时提供config(key,value)的方式进行赋值
1、shuffle相关调优参数
spark.shuffe.file.buffer
默认值:32K
参数说明:该参数用于设置shuffle write 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从shuffle write task所在节点拉取属于自己的数据时,如果因为网络异常导致拉取失败,是会自动进行重试的。该参数就代表可以充实的最大次数。如果在指定次数之内拉取还是没有成功,就可能导致作业执行失败。
调优:对于那些包含了特别耗时的shuffle操作的作业,建议增加重试最大次数(比如60),以避免由于JVM的full gc或者网络不稳定等因素导致的数据拉取失败。在实践中发现,对于针对超大数据量的shuffle过程,调节该参数可以大幅度的提升稳定性。
spark.shuffle.io.retryWait
默认值:5s
参数说明:shuffle read task从shuffle write task所在节点拉取属于自己的数据时,如果因为网络异常导致拉取失败,是会自动进行重试的。该参数就代表每次重试拉取数据的等待间隔
调优:建议加大时间隔(比如60s),提升稳定性
spark.shuffle.memoryFraction
默认值:0.2
参数说明:该参数代表了Executor内存中,分配给shuffle read task进行聚合操作的内存比例,默认是20%
调优:如果内存充足,而且很少使用持久化操作,建议调高这个比例,给shuffle read的聚合操作更多的内存,以避免由于内存不足导致聚合过程中频繁读写磁盘,在实践中发现,合理调节该参数可以江性能提升10%左右。
spark.shuffle.manager
默认值:sort
参数说明:该参数用于设置ShuffleManager的类型,spark1.5以后,有三个可选项:hash、sort和tungsten-sort,HashShuffleManager是spark1.2以前的默认选项。但是spark1.2以及以后的版本默认都是SortShuffleManager了。tungsten-sort与sort类似,但是使用了tungsten计划中的堆外内存管理机制,内存使用效率更高。
调优:由于SortShuffleManager默认会对数据进行排序,因此如果你的业务逻辑中需要该排序机制的话,则使用默认的SortShuffleManager就可以;如果你的业务逻辑不需要对数据进行排序,那么建议参考后面的几个参数台哦有,通过bypass机制或者优化的HashShuffleManager来避免排序操作,同时提供较好的磁盘读写性能,这里有注意的是,tungsten-sort要慎用,还不稳定。
spark.shuffle.consolidateFiles
默认值:false
参数说明:如果使用HashShuffleManager,该参数有效。如果没有设置为ture,那么就会开启consolidate机制,会大幅度合并shuffle write的输出文件,对于shuffle read task数量特别多的情况下,这种方式可以极大的减少磁盘IO开销,提升性能。
调优:如果的确不需要SortShuffleManager的排序机制,那么除了使用bypass机制,还可以尝试将spark.shuffle.manager参数手动指定为hash,使用HashShuffleManager,同时开启consolidate机制,在实践中尝试,发现其性能比开启了bypass机制的SortShuffleManager要高出10%-30%。
2、资源相关调优参数
park.driver.memory
默认值:1G
参数说明:设置Driver端内存大小
调优:不需要过多的资源分配给Driver,因为Driver是不保存具体处理数据的,只会保存一些临时的数据以及元数据信息,当然开发工程中也会使用collect算子将数据收集到Driver,这时候需要确定Driver内存是否足够,可能会OOM。
spark.num.executors
默认值:1
参数说明:设置worker端的Executor数量
调优:可以按照节点的数量进行设置,1:1即可
spark.executor.memory
默认值:1G
参数说明:调节每个Executor的内存大小
调优:适当设置大一些,保存内存被充分使用即可
spark.executor.cores
默认值:1
参数说明:调节执行的cpu数量
调优:越多越好,越多性能越强
spark.executor.memory.over.head
默认值:false
参数说明:设置executor执行的时候,用的内存可能会超过executor.memory,所以会为executor额外预留一部分内存,该参数代表这这部分内存
调优:这里每个其他内存都是20%的,一般不动
spark.sql.files.maxPartitionBytes
默认值:13417728(128M)
参数说明:获取数据分区中的最大字节数
调优:默认即可
spark.sql.files.openCostlnBytes
默认值:4194394(4M)
参数说明:该参数表示4M的小文件会合并到一个分区,用于减少小文件,防止太多单个小文件占用一个分区的情况
调优:可能适当的增大,这样就可以设置每个文件的大小,文件越大产生的文件越少,反之越多,但是也是根据实际情况进行测试调试才能确定是否增大或者是减小
spark.sql.broadcastTimeout
默认值:300
参数说明:广播等待超时时间,单位秒。
调优:如果数据量比较大,广播容易超时,可以适当的增大时间
spark.sql.autoBroadcastJoinThreshold
默认值:10485760(10M)
参数说明:最大广播表的大小,设置为-1可以禁用该功能。当前统计信息仅支持Hive Metastore表
调优:可以禁用此功能,对程序来说没有太大的影响,因为使用范围比较小