Apache spark 我应该使用哪个记录器在云日志中获取数据

Apache spark 我应该使用哪个记录器在云日志中获取数据,apache-spark,pyspark,google-cloud-dataproc,google-cloud-logging,Apache Spark,Pyspark,Google Cloud Dataproc,Google Cloud Logging,我正在使用CloudDataProc运行PySpark作业,并希望使用Python的日志记录模块记录信息。目标是将这些日志推送到云日志中 从中,我了解到我可以通过在fluentd配置中添加一个日志文件来实现这一点,该配置位于/etc/google fluentd/google fluentd.conf 但是,当我查看/var/log中的日志文件时,找不到包含日志的文件。我已经尝试使用默认的python记录器和'py4j'记录器 logger = logging.getLogger() logge

我正在使用CloudDataProc运行PySpark作业,并希望使用Python的
日志记录
模块记录信息。目标是将这些日志推送到云日志中

从中,我了解到我可以通过在fluentd配置中添加一个日志文件来实现这一点,该配置位于
/etc/google fluentd/google fluentd.conf

但是,当我查看
/var/log
中的日志文件时,找不到包含日志的文件。我已经尝试使用默认的python记录器和'py4j'记录器

logger = logging.getLogger()
logger = logging.getLogger('py4j')
谁能告诉我应该使用哪个记录器,以及应该将哪个文件添加到fluentd配置中

谢谢

tl;博士

这目前不受本机支持,但在Cloud Dataproc的未来版本中将受到本机支持。这就是说,在此期间有一个手动解决方案

变通办法

首先,确保从spark上下文将python日志发送到正确的log4j记录器。要执行此操作,请将记录器声明为:

import pyspark
sc = pyspark.SparkContext()
logger = sc._jvm.org.apache.log4j.Logger.getLogger(__name__)
第二部分涉及到一个本机还不支持的变通方法。如果查看下的spark属性文件

/etc/spark/conf/log4j.properties
在集群的主机上,您可以看到如何为spark配置log4j。目前看起来如下所示:

# Set everything to be logged to the console
log4j.rootCategory=INFO, 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: %m%n

# Settings to quiet third party logs that are too verbose
...
注意,这意味着log4j日志只发送到控制台。dataproc代理将获取此输出并将其作为输出返回。然而,为了让fluentd获取输出并将其发送到Google Cloud Logging,您需要log4j来写入本地文件。因此,您需要修改log4j属性,如下所示:

# Set everything to be logged to the console and a file
log4j.rootCategory=INFO, console, file
# Set up console appender.
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: %m%n

# Set up file appender.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/var/log/spark/spark-log4j.log
log4j.appender.file.MaxFileSize=512KB
log4j.appender.file.MaxBackupIndex=3
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c: %m%n

# Settings to quiet third party logs that are too verbose
...

如果如上所示将文件设置为/var/log/spark/spark-log4j.log,那么Dataproc集群上的默认fluentd配置应该会将其选中。如果要将该文件设置为其他文件,可以按照中的说明让fluentd提取该文件。

将文件附加器设置添加到配置文件中,然后重置我的DataProc群集并运行作业后,我在云日志中找不到我的日志。但是,我注意到
/var/log/spark/
目录中不存在
spark-log4j.log
文件。我是否需要执行任何其他步骤才能使log4j登录到该文件。此外,我看不出这种方法在executor节点上如何工作,因为它们无法访问spark上下文以连接到JVM。