【问题标题】:Why does my Dataflow output "timeout value is negative" on insertion to BigQuery?为什么我的 Dataflow 在插入 BigQuery 时输出“超时值为负”?
【发布时间】:2017-02-07 00:52:50
【问题描述】:

我有一个 Dataflow 作业,其中包括 ReadSource、ParDo、Windowing、Insert(到 BigQuery 中的日期分区表中)。

基本上是这样的:

  1. 使用 glob 从 Google 存储桶中读取文本文件
  2. 通过在分隔符上拆分处理每一行,在为每列指定名称和数据类型之前更改一些值,然后输出为 BigQuery 表行以及基于数据的时间戳
  3. 使用步骤 2 中的时间戳的每日窗口窗口
  4. 写入 BigQuery,使用 Window 表和“dataset$datepartition”语法来指定表和分区。将处置集创建为 CREATE_IF_NEEDED,并将处置集写入为 WRITE_APPEND。

前三个步骤似乎运行良好,但在大多数情况下,作业在最后一个插入步骤中遇到问题,导致日志中出现异常:

java.lang.IllegalArgumentException: timeout value is negative at java.lang.Thread.sleep(Native Method) 
at com.google.cloud.dataflow.sdk.util.BigQueryTableInserter.insertAll(BigQueryTableInserter.java:287) 
at com.google.cloud.dataflow.sdk.io.BigQueryIO$StreamingWriteFn.flushRows(BigQueryIO.java:2446) 
at com.google.cloud.dataflow.sdk.io.BigQueryIO$StreamingWriteFn.finishBundle(BigQueryIO.java:2404) 
at com.google.cloud.dataflow.sdk.util.DoFnRunnerBase.finishBundle(DoFnRunnerBase.java:158) 
at com.google.cloud.dataflow.sdk.runners.worker.SimpleParDoFn.finishBundle(SimpleParDoFn.java:196) 
at com.google.cloud.dataflow.sdk.runners.worker.ForwardingParDoFn.finishBundle(ForwardingParDoFn.java:47) 
at com.google.cloud.dataflow.sdk.util.common.worker.ParDoOperation.finish(ParDoOperation.java:65) 
at com.google.cloud.dataflow.sdk.util.common.worker.MapTaskExecutor.execute(MapTaskExecutor.java:80) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.executeWork(DataflowWorker.java:287) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.doWork(DataflowWorker.java:223) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.getAndPerformWork(DataflowWorker.java:173) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.doWork(DataflowWorkerHarness.java:193) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.call(DataflowWorkerHarness.java:173) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.call(DataflowWorkerHarness.java:160) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745)

这个异常重复了十次。

最后我得到“工作流程失败”如下:

Workflow failed. Causes: S04:Insert/DataflowPipelineRunner.BatchBigQueryIOWrite/BigQueryIO.StreamWithDeDup/Reshuffle/ 
GroupByKey/Read+Insert/DataflowPipelineRunner.BatchBigQueryIOWrite/BigQueryIO.StreamWithDeDup/Reshuffle/GroupByKey/
GroupByWindow+Insert/DataflowPipelineRunner.BatchBigQueryIOWrite/BigQueryIO.StreamWithDeDup/Reshuffle/
ExpandIterable+Insert/DataflowPipelineRunner.BatchBigQueryIOWrite/BigQueryIO.StreamWithDeDup/ParDo(StreamingWrite)
 failed.

有时使用相同输入的相同作业可以毫无问题地工作,但这使得调试非常困难。那么从哪里开始呢?

【问题讨论】:

    标签: google-bigquery google-cloud-dataflow


    【解决方案1】:

    这是一个 known issue,在 Dataflow SDK for Java 1.7.0 中具有 BigQueryIO 流式写入操作。它已在 GitHub HEAD 中修复,该修复将包含在 Dataflow Java SDK 的 1.8.0 版本中。

    更多详情请见Issue #451 on the DataflowJavaSDK GitHub repository

    【讨论】:

    • 有没有办法以批处理模式从 Dataflow 写入日期分区表(其中数据按数据分区,而不是作业运行时的当前时间)?
    • @moonhouse 是可以做到的。您介意将此作为关于 SO 的新问题提出并提供更多详细信息吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多