我有超过100GB的有界数据需要处理。目标是最大化吞吐量。基本上,我需要将数据分组,进行排序,然后进行一些ParDo工作。 fowling代码片段显示了我如何进行会话窗口,然后执行GroupByKey和Sort。我发现GroupByKey是瓶颈。通过阅读this blog,我了解到通过做一些部分组合可以显着减少数据混乱。但是在我的情况下,因为我在GroupByKey之后进行排序,我猜数据随机播放将超过100GB。所以问题是:
我能想到的一个解决方法是,我可以在BigQuery中编写一个查询来执行相同的操作(即按数据划分时间gps,分组和排序),然后只需保留重置ParDos到数据流。因此,不需要组合。但会话窗口非常聪明,为我节省了很多代码,我真的试图避免这样做,并且手动"通过在GBQ中编写查询。
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()));
答案 0 :(得分:1)
我也一直在尝试使用Dataflow处理100多GB有界数据并且没有成功。长话短说,它也是一个关键的群体,就是瓶颈。最后,我得出了与2.
中达成的相同结论,并使用BigQuery进行一些高级聚合,以将数据集的大小减小到GB的顺序,并且Dataflow的性能更高。
我不确定您的数据集的格式,但此Fiddle还讨论了如何使用hot keys
来处理combiners
,这可能符合您的需求。
我喜欢Dataflow处理更大的有界数据集的方法,因为我也不想维护BigQuery查询和数据流逻辑,但我没有遇到过这样做的方法。
答案 1 :(得分:1)
从问题细节中不清楚瓶颈是什么,或管道运行速度是否低于预期。要让Dataflow团队查看并提供具体指导,至少需要一个作业ID,以及理想的管道代码。也就是说,我们可以提供以下一般性建议:
--experiments=shuffle_mode=service
Combine.PerKeyWithHotKeyFanout
:https://beam.apache.org/documentation/sdks/javadoc/2.0.0/org/apache/beam/sdk/transforms/Combine.PerKeyWithHotKeyFanout.html。另见前一个帖子:Slow throughput after a groupBy。