Beam和Datafow - 如何进行GroupByKey排序更快?

时间:2018-04-19 18:51:12

标签: google-bigquery google-cloud-dataflow apache-beam

我有超过100GB的有界数据需要处理。目标是最大化吞吐量。基本上,我需要将数据分组,进行排序,然后进行一些ParDo工作。 fowling代码片段显示了我如何进行会话窗口,然后执行GroupByKey和Sort。我发现GroupByKey是瓶颈。通过阅读this blog,我了解到通过做一些部分组合可以显着减少数据混乱。但是在我的情况下,因为我在GroupByKey之后进行排序,我猜数据随机播放将超过100GB。所以问题是:

  1. 还有其他方法可以为我的案例增加GroupByKey吞吐量吗?
  2. 我能想到的一个解决方法是,我可以在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()));
    

2 个答案:

答案 0 :(得分:1)

我也一直在尝试使用Dataflow处理100多GB有界数据并且没有成功。长话短说,它也是一个关键的群体,就是瓶颈。最后,我得出了与2.中达成的相同结论,并使用BigQuery进行一些高级聚合,以将数据集的大小减小到GB的顺序,并且Dataflow的性能更高。

我不确定您的数据集的格式,但此Fiddle还讨论了如何使用hot keys来处理combiners,这可能符合您的需求。

我喜欢Dataflow处理更大的有界数据集的方法,因为我也不想维护BigQuery查询和数据流逻辑,但我没有遇到过这样做的方法。

答案 1 :(得分:1)

从问题细节中不清楚瓶颈是什么,或管道运行速度是否低于预期。要让Dataflow团队查看并提供具体指导,至少需要一个作业ID,以及理想的管道代码。也就是说,我们可以提供以下一般性建议:

另见前一个帖子:Slow throughput after a groupBy