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

noo*_*ing 3 java garbage-collection apache-spark google-cloud-dataproc

我的 Spark 驱动程序在运行大约 10 小时后内存不足,并出现错误Exception in thread "dispatcher-event-loop-17" java.lang.OutOfMemoryError: GC overhead limit exceeded。为了进一步调试,我启用了 G1GC 模式以及 GC 日志选项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 ,但看起来它没有对驱动程序生效。

10 小时后,该作业再次卡在驱动程序上,并且我在驱动程序节点的 stdout 下没有看到任何 GC 日志/var/log/hadoop-yar/userlogs/[application-id]/[container-id]/stdout- 所以不知道还能在哪里查看。根据Spark GC 调优文档,这些设置似乎只发生在工作节点上(在本例中我可以看到,在我使用了相同的配置后,工作节点在 stdout 中有 GC 日志spark.executor.extraJavaOptions)。是否有办法从驱动程序启用/获取 GC 日志?在 Spark UI -> 环境下,我看到下面列出了这些选项,spark.driver.extraJavaOptions这就是我认为它可以工作的原因。

环境: 集群在 Google Dataproc 上运行,我使用/usr/bin/spark-submit --master yarn --deploy-mode cluster ...master 来提交作业。

编辑在命令 期间为驱动程序设置相同的选项spark-submit,我可以在驱动程序的标准输出上看到 GC 日志。只是由于某种原因,通过 SparkConf 以编程方式设置选项似乎没有生效。

Pat*_*lay 5

我相信spark.driver.extraJavaOptions是由 处理的SparkSubmit.scala,并且需要在调用时传递。要使用 Dataproc 执行此操作,您可以将其添加到属性字段--properties在 中gcloud dataproc jobs submit spark)。

您也-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