Google bigquery Beam和Datafow-如何更快地执行GroupByKey和排序?

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吞吐量 我可以想到的一个解决方法是

我有超过100GB的绑定数据要处理。目标是最大化吞吐量。基本上,我需要将数据分组,进行排序,然后进行一些ParDo工作。fowling代码片段显示了我如何创建会话窗口,然后执行GroupByKey和排序。我发现GroupByKey是瓶颈。通过阅读,我了解到通过部分组合可以显著减少数据混乱。然而在我的例子中,因为我在GroupByKey之后进行排序,所以我猜数据洗牌无论如何都会超过100GB。因此,问题是:

  • 对于我的案例,是否有其他方法可以提高GroupByKey吞吐量
  • 我可以想到的一个解决方法是,我可以在BigQuery中编写一个查询,以执行类似的操作(即按数据的时间分段、分组和排序),然后将reset ParDos留给数据流。这样就不需要groupby了。但是会话窗口非常聪明,它为我节省了很多代码,我真的试图通过用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()));
    
    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

    另请参阅上一个线程:。

    我需要进一步调查我们是否有重要的热键。同时,在我们的案例中,数据洗牌成本是不可避免的一部分。(为了进行分组和排序,而不是像求和这样的事情,我想知道在幕后会使用什么策略来减少数据洗牌量)