YARN 执行程序日志上的 Spark 流不可用

Spark streaming on YARN executor's logs not available

我是运行下面的代码

.map{x => 
    Logger.fatal("Hello World")
    x._2
 }

它是在 YARN 上运行的 spark 流应用程序。我更新了 log4j 并为它提供了 spark-submit(使用 --files)。我的 Log4j 配置已加载,我从日志中看到并应用于驱动程序的日志(我只看到我的日志级别和我在日志中的模式),但是来自执行程序的日志不可用。我在日志中找不到 "Hello Word"。另外,我检查了 ${yarn.nodemanager.log-dirs} ,它是空的,看起来很奇怪。我的日志在哪里?

提前致谢

根据 Spark 官方文档 (link),有两种方法 YARN 管理日志记录:

  • 如果打开日志聚合(使用yarn.log-aggregation-enable config):

容器日志从本地机器(执行器)中删除并复制到 HDFS 目录。可以使用 yarn logs 命令从集群的任何位置查看这些日志,方式如下:

yarn logs -applicationId <app ID>
  • 如果日志聚合开启:

日志在YARN_APP_LOGS_DIR下的每台机器上本地维护,通常配置为/tmp/logs$HADOOP_HOME/logs/userlogs,具体取决于Hadoop版本和安装。根据文档,查看容器的日志需要转到包含它们的主机并查看此目录。

我找到了解决方案,正确的 log4j 配置必须在申请提交期间按以下方式设置:

--files /opt/spark/conf/log4j.properties
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j.properties"
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j.properties"

哪里

spark.driver.extraJavaOptions   -> sets up log configuration for driver
spark.executor.extraJavaOptions -> sets up log configuration for executor(s)