【问题标题】:Kicking off Dataflow Jobs with App Engine errors with a SecurityException on addShutdownHook for BigQueryTableInserter在 BigQueryTableInserter 的 addShutdownHook 上使用带有 SecurityException 的 App Engine 错误启动 Dataflow 作业
【发布时间】:2016-03-21 22:02:12
【问题描述】:

我正在尝试通过(已经存在的)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 表?我将运行器设置为DataflowPipelineRunner,因此它不应该尝试在 GAE 实例本身上运行它。 (有没有办法验证?)

【问题讨论】:

    标签: google-app-engine google-cloud-dataflow


    【解决方案1】:

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

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

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

    【讨论】:

    • BEAM-142 已经解决了一段时间,但在我看来,它还没有移植到 Dataflow SDK(甚至没有移植到 master 分支)。你知道这是否/何时会发生吗?
    • 您好 Helder,很遗憾,Dataflow 不再支持 AppEngine 标准——出于关键的稳定性原因,我们现在依赖一些 JNI 代码。正如 Mete 所指出的,可以从 App Engine Flex 提交 Dataflow 作业。
    • @Dan 有点不幸的是,Google 正在推动我们使用仍处于测试阶段且没有 SLA (AppEngine Flex) 的技术,而我们正在生产中运行该技术并且需要满足 SLA。无论如何感谢您的更新。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 2018-03-26
      • 2021-08-13
      • 1970-01-01
      • 2017-11-30
      • 2012-02-25
      • 2018-01-03
      相关资源
      最近更新 更多