使用 BigQueryTableInserter 的 addShutdownHook 上的 SecurityException 启动带有 App Engine 错误的数据流作业

Kicking off Dataflow Jobs with App Engine errors with a SecurityException on addShutdownHook for BigQueryTableInserter

我正在尝试通过(已经存在的)AppEngine 应用程序启动数据流作业。 DataFlow 作业读取存储在 DataStore 中的 GAE 应用程序生成的数据,并将处理后的数据写入 BigQuery。我收到以下错误。

java.lang.SecurityException: Google App Engine does not support Runtime.addShutdownHook
at com.google.appengine.runtime.Request.process-a010d936cef53bc8(Request.java)
at java.lang.Runtime.addShutdownHook(Runtime.java:46)
at com.google.cloud.dataflow.sdk.repackaged.com.google.common.util.concurrent.MoreExecutors$Application.addShutdownHook(MoreExecutors.java:232)
at com.google.cloud.dataflow.sdk.repackaged.com.google.common.util.concurrent.MoreExecutors$Application.addDelayedShutdownHook(MoreExecutors.java:204)
at com.google.cloud.dataflow.sdk.repackaged.com.google.common.util.concurrent.MoreExecutors$Application.getExitingExecutorService(MoreExecutors.java:188)
at com.google.cloud.dataflow.sdk.repackaged.com.google.common.util.concurrent.MoreExecutors.getExitingExecutorService(MoreExecutors.java:89)
at com.google.cloud.dataflow.sdk.util.BigQueryTableInserter.<clinit>(BigQueryTableInserter.java:79)
at com.google.cloud.dataflow.sdk.io.BigQueryIO$Write$Bound.verifyTableEmpty(BigQueryIO.java:886)
at com.google.cloud.dataflow.sdk.io.BigQueryIO$Write$Bound.apply(BigQueryIO.java:942)
at com.google.cloud.dataflow.sdk.io.BigQueryIO$Write$Bound.apply(BigQueryIO.java:724)
at com.google.cloud.dataflow.sdk.runners.PipelineRunner.apply(PipelineRunner.java:74)
at com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.apply(DataflowPipelineRunner.java:327)
at com.google.cloud.dataflow.sdk.Pipeline.applyInternal(Pipeline.java:367)
at com.google.cloud.dataflow.sdk.Pipeline.applyTransform(Pipeline.java:274)
at com.google.cloud.dataflow.sdk.values.PCollection.apply(PCollection.java:161)

有没有一种方法可以在通过 GAE 启动时在数据流中写入 BigQuery table?我将 运行ner 设置为 DataflowPipelineRunner,因此它不应该在 GAE 实例本身上尝试 运行 它。 (有办法验证吗?)

DataflowPipelineRunner 正在尝试在将作业提交到 Google Cloud Dataflow 服务之前验证您的管道。在此堆栈跟踪中,我们尝试验证目标 BigQuery table 是否为空。

在此过程中,我们初始化了一个 ExecutorService,在 Google App Engine 中不允许 运行。这很不幸,因为在这种情况下这并不是严格需要的。此问题的修复被跟踪为 BEAM-142,请检查那里是否有任何更新。

解决方法是在 App Engine 环境中禁用验证。在您的 BigQuery 接收器中使用 BigQueryIO.Write.withoutValidation()

您可以尝试使用 App Engine 柔性环境,它在允许的 JRE 方面不像 App Engine 标准那样严格 类。