我希望使用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秒执行一次加载工作。
建议?
答案 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());
注意事项
FILE_LOADS
和STREAMING_INSERT
,如果使用第一个方法,则需要包括withTriggeringFrequency
和withNumFileShards
。根据我的经验,对于第一个而言,最好使用分钟,并且数量取决于吞吐量数据的数量。如果您收到很多尝试将其保持较小的值,则将其增加太多时,我会看到“卡住的错误”。这些分片会在很大程度上影响您的GCS帐单,如果您增加很多分片,则每x分钟数量的表会创建更多文件。STREAMING_INSERT
方法并删除withTriggeringFrequency
和withNumFileShards
。另外,您可以像withFailedInsertRetryPolicy
一样添加InsertRetryPolicy.retryTransientErrors()
,这样就不会丢失任何行(请注意,使用STREAM_INSERTS不能保证幂等,因此可以进行复制)注意:您始终可以阅读有关有效聚合管道https://cloud.google.com/blog/products/data-analytics/how-to-efficiently-process-both-real-time-and-aggregate-data-with-dataflow
的文章