BigQueryIO - 无法使用DynamicDestination和CREATE_IF_NEEDED进行无界PCollection和FILE_LOADS

时间:2018-03-12 17:57:24

标签: google-cloud-platform google-bigquery google-cloud-dataflow apache-beam

我的工作流程:KAFKA - >数据流流 - >大量查询

鉴于在我的情况下具有低延迟并不重要,我使用 FILE_LOADS 来降低成本。我使用 BigQueryIO.Write DynamicDestination (每小时一个新表,当前小时作为后缀)。

这个BigQueryIO.Write配置如下:

.withCreateDisposition(CreateDisposition.CREATE_IF_NEEDED)
.withMethod(Method.FILE_LOADS)
.withTriggeringFrequency(triggeringFrequency)
.withNumFileShards(100)

第一个表已成功创建并写入。但是接下来的表永远不会被创建,我得到了这些例外:

(99e5cd8c66414e7a): java.lang.RuntimeException: Failed to create load job with id prefix 5047f71312a94bf3a42ee5d67feede75_5295fbf25e1a7534f85e25dcaa9f4986_00001_00023, reached max retries: 3, last failed load job: {
  "configuration" : {
    "load" : {
      "createDisposition" : "CREATE_NEVER",
      "destinationTable" : {
        "datasetId" : "dev_mydataset",
        "projectId" : "myproject-id",
        "tableId" : "mytable_20180302_16"
      },

对于第一个表, CreateDisposition 使用的是指定的 CREATE_IF_NEEDED ,但是不考虑此参数,并且 CREATE_NEVER 由默认值。

我还在JIRA上创建了issue

2 个答案:

答案 0 :(得分:1)

根据documentation of Apache Beam's BigQueryIO,方法BigQueryIO.Write.CreateDisposition要求在使用 CREATE_IF_NEEDED 时使用the precondition .withSchema()提供表架构。

正如Dataflow documentation中所述:

  

请注意,如果您将CREATE_IF_NEEDED指定为CreateDisposition和   您没有提供TableSchema,转换可能在运行时失败   如果目标表没有,则为 java.lang.IllegalArgumentException   存在。

文档说明的错误与您收到的错误不同(获得java.lang.RuntimeException),但根据您共享的BigQueryIO.Write()配置,您没有指定任何表模式,因此,如果缺少表格,工作很容易失败。

因此,作为解决问题的第一个措施,您应该创建与将加载到BQ的数据匹配的表架构TableSchema(),然后相应地使用前置条件.withSchema(schema)

List<TableFieldSchema> fields = new ArrayList<>();
// Add fields like:
fields.add(new TableFieldSchema().setName("<FIELD_NAME>").setType("<FIELD_TYPE>"));
TableSchema schema = new TableSchema().setFields(fields);

// BigQueryIO.Write configuration plus:
    .withSchema(schema)

答案 1 :(得分:0)

这是 Beam 中的一个错误:https://issues.apache.org/jira/browse/BEAM-3772

2.27 版本仍然开放

我开发了一个解决方法:我编写了一个自定义 PTransform,它在 BigqueryIO.Write 阶段之前创建了一个空表。它使用 bigquery java 客户端。您可以在此处查看以获取灵感: https://gist.github.com/matthieucham/85459eff5fdea8d115be520e2dd5ccc1