Google bigquery Beam和Datafow-如何更快地执行GroupByKey和排序?
我有超过100GB的绑定数据要处理。目标是最大化吞吐量。基本上,我需要将数据分组,进行排序,然后进行一些ParDo工作。fowling代码片段显示了我如何创建会话窗口,然后执行GroupByKey和排序。我发现GroupByKey是瓶颈。通过阅读,我了解到通过部分组合可以显著减少数据混乱。然而在我的例子中,因为我在GroupByKey之后进行排序,所以我猜数据洗牌无论如何都会超过100GB。因此,问题是:Google bigquery Beam和Datafow-如何更快地执行GroupByKey和排序?,google-bigquery,google-cloud-dataflow,apache-beam,Google Bigquery,Google Cloud Dataflow,Apache Beam,我有超过100GB的绑定数据要处理。目标是最大化吞吐量。基本上,我需要将数据分组,进行排序,然后进行一些ParDo工作。fowling代码片段显示了我如何创建会话窗口,然后执行GroupByKey和排序。我发现GroupByKey是瓶颈。通过阅读,我了解到通过部分组合可以显著减少数据混乱。然而在我的例子中,因为我在GroupByKey之后进行排序,所以我猜数据洗牌无论如何都会超过100GB。因此,问题是: 对于我的案例,是否有其他方法可以提高GroupByKey吞吐量 我可以想到的一个解决方法是
PCollection<KV<String,TableRow>> sessionWindowedPairs = rowsKeyedByHardwareId
.apply("Assign Rows Keyed by HardwareId into Session Windows"
, Window.into(Sessions.withGapDuration(Duration.standardSeconds(200))))
;
PCollection<KV<String, List<TableRow>>> sortedGPSPerDevice = sessionWindowedPairs
.apply("Group By HardwareId (and Window)", GroupByKey.create())
.apply("Sort GPSs of Each Group By DateTime", ParDo.of(new SortTableRowDoFn()));
PCollection sessionWindowedPairs=rowsKeyedByHardwareId
.apply(“将硬件ID键入的行分配到会话窗口”
,Window.into(Sessions.withGapDuration(持续时间.标准秒(200)))
;
PCollection sortedgpserDevice=会话窗口对
.apply(“分组依据硬件ID(和窗口)”,GroupByKey.create()
.apply(“按日期时间对每个组的GPS进行排序”,ParDo.of(new SortTableRowDoFn()));
我也一直在尝试用数据流处理100gbs的有界数据,但没有成功。长话短说,这也是一组关键的瓶颈。最后,我得出了与您在
2.
中得出的相同的结论,并使用BigQuery进行了一些高级聚合,以将数据集的大小减少到GBs的顺序,并且数据流的性能更高
我不确定您的数据集的格式,但本文还讨论了如何使用组合器处理热键
,这可能适合您的需要
我希望Dataflow能够处理更大的有界数据集,因为我也不希望必须维护BigQuery查询和数据流逻辑,但我还没有找到一种方法来做到这一点。从问题的细节来看,瓶颈是什么,或者管道的运行速度是否比预期的慢。对于数据流团队来说,至少需要一个作业ID,理想情况下还需要管道代码来查看并提供具体指导。尽管如此,我们可以给出以下一般性建议:
- 用户可以使用选项
--experiments=shuffle\u mode=service
- 如果用户知道其管道包含热键,则可以使用
Combine.PerKeyWithHotKeyFanout
另请参阅上一个线程:。我需要进一步调查我们是否有重要的热键。同时,在我们的案例中,数据洗牌成本是不可避免的一部分。(为了进行分组和排序,而不是像求和这样的事情,我想知道在幕后会使用什么策略来减少数据洗牌量)