Beam 管道在 Google 数据流中不移动,而 运行 在直接运行器上正常

Beam pipeline not moving in Google Dataflow while running ok on direct runner

我在本地有一个 Beam 管道 运行s 以及 DirectRunner。但是,当切换到 DataFlowRunner 时,作业开始了,我可以从 Google 数据流网络 ui 看到流程图。但是,作业没有 运行。它一直挂在那里,直到我停止工作。我正在使用 Beam 2.10。我可以看到自动缩放调整 cpu 并且在日志中没有异常。

我认为这与我创建 Jar 文件的方式有关。我正在使用 shadow Jar 在 gradle build 中创建 jar 文件。使用 ShadowJar 的主要原因是为了 mergeServiceFiles()。如果不使用 mergeServiceFiles(),作业将 运行 异常 No FileSystem found for gs

所以我从 google 数据流模板 repo 中复制了字数并打包为 jar 文件。它显示了同样的事情,工作开始但没有移动。代码已对服务帐户凭据进行了最小更改。我扩展了凭证的 GcsOptions,而不是原来的 PipelineOptions。

试过光束 2.12、2.10。

通过单击所示日志右上角的 stackdrive 挖掘并找到完整的日志。找到以下内容

Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting WhosebugError. See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details. at org.slf4j.impl.Log4jLoggerFactory.<clinit>(Log4jLoggerFactory.java:54) ....

然后有一个 java failed with exit status 1 log4j 错误下的日志条目几行。基本上 java 程序已经停止,但数据流 UI 仍然显示它是流程图上的 运行。

使用 gradle 构建脚本从中排除所有 slf4j-log4j12 compile ('org.apache.hadoop:hadoop-mapreduce-client-core:3.2.0') {exclude group: 'org.slf4j', module: 'slf4j-log4j12'}

其他依赖项包含 slf4j-log4j12 并且作业开始移动。