Spark Streaming Standalone:保存日志
Spark Streaming Standalone : Save logs
我正在 运行 在独立设置(版本 1.6.1)上安装 spark-streaming 应用程序。当我 运行 使用 spark-submit 的应用程序时,日志显示在终端上。这些在以后很有用,例如,如果它失败了,了解应用程序失败的原因是什么。
根据我阅读的文档,我将 spark.eventLog.enabled
标志设置为 true。但是,这只会将事件日志保存到 tmp/spark-events 文件夹。在我看来,这些日志对我没有多大用处。由于许多例外情况,我的工作经常失败。存储这些显示在终端中的日志(我猜是驱动程序日志?)并分析我的异常的正确方法是什么?
如果您只想记录发生在驱动程序端的事件,最简单的方法是为spark提供一个日志记录配置文件。默认情况下,spark 使用 log4j 进行日志记录,因此当启动您的 spark-submit 作业时,您可以使用 spark.driver.extraJavaOptions
标志传入您的 log4j 配置,并向其添加一个 RollingFileAppender
:
spark.driver.extraJavaOptions=-Dlog4j.configuration=/path/to/your/log4j.xml
这是 log4j-1.2 rolling appender 的基本模式 xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<logger name="log4j.rootLogger" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="RollingFileAppender"/>
</logger>
</log4j:configuration>
您可以在 spark 文档的 Spark Configuration 部分找到更多信息。
如果您还想记录在驱动程序节点上发生的事件,那么我建议您查看可以从分布式系统收集日志的外部服务。
我将这些行添加到 SPARK_HOME/conf/log4j.properties
log4j.rootLogger=ERROR, file
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 appender。我在这里使用文件附加程序。
P.S stdout 日志仍然丢失。仅保存 stderr 日志。尚未弄清楚原因。
我正在 运行 在独立设置(版本 1.6.1)上安装 spark-streaming 应用程序。当我 运行 使用 spark-submit 的应用程序时,日志显示在终端上。这些在以后很有用,例如,如果它失败了,了解应用程序失败的原因是什么。
根据我阅读的文档,我将 spark.eventLog.enabled
标志设置为 true。但是,这只会将事件日志保存到 tmp/spark-events 文件夹。在我看来,这些日志对我没有多大用处。由于许多例外情况,我的工作经常失败。存储这些显示在终端中的日志(我猜是驱动程序日志?)并分析我的异常的正确方法是什么?
如果您只想记录发生在驱动程序端的事件,最简单的方法是为spark提供一个日志记录配置文件。默认情况下,spark 使用 log4j 进行日志记录,因此当启动您的 spark-submit 作业时,您可以使用 spark.driver.extraJavaOptions
标志传入您的 log4j 配置,并向其添加一个 RollingFileAppender
:
spark.driver.extraJavaOptions=-Dlog4j.configuration=/path/to/your/log4j.xml
这是 log4j-1.2 rolling appender 的基本模式 xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<logger name="log4j.rootLogger" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="RollingFileAppender"/>
</logger>
</log4j:configuration>
您可以在 spark 文档的 Spark Configuration 部分找到更多信息。
如果您还想记录在驱动程序节点上发生的事件,那么我建议您查看可以从分布式系统收集日志的外部服务。
我将这些行添加到 SPARK_HOME/conf/log4j.properties
log4j.rootLogger=ERROR, file
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 appender。我在这里使用文件附加程序。
P.S stdout 日志仍然丢失。仅保存 stderr 日志。尚未弄清楚原因。