从 google 云中的 spark worker 获取日志输出
Getting log output from spark workers in google cloud
我正在 运行 在 google 集群中执行一个 spark 作业,我正在尝试在 RDD 映射过程中获取一些日志记录信息。快速示例:
object LoggerWrapper extends Serializable{
@transient lazy val logger=Logger.getLogger("myLogger")
}
object Processing{
...
rdd.map(x=>{
LoggerWrapper.logger.info("processing:"+x)
foo(x)
})
...
sparkContext.stop
}
我正在遵循 here combined with the directions found in the Spark webpage 中描述的方法。结果 log4j.properties 就是最后显示的那个。使用 gcloud
命令的 --files
标志上传文件(如下所示)。我还更新了 yarn-site.xml 文件,以便 属性 yarn.log-aggregation-enable
设置为 true
.
我的第一个问题是,当我从主节点 运行 yarn logs -application <applicationID>
我总是收到错误消息 "Log aggregation has not completed or is not enabled." 是否还有其他需要做的事情来收集留言。
第二个问题是,如果进程是 运行ning,是否可以在控制台输出中获取所有工作人员的日志消息。例如,如果 spark 作业是流式作业,那么我想在作业 运行ning 时获取消息。
log4j.properties:
log4j.appender.myConsoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.myConsoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.myConsoleAppender.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.RollingAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingAppender.File=${spark.yarn.app.container.log.dir}/spark.log
log4j.appender.RollingAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.RollingAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingAppender.layout.ConversionPattern=[%p] %d %c %M - %m%n
log4j.appender.RollingAppenderU=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingAppenderU.File=${spark.yarn.app.container.log.dir}/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
# By default, everything goes to console and file
log4j.rootLogger=INFO, RollingAppender, myConsoleAppender
# My custom logging goes to another file
log4j.logger.myLogger=INFO, RollingAppenderU, myConsoleAppender
# The noisier spark logs go to file only
log4j.logger.spark.storage=INFO, RollingAppender
log4j.additivity.spark.storage=false
log4j.logger.spark.scheduler=INFO, RollingAppender
log4j.additivity.spark.scheduler=false
log4j.logger.spark.CacheTracker=INFO, RollingAppender
log4j.additivity.spark.CacheTracker=false
log4j.logger.spark.CacheTrackerActor=INFO, RollingAppender
log4j.additivity.spark.CacheTrackerActor=false
log4j.logger.spark.MapOutputTrackerActor=INFO, RollingAppender
log4j.additivity.spark.MapOutputTrackerActor=false
log4j.logger.spark.MapOutputTracker=INFO, RollingAppender
log4j.additivty.spark.MapOutputTracker=false
gcloud 命令:
gcloud dataproc jobs submit spark --cluster myCluster
--properties spark.driver.memory=1000m,spark.driver.maxResult=512m,spark.executor.memory=1000m --jars gs://path/to/jar/myJar.jar --files /absolute/path/to/local/file/log4j.properties
--class contextual.wikidata.spark.jobs. <application-arguments>
正如您在 ContainerManagerImpl 中所见,检查是否启用日志聚合是在节点管理器代码中:
protected LogHandler createLogHandler(Configuration conf, Context context,
DeletionService deletionService) {
if (conf.getBoolean(YarnConfiguration.LOG_AGGREGATION_ENABLED,
YarnConfiguration.DEFAULT_LOG_AGGREGATION_ENABLED)) {
return new LogAggregationService(this.dispatcher, context,
deletionService, dirsHandler);
} else {
return new NonAggregatingLogHandler(this.dispatcher, deletionService,
dirsHandler,
context.getNMStateStore());
}
}
另外似乎是作为初始化的一部分完成的,在第一次创建 LogHandler
实例时;这意味着配置值必须提供给所有工作节点,并且必须在节点管理器的 startup/restart 之前的配置中。
在 Dataproc 中,无需自己手动修改 yarn-site.xml
文件,您只需在创建集群时使用更简单的 --properties
标志,配置键将在您的所有节点中正确设置在守护进程服务启动之前:
gcloud dataproc clusters create my-cluster \
--properties yarn:yarn.log-aggregation-enable=true
此外,您需要确保 运行 您的 yarn logs
命令与 运行 作业或 YARN 将尝试查看错误内容的同一用户 $USER
日志聚合目录中的目录:
sudo yarn logs -applicationId <applicationId>
我正在 运行 在 google 集群中执行一个 spark 作业,我正在尝试在 RDD 映射过程中获取一些日志记录信息。快速示例:
object LoggerWrapper extends Serializable{
@transient lazy val logger=Logger.getLogger("myLogger")
}
object Processing{
...
rdd.map(x=>{
LoggerWrapper.logger.info("processing:"+x)
foo(x)
})
...
sparkContext.stop
}
我正在遵循 here combined with the directions found in the Spark webpage 中描述的方法。结果 log4j.properties 就是最后显示的那个。使用 gcloud
命令的 --files
标志上传文件(如下所示)。我还更新了 yarn-site.xml 文件,以便 属性 yarn.log-aggregation-enable
设置为 true
.
我的第一个问题是,当我从主节点 运行 yarn logs -application <applicationID>
我总是收到错误消息 "Log aggregation has not completed or is not enabled." 是否还有其他需要做的事情来收集留言。
第二个问题是,如果进程是 运行ning,是否可以在控制台输出中获取所有工作人员的日志消息。例如,如果 spark 作业是流式作业,那么我想在作业 运行ning 时获取消息。
log4j.properties:
log4j.appender.myConsoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.myConsoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.myConsoleAppender.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.RollingAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingAppender.File=${spark.yarn.app.container.log.dir}/spark.log
log4j.appender.RollingAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.RollingAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingAppender.layout.ConversionPattern=[%p] %d %c %M - %m%n
log4j.appender.RollingAppenderU=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingAppenderU.File=${spark.yarn.app.container.log.dir}/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
# By default, everything goes to console and file
log4j.rootLogger=INFO, RollingAppender, myConsoleAppender
# My custom logging goes to another file
log4j.logger.myLogger=INFO, RollingAppenderU, myConsoleAppender
# The noisier spark logs go to file only
log4j.logger.spark.storage=INFO, RollingAppender
log4j.additivity.spark.storage=false
log4j.logger.spark.scheduler=INFO, RollingAppender
log4j.additivity.spark.scheduler=false
log4j.logger.spark.CacheTracker=INFO, RollingAppender
log4j.additivity.spark.CacheTracker=false
log4j.logger.spark.CacheTrackerActor=INFO, RollingAppender
log4j.additivity.spark.CacheTrackerActor=false
log4j.logger.spark.MapOutputTrackerActor=INFO, RollingAppender
log4j.additivity.spark.MapOutputTrackerActor=false
log4j.logger.spark.MapOutputTracker=INFO, RollingAppender
log4j.additivty.spark.MapOutputTracker=false
gcloud 命令:
gcloud dataproc jobs submit spark --cluster myCluster
--properties spark.driver.memory=1000m,spark.driver.maxResult=512m,spark.executor.memory=1000m --jars gs://path/to/jar/myJar.jar --files /absolute/path/to/local/file/log4j.properties
--class contextual.wikidata.spark.jobs. <application-arguments>
正如您在 ContainerManagerImpl 中所见,检查是否启用日志聚合是在节点管理器代码中:
protected LogHandler createLogHandler(Configuration conf, Context context,
DeletionService deletionService) {
if (conf.getBoolean(YarnConfiguration.LOG_AGGREGATION_ENABLED,
YarnConfiguration.DEFAULT_LOG_AGGREGATION_ENABLED)) {
return new LogAggregationService(this.dispatcher, context,
deletionService, dirsHandler);
} else {
return new NonAggregatingLogHandler(this.dispatcher, deletionService,
dirsHandler,
context.getNMStateStore());
}
}
另外似乎是作为初始化的一部分完成的,在第一次创建 LogHandler
实例时;这意味着配置值必须提供给所有工作节点,并且必须在节点管理器的 startup/restart 之前的配置中。
在 Dataproc 中,无需自己手动修改 yarn-site.xml
文件,您只需在创建集群时使用更简单的 --properties
标志,配置键将在您的所有节点中正确设置在守护进程服务启动之前:
gcloud dataproc clusters create my-cluster \
--properties yarn:yarn.log-aggregation-enable=true
此外,您需要确保 运行 您的 yarn logs
命令与 运行 作业或 YARN 将尝试查看错误内容的同一用户 $USER
日志聚合目录中的目录:
sudo yarn logs -applicationId <applicationId>