【问题标题】:Getting log output from spark workers in google cloud从谷歌云中的火花工作者获取日志输出
【发布时间】:2016-11-23 19:15:49
【问题描述】:

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

我的第一个问题是,当我从主节点yarn logs -application <applicationID> 运行时,我总是收到错误消息“日志聚合尚未完成或未启用”。是否还有其他需要做的事情来收集消息。

第二个问题是是否有可能在进程运行时在控制台输出中获取所有工作人员的日志消息。例如,如果 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>

【问题讨论】:

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


    【解决方案1】:

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

    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 实例时;这意味着配置值必须提供给所有工作节点,并且必须在节点管理器启动/重启之前在配置中。

    在 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>
    

    【讨论】:

    • 非常感谢您的回答!是否可以在流处理仍在运行时读取流作业中的自定义日志?
    • 目前最好的方法可能是通过YARN UI 并通过单击到正在运行的应用程序并在左侧找到指向容器日志的链接直接导航到容器日志 -边。未来计划继续改进 Dataproc 的 Stackdriver 集成,通过 Cloud Logging UI 可以访问容器日志,但具体日期尚未确定。
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2020-11-04
    • 2020-04-01
    相关资源
    最近更新 更多