Spark 日志记录未返回发送给驱动程序,消息仅存在于工作线程中



我看到一个刚刚开始使用的Spark集群有非常奇怪的行为。

日志记录的正常行为是当一个人运行spark-submit时,他会看到这样的日志消息:

INFO 2016-11-04 13:14:10,671 org.apache.spark.executor.Executor: Finished task 227.0 in stage 4.0 (TID 3168). 1992 bytes result sent to driver

这些通常很快地填满控制台,特别是当应用程序使用大量分区时。

但是在运行Spark -submit之后,我没有看到任何来自Spark的常规日志消息。大概5行。相反,所有正常的日志消息都在Spark UI的驱动程序标准输出中。

所以问题是什么设置和在哪里可能告诉Spark不将这些日志条目返回给驱动程序?

这是相当令人沮丧的,因为当日志消息分散在多个位置时,调试应用程序非常困难。通常情况下,我只是在运行spark-submit后看着日志涌上我的屏幕,然后我就能感觉到它在做什么。现在我不能有那种感觉了,因为我必须在事件发生后查看日志

因此,在深入研究我正在使用的jar之后,我发现它是用一个奇怪的log4j文件构建的。我不知道在这个文件中是什么,但是有些东西阻止了日志到达驱动程序。一旦我重新构建没有这个log4j文件的jar,日志就可以正常工作了!!

# Set everything to be logged to the console
log4j.rootCategory=DEBUG, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark-project.jetty=WARN
log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark=WARN
log4j.logger.org.apache.hadoop=INFO
log4j.logger.io.netty=INFO
log4j.logger.com.datastax.cassandra=INFO

# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR

这个问题现在有点老了,但是对于那些运行spark YARN作业的人来说,您可以使用以下命令查看日志:

yarn logs -applicationId <Your applicationId>

我发现这个命令对于调试YARN集群模式非常有用。

没有完全回答OP的问题,但是看看他们是否可以用这种方式查看日志可能会很有趣。

最新更新