DataFlow cogroupbyKey非常慢,对于每个键的10000个元素,却是速度较慢



我有两个 PCollection<KV<String, TableRow>>一个〜700万行,另一行约为100万行。

我想做的是在这两个pcollections之间施加左外接线,如果成功加入,请将右Tablerow的所有数据都放在左Tablerow中并返回结果。

我尝试使用Apache Beam SDK 2.10.0中的cogroupbykey进行Java,在这里我得到了很多热键,因此CogrupByKey之后的取得结果越来越慢,因为"每钥匙更多10000个元素,需要重申的10000个元素"。我还尝试了洗牌模式服务,但没有帮助。

PCollection<TableRow> finalResultCollection =
coGbkResultCollection.apply(ParDo.of(
  new DoFn<KV<K, CoGbkResult>, TableROw>() {
    @Override
    public void processElement(ProcessContext c) {
      KV<K, CoGbkResult> e = c.element();
      // Get all collection 1 values
      Iterable<TableRow> pt1Vals = e.getValue().getAll(t1);
      Iterable<TableRow> pt2Vals = e.getValue().getAll(t2);
      for (TableRow tr : pt1Vals)
      {
        TableRow out = tr.clone();
        if(pt2Vals.iterator().hasNext())
        {
            for (TableRow tr1 : pt2Vals)
            {
                out.putAll(tr1);
                c.output(out);
            }
        }
        else
        {
            c.output(out);
        }
      }
    }
  }));

在数据流中执行此类连接的方法是什么?

我做了一些研究,我找到了一些可以帮助您的信息。

通过数据流传输的数据在PCollections之间传输(可序列化对象)可能不存在一台计算机中。此外,像GroupByKey/CogroupByKey的转换需要在被填充的人群之前收集的所有数据,我不知道您是否在不同的结构中都有它。

除此

您也可以尝试此解决方法,或者您可以阅读本文并拥有更多可以帮助您的信息。

相关内容

最新更新