Spark参数调节之-GC【降低OOM概率】
Spark SQL用于数据处理中经常会用参数调节来提升数据的执行效率,降低数据处理所需要的时间,基于
当前Spark 3.0的优越性,我们默认大部分公司已经将Spark的版本升级为3.0以上的版本
Spark3.0版本兼容的java版本包括java8和java11,集群中配置的java环境基于java8还是java11会对Spark运行时动的JVM的垃圾回收方式造成影响,这是因为在java9之后将GC的默认方式由Parallel GC切换为G1GC,但是实际上java8便已经开始了对G1GC的支持,如果我们集群的java环境为Java8,可以通过一个参数可以实现对于java的
GC模式的调节,来提升当数据量较大时GC的处理效率,降低任务发生OOM的概率
由GC导致的OOM表现为:java.lang.OutOfMemoryError: GC overhead limit exceeded
参数:–conf spark.executor.extraJavaOptions
这个参数只能在提交Spark作业时通过 spark-submit
命令的 --conf
选项来配置,或者在Spark应用程序的代码中通过 SparkConf
对象来设置。这是因为该参数用于控制Spark Executor的JVM行为,需要在Executor进程启动之前就确定好,不能通过SET
命令在Spark SQL中设置,SET
是用来处理SQL执行时的配置参数。
使用方式:
spark-submit
方式
spark-submit \
--class YourMainClass \
--conf "spark.executor.extraJavaOptions=-XX:+UseG1GC" \
your-spark-app.jar
SparkConf
方式
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("MyApp") \
.config("spark.executor.extraJavaOptions", "-XX:+UseG1GC") \
.getOrCreate()
G1GC和Parallel GC本身都适用于需要较大内存的场景,但是G1GC的优势在于通过策略提升了内存回收的效率,进而降低了内存溢出的风险,同时也减少了任务运行的耗时,如果在Spark UI中发现GC时间比较长,通过Spark UI确认JAVA version,如果是JAVA8,可以尝试通过修改GC方式来解决这个问题。
如何确定依赖的JAVA版本
在哪里看到GC的时长
Parallel GC和G1GC都是针对大吞吐的场景,也是大数据场景下的常用GC方式,如果没有特别的优化需求,使用默认的GC方式就可以适配大多数的数据处理场景