Google云数据流中Beam应用程序的日志

big*_*ano 5 logging google-cloud-dataflow apache-beam

我有一个Beam应用程序,可以使用directrunner在本地成功运行,并向我提供本地控制台中代码中包含的所有日志信息。但是,当我尝试在google cloud数据流环境中运行它时,我只在本地控制台上看到了这些日志信息,但是它们并没有显示在Google Cloud Console上的数据流作业中,也没有在其StackDriver日志记录页面中显示。

这是我从本地控制台为数据流运行程序运行代码的操作:

mvn compile exec:java -Dexec.mainClass= ... \
                      -Dexec.args=... "   \ 
                      -Pdataflow-runner
Run Code Online (Sandbox Code Playgroud)

并且所有日志都将在此本地控制台上返回。但是,当我在浏览器上转到Google Cloud Console并搜索我的数据流作业日志时,在LOGGER.info(msg)任何地方的代码中都看不到这些日志。我只看到与数据流管道相关的日志。

因此,我想知道我的Beam应用程序是否以这样的方式单独运行,即不在管道内部的主类的一部分在本地运行,并且仅管道代码的一部分会发送到google cloud以便在那里执行。因此,不在管道代码中的那些日志信息将不会在Google Cloud Dataflow日志中提供。

jkf*_*kff 4

你是对的,主程序不在 Google Cloud 上运行 - 它只是构建管道并将其提交到 Dataflow 服务。

您可以通过在调试器中单步调试主程序来轻松确认这一点:它是一个常规的 Java 程序,执行过程中发生的事情之一就是pipeline.run()程序中的调用,它在幕后打包了以下步骤:到目前为止,我们已经将管道插入到对数据流服务的 HTTP 请求中,并表示“这是管道的规范,请运行它”。如果此调用没有发生,或者网络出现故障,Dataflow 甚至永远不会知道您的程序存在。

数据流就是这样 - 一种响应 HTTP 请求的服务 - 它不是运行 Java 程序的不同方式,因此它无法了解程序中未明确发送给它的任何内容;例如,它无法了解您的日志语句。

此外,如果您使用templates,那么主程序的执行与管道的执行完全解耦:主程序提交管道模板并完成,您可以稍后请求使用不同的参数运行模板,可能多次或一点也不。