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 以编程方式设置选项似乎没有生效。
我相信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
| 归档时间: |
|
| 查看次数: |
5841 次 |
| 最近记录: |