首页 > 解决方案 > Dataproc 中 Apache Beam 上的管道转换日志记录

问题描述

最近,我部署了一个非常简单的 Apache Beam 管道,以深入了解它在 Dataproc 中的执行行为,而不是在我的本地计算机上。我很快意识到,在执行任何DoFn或转换级别的日志记录后,Google Cloud Console 内的作业日志中都没有出现我所期望的,而且我不完全确定可能缺少什么。

所有高级日志消息都按预期发出:

// This works
log.info("Testing logging operations...")

pipeline
    .apply(Create.of(...))
    .apply(ParDo.of(LoggingDoFn))

这里的LoggingDoFn类是一个非常基本的转换,它发出它遇到的每个值,如下所示:

object LoggingDoFn : DoFn<String, ...>() {
    private val log = LoggerFactory.getLogger(LoggingDoFn::class.java)
    
    @ProcessElement
    fun processElement(c: ProcessContext) {
        // This is never emitted within the logs
        log.info("Attempting to parse ${c.element()}")
    }
}

正如评论中详述的那样,我可以在processElement()调用之外看到日志消息(大概是因为这些消息是由 Spark 运行程序执行的),但是有没有办法在内部转换中轻松公开这些消息?查看与此作业相关的日志时,我们可以看到更高级别的日志记录,但没有提及来自以下内容的“尝试解析...”消息DoFn

GCP 日志记录

作业本身由以下gcloud命令执行,该命令明确定义了驱动程序日志级别,但可能需要添加另一个级别的日志记录或配置:

gcloud dataproc jobs submit spark --jar=gs://some_bucket/deployment/example.jar --project example-project --cluster example-cluster --region us-example --driver-log-levels com.example=DEBUG -- --runner=SparkRunner --output=gs://some_bucket/deployment/out

总而言之,对于通常分配给 Spark 运行程序本身的任务(例如processElement()),日志消息不会发送到 Google Cloud Console。我不确定这是与配置相关的问题还是完全其他问题。

标签: apache-sparkloggingapache-beamgcloudgoogle-cloud-dataproc

解决方案


推荐阅读