我的Spark驱动程序在运行了大约10个小时后出现内存不足,错误为Exception in thread "dispatcher-event-loop-17" java.lang.OutOfMemoryError: GC overhead limit exceeded
。为了进一步调试,我使用spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j.properties -XX:+PrintFlagsFinal -XX:+PrintReferenceGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+G1SummarizeConcMark -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
启用了G1GC模式和GC日志选项,但看起来它没有对驱动程序生效。
10小时后,作业再次卡在驱动程序上,我在/var/log/hadoop-yar/userlogs/[application-id]/[container-id]/stdout
下的驱动程序节点上的stdout下看不到任何GC日志 - 所以不确定在哪里查看。根据{{3}},看起来这些设置只发生在工作节点上(在这种情况下我可以看到,在spark.executor.extraJavaOptions
下使用相同的配置后,工作人员在stdout中有GC日志)。反正是否有从驱动程序启用/获取GC日志?在Spark UI下 - >环境,我看到这些选项列在spark.driver.extraJavaOptions
下,这就是为什么我认为它会起作用。
环境:
群集正在Google Dataproc上运行,我使用主服务器中的/usr/bin/spark-submit --master yarn --deploy-mode cluster ...
来提交作业。
修改
在spark-submit
命令期间为驱动程序设置相同的选项,我可以在stdout上查看驱动程序的GC日志。只是通过编程方式通过SparkConf设置选项似乎没有因某种原因生效。
答案 0 :(得分:3)
我相信spark.driver.extraJavaOptions
由SparkSubmit.scala
处理,需要在调用时传递。要使用Dataproc执行此操作,您可以将其添加到the properties field(--properties
中的gcloud dataproc jobs submit spark
)。
您也可以使用this guide来配置详细日志记录,而不是-Dlog4j.configuration=log4j.properties
。
我可以看到GC驱动程序日志:
gcloud dataproc jobs submit spark --cluster CLUSTER_NAME --class org.apache.spark.examples.SparkPi --jars file:///usr/lib/spark/examples/jars/spark-examples.jar --driver-log-levels ROOT=DEBUG --properties=spark.driver.extraJavaOptions="-XX:+PrintFlagsFinal -XX:+PrintReferenceGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+G1SummarizeConcMark -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp" --
您可能不需要--driver-log-levels ROOT=DEBUG
,但可以从log4j.properties
复制日志配置。如果您确实想使用log4j.properties
,则可以使用--files log4j.properties