【问题标题】:Where does log4j writes the logs in cluster mode?log4j 在集群模式下将日志写入哪里?
【发布时间】:2019-07-09 13:10:04
【问题描述】:

用途 - 将自定义日志从流应用程序存储到 HDFS 或 UNIX 目录以用于流应用程序

我在集群模式下运行 spark 流程序。但是日志没有被写入给定的日志路径。检查了 HDFS 和本地目录。通过 log4j 调试属性,我可以看到正在运行的文件。我错过了什么吗?

--文件 log4j_driver.properties
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j_driver.properties -Dlog4j.debug=true "
--conf "spark.executor.extraJavaOptions= -Dlog4j.configuration=log4j_driver.properties -Dlog4j.debug=true"

Log4j-属性文件

我的 Log4j 属性文件 -

log=/tmp/cc

log4j.rootLogger=INFO,滚动
log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.File=${log}/abc.log
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n
log4j.appender.rolling.maxFileSize=2KB
log4j.appender.rolling.maxBackupIndex=10
log4j.appender.rolling.encoding=UTF-8
log4j.logger.org.apache.spark=信息
log4j.appender.rolling.ImmediateFlush=true
log4j.appender.rolling.Threshold=调试
log4j.appender.rolling.Append=true
log4j.logger.org.eclipse.jetty=INFO

集群驱动程序日志

log4j:将文件 /tmp/cc/abc.log.2 重命名为 /tmp/cc/abc.log.3
log4j:将文件 /tmp/cc/abc.log.1 重命名为 /tmp/cc/abc.log.2
log4j:将文件 /tmp/cc/abc.log 重命名为 /tmp/cc/abc.log.1
log4j:setFile 调用:/tmp/cc/abc.log,false
log4j:setFile 结束
log4j:滚动计数=5141
log4j: maxBackupIndex=10
log4j:将文件 /tmp/cc/abc.log.9 重命名为 /tmp/cc/abc.log.10
log4j:将文件 /tmp/cc/abc.log.8 重命名为 /tmp/cc/abc.log.9
log4j:将文件 /tmp/cc/abc.log.7 重命名为 /tmp/cc/abc.log.8
log4j:将文件 /tmp/cc/abc.log.6 重命名为 /tmp/cc/abc.log.7

我读过-我们可以在 log4j 中指定 - ${spark.yarn.app.container.log.dir}/app.log 但不确定此属性的默认路径是什么,或者我们是否需要手动设置为好吧 。当我在客户端模式下运行此应用程序时 - 日志完美地记录到本地目录。

【问题讨论】:

  • “我正在集群模式下运行 Spark 流程序”
  • spark2-submit --master yarn --deploy-mode cluster

标签: apache-spark log4j spark-streaming hadoop-yarn


【解决方案1】:

在我的yarn集群中,Spark Streaming应用的日志是写在应用容器的节点上的。实际上有一个属于应用的日志写字典,它是由一个名为yarn.log.directory?的字段配置的。具体名字我不记得了,你可以查一下。

【讨论】:

  • 在我的情况下 - 是的,它写入 yarn.log.directory。但是一旦应用程序被杀死/完成/停止,所有日志都将被写入
  • 你的意思是作业完成后会删除日志吗?如果是这样,可能是因为 log.retent.time 配置设置为一个非常小的值。
【解决方案2】:

当您以集群模式 (--deploy-mode cluster) 启动 Spark 应用程序时,log=/tmp/cc 指向运行驱动程序和执行程序的“容器”根目录下的/tmp/cc。它们将在集群中的机器上。

在你的情况下,你必须找到运行驱动程序和执行程序的机器并找到目录。

由于像 Spark 一样在分布式环境中管理日志非常麻烦,Spark 支持的集群管理器(即 Hadoop YARN、Apache Mesos、Kubernetes)允许从机器收集日志并通过 Web UI 或命令行下载。在 YARN 中,它会是 yarn logs -applicationId

【讨论】:

【解决方案3】:

查找 spark 日志写入位置的最佳选择是使用 Spark UI,并且在集群模式下,驱动程序日志位于集群节点之一中。

Spark UI 提供了大量信息。 http://ashkrit.blogspot.com/2018/11/insights-from-spark-ui.html帖子有一些细节。

【讨论】:

    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多