在 Dataflow 中从 BigQuery 写入云存储时如何设置文件大小而不是分片数
Posted
技术标签:
【中文标题】在 Dataflow 中从 BigQuery 写入云存储时如何设置文件大小而不是分片数【英文标题】:How to set file size instead of number of shards when writing from BigQuery to Cloud Storage in Dataflow 【发布时间】:2019-09-18 21:11:44 【问题描述】:目前使用 Dataflow 从 BigQuery 中读取表数据,并使用一定数量的分片写入 Cloud Storage。
//Read Main Input
PCollection<TableRow> input = pipeline.apply("ReadTableInput",
BigQueryIO.readTableRows().from("dataset.table"));
// process and write files
input.apply("ProcessRows", ParDo.of(new Process())
.apply("WriteToFile", TextIO.write()
.to(outputFile)
.withHeader(HEADER)
.withSuffix(".csv")
.withNumShards(numShards));
为了管理文件大小,我们估计了将文件保持在特定大小之下所需的分片总数。
有没有办法代替设置分片数量,设置文件大小并让分片动态化?
【问题讨论】:
【参考方案1】:按照设计,这是不可能的。如果您深入了解 Beam 的核心,您会以编程方式定义执行图,然后运行它。该过程在同一节点或多个节点/VM 上是大规模并行的(ParDo
表示“并行执行”)。
这里的分片数就是并行写入文件的“写入器”的数量。然后 PCollection 将被拆分到所有 worker 写入。
大小是非常可变的(例如消息的大小,文本编码、压缩与否以及压缩因子,...),Beam 不能依赖它来构建它的图表。
【讨论】:
以上是关于在 Dataflow 中从 BigQuery 写入云存储时如何设置文件大小而不是分片数的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 Dataflow 写入 Bigquery 非常慢?
如何使用在 Dataflow 执行期间计算的架构写入 BigQuery?
如何使用 python 将字典写入 Dataflow 中的 Bigquery