Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 如何使用log4j将日志记录到运行在计算机上的Spark应用程序中的本地文件系统?_Logging_Log4j_Apache Spark_Yarn - Fatal编程技术网

Logging 如何使用log4j将日志记录到运行在计算机上的Spark应用程序中的本地文件系统?

Logging 如何使用log4j将日志记录到运行在计算机上的Spark应用程序中的本地文件系统?,logging,log4j,apache-spark,yarn,Logging,Log4j,Apache Spark,Yarn,我正在构建一个ApacheSpark流媒体应用程序,在Thread上运行时,无法将其记录到本地文件系统上的文件中。如何才能做到这一点 我已经设置了log4.properties文件,以便它可以成功地写入本地文件系统上/tmp目录中的日志文件(部分如下所示): 当我使用以下命令在本地运行Spark应用程序时: spark-submit --class myModule.myClass --master local[2] --deploy-mode client myApp.jar 它运行良好,我

我正在构建一个ApacheSpark流媒体应用程序,在Thread上运行时,无法将其记录到本地文件系统上的文件中。如何才能做到这一点

我已经设置了
log4.properties
文件,以便它可以成功地写入本地文件系统上
/tmp
目录中的日志文件(部分如下所示):

当我使用以下命令在本地运行Spark应用程序时:

spark-submit --class myModule.myClass --master local[2] --deploy-mode client myApp.jar
它运行良好,我可以看到日志消息被写入本地文件系统上的
/tmp/application.log

但是当我通过纱线运行相同的应用程序时,例如

spark-submit --class myModule.myClass --master yarn-client  --name "myModule" --total-executor-cores 1 --executor-memory 1g myApp.jar

在运行纱线的机器的本地文件系统上,我看不到任何
/tmp/application.log


我遗漏了什么。

看起来您需要在启动任务/作业时附加到JVM参数

尝试编辑
conf/spark defaults.conf
as

或者,尝试编辑conf/spark env.sh以添加相同的JVM参数,尽管conf/spark-defaults.conf中的条目应该可以工作

如果您仍然没有得到任何乐趣,那么可以在命令行上显式地传递log4j.properties文件的位置以及
spark submit
,如果该文件包含在JAR文件中,并且位于类路径的根目录中,则可以这样做

spark-submit --class sparky.MyApp --master spark://my.host.com:7077 --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties" myapp.jar
如果文件不在类路径上,请使用
文件:
前缀和完整路径,如下所示

spark-submit ... --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j-executor.properties" ...

或者,您可以使用log4j的PropertyConfigurator来定义自定义日志属性

您的属性文件应具有以下道具:

log4j.appender.file=org.apache.log4j.FileAppender

log4j.appender.file.File=/tmp/application.log

log4j.appender.file.append=false

log4j.appender.file.layout=org.apache.log4j.PatternLayout

log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
编辑:更新到log4j文档的链接。Spark使用log4j 2,而不是v1.2


参考:

上述使用spark.executor.extraJavaOptions、spark.driver.extraJavaOptions指定log4j.properties的选项将只在本地记录日志,并且log4.properties应该在每个节点上本地显示

如文档中所述,您也可以使用--files选项将log4j.properties与应用程序一起上载。这将在HDFS上进行日志记录,您可以使用命令访问日志

yarn logs -applicationId <application id>
纱线原木-应用程序ID

在log4j.properties文件中,还应将
log4j.rootCategory
INFO,console
修改为
INFO,file

log4j.rootCategory=INFO, console    
log4j.rootCategory=INFO,file
1) 要调试Spark on Thread如何解释log4j设置,请使用
log4j.debug
标志

2) Spark将创建两种纱线容器,驾驶员和工人。因此,您希望将提交应用程序的文件与所有容器共享(您不能在JAR中使用文件,因为这不是真正运行的JAR),因此必须使用
--files
Spark submit指令(这将与所有工作人员共享文件)

像这样:

spark-submit     
    --class com.X.datahub.djobi.Djobi \
    --files "./log4j.properties" \
    --driver-java-options "-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties" \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties " \
    ./target/X-1.0.jar "$@"
其中log4j.properties是
src/main/resources/config
文件夹中的项目文件

我可以在控制台中看到:

log4j: Trying to find [config/log4j.properties] using context 
classloader org.apache.spark.util.MutableURLClassLoader@5bb21b69.
log4j: Using URL [jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties

因此该文件已被考虑在内,您也可以查看Spark webUI。

我有点困惑。我的log4j.properties文件打包到JAR文件中。我的应用程序是一个Maven项目,我正在创建一个单独的、大的、自包含的JAR文件,其中还包含log4j.properties文件。当我在本地运行Spark时,这很好。当我在纱线簇上运行Spark时,这(将log4j.properties放入JAR)不可能吗?是的,应该是可能的。我试图通过剥离您正在使用的配置来帮助简化问题。我不是火花方面的专家。我在windows主机上有一个独立的群集日志记录。@Emre我在回答中提到的各种设置中进行了尝试,这使我重新编写了它。我通过编辑
spark defaults.conf
使日志工作,然后通过使用
spark submit--conf
使日志工作。其中一个或另一个应该可以工作(您不需要两者都可以)嗨,上面提到的可以用于不在类路径上也不包含在jar中的日志文件吗?我已将log.properties复制到executor并使用命令行arg,但它告诉它找不到它,thanks@EmreSevin这是行不通的。Spark worker应用程序不是您的jar,而是一个运行仅从驱动程序发送的Spark代码的应用程序,请参阅我的答案,您必须使用静态文件(在HDFS或任何其他共享文件系统中,或通过--files Spark指令)。您是否有要记录到HDFS的log4j.properties文件的示例?@Irene这是与其他常规log4.properties文件的唯一区别。log4j.appender.file_appender.file=${spark.warn.app.container.log.dir}/spark.logI不知道这是否对执行器和驱动程序都有效。在上面的代码中,它可能只是为驱动程序配置的代码。嘿@Vojtech这将取决于您为记录器配置的版本。。。看一看,我刚刚粘贴了log4j.properties的您的部分,并在本地以类似于您的方式运行它,但它没有为my/tmp创建任何日志文件。我遗漏了什么吗?我觉得这篇文章很有用-
yarn logs -applicationId <application id>
log4j.rootCategory=INFO, console    
log4j.rootCategory=INFO,file
spark-submit     
    --class com.X.datahub.djobi.Djobi \
    --files "./log4j.properties" \
    --driver-java-options "-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties" \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties " \
    ./target/X-1.0.jar "$@"
log4j: Trying to find [config/log4j.properties] using context 
classloader org.apache.spark.util.MutableURLClassLoader@5bb21b69.
log4j: Using URL [jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties