从Google云中的spark worker获取日志输出

时间:2016-07-20 13:48:43

标签: apache-spark log4j google-cloud-platform yarn google-cloud-dataproc

我正在谷歌群集中运行一个火花工作,我正在尝试在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并结合找到的指示in the Spark webpage。生成的log4j.properties是最后显示的属性。使用--files命令的gcloud标志上传文件(如下所示)。我还更新了yarn-site.xml文件,以便将属性yarn.log-aggregation-enable设置为true

我的第一个问题是,当我从主节点yarn logs -application <applicationID>运行时,我总是收到错误消息&#34;日志聚合尚未完成或未启用。&#34;收集消息还有什么必要吗?

第二个问题是,当进程正在运行时,是否可以在控制台输出中获取所有工作程序的日志消息。例如,如果spark作业是一个流媒体作业,那么我想在作业运行时获取消息。

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.$1 <application-arguments>

1 个答案:

答案 0 :(得分:4)

正如您在ContainerManagerImpl中所看到的,检查是否启用了日志聚合是在nodemanager代码中:

LogHandler

另外,在第一次创建yarn-site.xml实例时,似乎也是初始化的一部分;这意味着必须将配置值提供给所有工作节点,并且必须在启动/重新启动nodemanagers之前在配置中。

在Dataproc中,您不必自己手动修改--properties文件,而是在创建群集时使用更简单的gcloud dataproc clusters create my-cluster \ --properties yarn:yarn.log-aggregation-enable=true 标记,并且在守护程序之前将在所有节点中正确设置配置密钥服务启动:

yarn logs

此外,您需要确保以运行作业的同一用户运行$USER命令,否则YARN将尝试查看日志聚合中错误的sudo yarn logs -applicationId <applicationId> 目录目录:

display:block