Apache Spark:驱动程序的垃圾收集日志

时间:2017-07-23 20:31:51

标签: java apache-spark garbage-collection google-cloud-dataproc

我的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设置选项似乎没有因某种原因生效。

1 个答案:

答案 0 :(得分:3)

我相信spark.driver.extraJavaOptionsSparkSubmit.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