【问题标题】:Log from Spark Java application UDF not appearing in console or executor log file来自 Spark Java 应用程序 UDF 的日志未出现在控制台或执行程序日志文件中
【发布时间】:2020-05-13 20:48:44
【问题描述】:

我浏览了以下问题和页面来寻求我的问题的答案,但它们并没有解决我的问题:

log from spark udf to driver

Logger is not working inside spark UDF on cluster

https://www.javacodegeeks.com/2016/03/log-apache-spark.html

我们在独立模式下使用 Spark,而不是在 Yarn 上。我已经在驱动程序和执行程序中配置了 log4j.properties 文件来定义自定义记录器“myLogger”。我在驱动程序和执行程序中复制的 log4j.properties 文件如下:

log4j.rootLogger=INFO, Console_Appender, File_Appender

log4j.appender.Console_Appender=org.apache.log4j.ConsoleAppender
log4j.appender.Console_Appender.Threshold=INFO
log4j.appender.Console_Appender.Target=System.out
log4j.appender.Console_Appender.layout=org.apache.log4j.PatternLayout
log4j.appender.Console_Appender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

log4j.appender.File_Appender=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.File_Appender.Threshold=INFO
log4j.appender.File_Appender.File=/opt/spark_log/app_log.txt
log4j.appender.File_Appender.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.File_Appender.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy
log4j.appender.File_Appender.RollingPolicy.FileNamePattern=/opt/spark_log/app_log.%d{MM-dd-yyyy}.%i.txt.gz
log4j.appender.File_Appender.RollingPolicy.ActiveFileName=/opt/spark_log/app_log.txt
log4j.appender.File_Appender.TriggeringPolicy.MaxFileSize=1000
log4j.appender.File_Appender.layout=org.apache.log4j.PatternLayout
log4j.appender.File_Appender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c - %m%n

log4j.logger.myLogger=INFO,File_Appender
# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN

# 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.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

在我的 Java 应用程序中,我使用以下行放置了记录器:

private static Logger logger = LogManager.getLogger("myLogger");

我正在使用以下命令运行应用程序:

spark-submit --driver-java-options "-Dlog4j.configuration=file:///opt/spark/spark-2.4.4/conf/log4j.properties" --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:///opt/spark/spark-2.4.4/conf/log4j.properties" --class com.test.SparkApp file:///opt/test/cepbck/test.person.app-0.0.7.jar

当我在集群上运行应用程序时,主驱动程序类中的日志在控制台和日志文件中都显示得很好。但是当控件进入 UDF 时,不会打印任何日志。我正在打开执行程序的日志文件,但它们也不包含我给出的任何日志语句。请在这方面帮助我。

【问题讨论】:

  • 基本故障排除:在本地模式下运行作业时,是否看到 UDF 中的任何日志?当您在集群模式下运行作业时,您是否在 stderr/stdout(捕获为 YARN“日志”文件)中看到来自 Log4J 初始化的任何警报?
  • 你是绝对正确的。我在本地模式下运行应用程序,即使这样,我的 UDF 中的日志也正在使用我的自定义记录器在控制台中打印,但它们没有被写入文件。这可能是什么原因?
  • 我没有使用 YARN,正如我所说,我使用的是 Spark 的独立模式。您能否告诉在这种情况下在哪里可以看到那些 Log4J 初始化警报?
  • 啊,我的错。检查 Worker 守护程序在其本地磁盘上使用的暂存目录——不是作业用于存储其临时文件的目录,而是 Worker 存储作业的 JAR(或 Python 脚本)然后转储其输出的目录.
  • 有一个 Log4J 属性可以对标准错误启用“其内部的详细日志记录”,但我现在不记得语法了。 Google 会帮你(但不要使用 V2 语法,使用 V1.2)

标签: java apache-spark log4j


【解决方案1】:

我已经解决了日志记录问题。我发现即使在本地模式下,来自 UDF 的日志也没有写入 spark 日志文件,即使它们显示在控制台中也是如此。因此,我将问题缩小到 UDF 可能无法访问文件系统。然后我发现了以下问题:

How to load local file in sc.textFile, instead of HDFS

这里,没有解决我的问题,但是从 Spark 内部提示,如果我们需要引用文件,我们必须将文件系统的根目录引用为“file:///”正如正在执行的 JVM 所看到的那样。因此,我在驱动程序中对 log4j.properties 文件进行了更改:

log4j.appender.File_Appender.File=file:///opt/spark_log/app_log.txt

原来是

log4j.appender.File_Appender.File=/opt/spark_log/app_log.txt

我还增加了日志文件的大小,否则日志很快就会从当前文件中消失:

log4j.appender.File_Appender.TriggeringPolicy.MaxFileSize=1000000

之后,我再次执行应用程序,发现日志文件中正在生成日志。所以我将更改复制到执行程序,并以集群模式执行应用程序。从那时起,日志也在执行器中生成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 2015-04-02
    • 2013-11-05
    • 2020-08-31
    • 2018-06-12
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多