Apache spark 纱线模式下的火花文件记录器

Apache spark 纱线模式下的火花文件记录器,apache-spark,log4j,yarn,Apache Spark,Log4j,Yarn,我想创建一个自定义记录器,用于从集群节点中特定文件夹中的执行器写入消息。我在SPARK_HOME/conf/中编辑了log4j.properties文件,如下所示: log4j.rootLogger=${root.logger} root.logger=WARN,console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appende

我想创建一个自定义记录器,用于从集群节点中特定文件夹中的执行器写入消息。我在SPARK_HOME/conf/中编辑了log4j.properties文件,如下所示:

log4j.rootLogger=${root.logger}
root.logger=WARN,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
shell.log.level=WARN
log4j.logger.org.eclipse.jetty=WARN
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
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
log4j.logger.org.apache.spark.repl.Main=${shell.log.level}
log4j.logger.org.apache.spark.api.python.PythonGatewayServer=${shell.log.level}

#My logger to write usefull messages in a local file
log4j.logger.jobLogger=INFO, RollingAppenderU

log4j.appender.RollingAppenderU=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingAppenderU.File=/var/log/sparkU.log
log4j.appender.RollingAppenderU.DatePattern='.'yyyy-MM-dd
log4j.appender.RollingAppenderU.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingAppenderU.layout.ConversionPattern=[%p] %d %c %M - %m%n
log4j.appender.fileAppender.MaxFileSize=1MB
log4j.appender.fileAppender.MaxBackupIndex=1
/usr/bin/spark-submit --master yarn --deploy-mode client /mypath/test_log.py
我想使用jobLogger在/var/log/sparkU.log中保存一个文件。 我用Python创建了一个小程序,可以打印一些特定的消息:

from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext, SparkSession
from pyspark.sql.types import *

spark = SparkSession \
        .builder \
    .master("yarn") \
        .appName("test custom logging") \
        .config("spark.some.config.option", "some-value") \
        .getOrCreate()

log4jLogger = spark.sparkContext._jvm.org.apache.log4j 
log = log4jLogger.LogManager.getLogger("jobLogger") 

log.info("Info message")
log.warn("Warn message")
log.error("Error message")
我是这样提交的:

log4j.rootLogger=${root.logger}
root.logger=WARN,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
shell.log.level=WARN
log4j.logger.org.eclipse.jetty=WARN
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
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
log4j.logger.org.apache.spark.repl.Main=${shell.log.level}
log4j.logger.org.apache.spark.api.python.PythonGatewayServer=${shell.log.level}

#My logger to write usefull messages in a local file
log4j.logger.jobLogger=INFO, RollingAppenderU

log4j.appender.RollingAppenderU=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingAppenderU.File=/var/log/sparkU.log
log4j.appender.RollingAppenderU.DatePattern='.'yyyy-MM-dd
log4j.appender.RollingAppenderU.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingAppenderU.layout.ConversionPattern=[%p] %d %c %M - %m%n
log4j.appender.fileAppender.MaxFileSize=1MB
log4j.appender.fileAppender.MaxBackupIndex=1
/usr/bin/spark-submit --master yarn --deploy-mode client /mypath/test_log.py
当我使用部署模式客户端时,文件被写入到所需的位置。当我使用部署模式集群时,不会写入本地文件,但可以在日志中找到消息。但在这两种模式的纱线日志中,我也采用了这个错误(纱线日志中火花簇模式的输出):

log4j:错误setFile(null,true)调用失败。
java.io.FileNotFoundException:/var/log/sparkU.log(权限被拒绝)
在java.io.FileOutputStream.open(本机方法)
位于java.io.FileOutputStream。(FileOutputStream.java:221)
位于java.io.FileOutputStream。(FileOutputStream.java:142)
位于org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
位于org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
位于org.apache.log4j.dailrollingfileappender.activateOptions(dailrollingfileappender.java:223)
位于org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
位于org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
位于org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
位于org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
位于org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
位于org.apache.log4j.PropertyConfigurator.parsecatsandrenders(PropertyConfigurator.java:672)
位于org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:516)
位于org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
在org.apache.log4j.helpers.OptionConverter.selectAndConfigure上(OptionConverter.java:526)
登录org.apache.log4j.LogManager(LogManager.java:127)
位于org.apache.spark.internal.Logging$class.initializeLogging(Logging.scala:117)
在org.apache.spark.internal.Logging$class.initializeLogif上(Logging.scala:102)
在org.apache.spark.deploy.warn.ApplicationMaster$.InitializeLogif上(ApplicationMaster.scala:746)
位于org.apache.spark.internal.Logging$class.log(Logging.scala:46)
位于org.apache.spark.deploy.warn.ApplicationMaster$.log(ApplicationMaster.scala:746)
位于org.apache.spark.deploy.warn.ApplicationMaster$.main(ApplicationMaster.scala:761)
位于org.apache.spark.deploy.warn.ApplicationMaster.main(ApplicationMaster.scala)
log4j:错误没有为appender[RollingAppenderU]设置文件或日期模式选项。
18/01/15 12:13:00 WARN spark.SparkContext:自spark 2.0.0起,不推荐对Java 7的支持
18/01/15 12:13:02警告群集。YarnSchedulerBackend$YarnSchedulerEndpoint:试图在AM注册之前请求执行者!
18/01/15 12:13:04信息作业记录器:信息消息
18/01/15 12:13:04警告作业记录器:警告消息
18/01/15 12:13:04错误作业记录器:错误消息
所以我有两个问题:

-为什么打印第一条错误消息(java.io.FileNotFoundException)?我怀疑这是来自应用程序的主记录器,但如何阻止它打印此错误?我只希望执行者使用文件记录器

-是否可以使用群集模式,并且仍然能够在其中一台计算机中的特定文件上进行写入?我想知道我是否可以输入一个类似host:port/myPath/spark.log的路径,所有的执行者都会在其中一台机器上写入该文件。  
提前感谢您的回复。

我能够使用自定义记录器在群集模式下在本地文件中添加数据

首先,在所有集群工作节点中,我在同一目录(例如/home/myUser/log4j.custom.properties)中提供了log4j文件,并在同一节点中创建了一个文件夹,以将日志保存在我的用户路径(例如/home/myUser/sparkLogs)中

之后,在submit中,我将该文件作为驱动程序记录器传递,并使用驱动程序java选项,这就完成了。我使用此提交(log4j文件与以前相同):