来自spark java应用程序udf的日志未出现在控制台或执行器日志文件中

0wi1tuuw  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(558)

我已经阅读了以下问题和页面,寻求问题的答案,但它们并没有解决我的问题:
从spark udf记录到驱动程序
记录器在群集上的spark udf内不工作
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时,不会打印任何日志。我正在打开执行者的日志文件,但它们也不包含我给出的任何日志语句。请在这方面帮助我。

2fjabf4q

2fjabf4q1#

我已经解决了日志记录问题。我发现,即使在本地模式下,UDF中的日志也不会写入spark日志文件,即使它们显示在控制台中。因此,我将问题缩小到UDF可能无法访问文件系统。然后我发现了以下问题:
如何在sc.textfile而不是hdfs中加载本地文件
在这里,我的问题没有解决方案,但是从spark内部得到的提示是,如果我们需要引用文件,我们必须将文件系统的根目录引用为“file://”,正如执行jvm所看到的那样。所以,我在driver中的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

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

相关问题