【问题标题】:BigQuery loads manually but not through the Java SDKBigQuery 手动加载,但不通过 Java SDK
【发布时间】:2017-05-15 09:12:32
【问题描述】:

我有一个在本地运行的 Dataflow 管道。目标是使用 TEXTIO 读取 JSON 文件,创建会话并将其加载到 BigQuery。鉴于结构,我必须在 GCS 中创建一个临时目录,然后使用它将其加载到 BigQuery 中。以前我有一个数据架构错误阻止我加载数据,请参阅here。该问题已解决。

因此,现在当我在本地运行管道时,它以将临时 JSON 换行符分隔文件转储到 GCS 结束。然后 SDK 会为我提供以下信息:

Starting BigQuery load job beam_job_xxxx_00001-1: try 1/3
INFO [main] (BigQueryIO.java:2191) - BigQuery load job failed: beam_job_xxxx_00001-1
...
Exception in thread "main" com.google.cloud.dataflow.sdk.Pipeline$PipelineExecutionException: java.lang.RuntimeException: Failed to create the load job beam_job_xxxx_00001, reached max retries: 3
at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:187)
at pedesys.Dataflow.main(Dataflow.java:148)
Caused by: java.lang.RuntimeException: Failed to create the load job beam_job_xxxx_00001, reached max retries: 3
at com.google.cloud.dataflow.sdk.io.BigQueryIO$Write$WriteTables.load(BigQueryIO.java:2198)
at com.google.cloud.dataflow.sdk.io.BigQueryIO$Write$WriteTables.processElement(BigQueryIO.java:2146)

这些错误描述性不强,数据仍未加载到 BigQuery 中。令人费解的是,如果我转到 BigQuery UI 并从 GCS 加载由 SDK 的 Dataflow 管道手动转储的相同临时文件,在同一张表中,它工作得很好。

相关代码部分如下:

PipelineOptions options = PipelineOptionsFactory.create();
    options.as(BigQueryOptions.class)
            .setTempLocation("gs://test/temp");
    Pipeline p = Pipeline.create(options)
...

...
session_windowed_items.apply(ParDo.of(new FormatAsTableRowFn()))
      .apply(BigQueryIO.Write
      .named("loadJob")
      .to("myproject:db.table")
      .withSchema(schema)
      .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)
      .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
      );

【问题讨论】:

  • 首先要做的是找出错误到底是什么。获取 BigQuery 加载作业 ID (job beam_job__00001-1) 并从命令行 (bq show -j job beam_job_<xxxx>_00001-1) 获取详细信息,或者通过您的浏览器使用 "try it"在页面底部 (cloud.google.com/bigquery/docs/reference/rest/v2/jobs/get)。然后你会知道更多细节。
  • 我提交了issues.apache.org/jira/browse/BEAM-1235 以改进错误报告。
  • 谢谢@jkff,这将非常有帮助,并且会首先阻止这一切:)
  • @GrahamPolley 非常感谢您提供此信息。我调试了它,但是学到了两件事。由于 BigQuery UI 中有一个“工作历史记录”部分,我认为这是一个详尽的列表,并且由于我的 SDK 工作没有在其中列出,我没有寻找其他工作获取者,也可以将工作获取者链接起来到 UI 作业历史记录。
  • @plumSemPy - 好消息!好的,我现在添加一个答案,以便其他人遇到同样的问题时知道该怎么做。

标签: google-bigquery google-cloud-storage google-cloud-dataflow


【解决方案1】:

SDK 正在处理错误/异常,而不是向用户报告。这很可能是架构问题。要获取正在发生的实际错误,您需要通过以下任一方式获取作业详细信息:

  1. CLI - bq show -j job beam_job_<xxxx>_00001-1
  2. 浏览器/网络:使用页面底部的“试用”here

@jkff 提出了一个问题here 以改进错误报告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多