通过加载作业插入BigQuery(不是流式)

时间:2015-06-16 19:19:22

标签: google-bigquery google-cloud-dataflow

我希望使用Dataflow使用BQ load jobs将数据加载到BigQuery表中 - 不流式传输(流式传输对我们的用例来说会花费太多)。我看到Dataflow SDK内置支持通过BQ流插入数据,但我无法在Dataflow SDK中找到任何支持开箱即用的加载作业的内容。

有些问题:

1)Dataflow SDK是否对BigQuery加载作业插入有OOTB支持?如果没有,是否有计划?

2)如果我需要自己动手,有什么好办法?

如果我必须自己动手,使用Google云端存储执行BQ加载作业是一个多步骤的过程 - 将文件写入GCS,通过BQ API提交加载作业,并(可选)检查状态,直到工作已完成(或失败)。我希望我可以使用现有的TextIO.write()功能写入GCS,但我不确定如何通过后续调用BQ API来提交加载作业(以及可选的后续调用以检查作业状态,直到完成为止。

另外,我将在流模式下使用Dataflow,窗口为60秒 - 所以我还想每60秒执行一次加载工作。

建议?

2 个答案:

答案 0 :(得分:0)

当输入BigQueryIO.write()有界时,

PCollection始终使用BigQuery加载作业。如果您希望在无限制时使用它们,请指定.withMethod(FILE_LOADS).withTriggeringFrequency(...)

答案 1 :(得分:0)

我不确定您使用的是哪个版本的Apache Beam,但是现在可以通过Stream Pipeline使用微批处理策略。如果您决定一种或另一种方式,则可以使用以下方式:

.apply("Saving in batches", BigQueryIO.writeTableRows()
                    .to(destinationTable(options))
                    .withMethod(Method.FILE_LOADS)
                    .withJsonSchema(myTableSchema)
                    .withCreateDisposition(CreateDisposition.CREATE_IF_NEEDED)
                    .withWriteDisposition(WriteDisposition.WRITE_APPEND)
                    .withExtendedErrorInfo()
                    .withTriggeringFrequency(Duration.standardMinutes(2))
                    .withNumFileShards(1);
                    .optimizedWrites());

注意事项

  1. 有2种不同的方法:FILE_LOADSSTREAMING_INSERT,如果使用第一个方法,则需要包括withTriggeringFrequencywithNumFileShards。根据我的经验,对于第一个而言,最好使用分钟,并且数量取决于吞吐量数据的数量。如果您收到很多尝试将其保持较小的值,则将其增加太多时,我会看到“卡住的错误”。这些分片会在很大程度上影响您的GCS帐单,如果您增加很多分片,则每x分钟数量的表会创建更多文件。
  2. 如果输入数据的大小不是很大,则流插入可以很好地工作,并且成本也不是什么大问题。在这种情况下,您可以使用STREAMING_INSERT方法并删除withTriggeringFrequencywithNumFileShards。另外,您可以像withFailedInsertRetryPolicy一样添加InsertRetryPolicy.retryTransientErrors(),这样就不会丢失任何行(请注意,使用STREAM_INSERTS不能保证幂等,因此可以进行复制)
  3. 您可以在BigQuery中检查您的工作,并验证一切是否正常!尝试定义触发频率和分片时,请记住使用BigQuery的作业策略(我认为每个表1000个作业)。
  

注意:您始终可以阅读有关有效聚合管道https://cloud.google.com/blog/products/data-analytics/how-to-efficiently-process-both-real-time-and-aggregate-data-with-dataflow

的文章