Dataflow CoGroupByKey对于每个键超过10000个元素的速度非常慢

问题描述 投票:2回答:1

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

我想做的是在这两个PCollection之间应用左外部联接,并在成功联接的情况下,将右TableRow的所有数据放到左TableRow并返回结果。

我曾尝试在针对Java的Apache Beam SDK 2.10.0中使用CoGroupByKey,但在这里我得到了太多的热键,因此在警告CoGrupByKey之后,我的获取结果越来越慢,因为警告“每个键需要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);
        }

      }
    }
  }));

在数据流中执行这些类型的联接的方法是什么?

apache left-join google-cloud-dataflow apache-beam
1个回答
0
投票

我进行了一些研究,发现了一些可以帮助您的信息。

由PCollection(可序列化对象)之间的数据流传输的发送数据可能不存在于单个计算机中。此外,类似GroupByKey / CoGroupByKey的需求需要将所有数据收集在一个位置,然后再填充结果,我不知道您是否具有其他结构。

此外,您可以重新分配密钥,减少工作人员并增加内存,或者尝试使用Combine.perKey

也可以尝试this解决方法,或者,您可以阅读this文章,并获得更多可以帮助您的信息。

© www.soinside.com 2019 - 2024. All rights reserved.