apache beam全球组合shuffle

时间:2018-03-19 18:09:54

标签: google-cloud-platform google-cloud-dataflow shuffle apache-beam apache-beam-io

在我的apache beam和dataflow管道中,我做了一些需要全局组合操作的转换,比如min,max,自定义全局组合函数。 pcollection中要处理的项目数量为2-4亿。

我读到大多数组合操作是建立在groupBykey之上的,这导致了一个shuffle,我认为这使得我当前的管道变慢或者从UI观察到全局组合操作中最长的时间。我查看了代码,groupByKey尝试向所有元素添加静态void键,然后执行groupby,这是否意味着我们正在混洗数据(特别是当我们只有一个键时)? 有没有办法有效地做到这一点

我自己理解的另一个问题:beam / dataflow文档说明一个键的所有元素都由一个worker / thread处理。以在整数的pcollection中找到max的示例为例,这个全局操作是完全可并行化的,其中我的组合器/累加器处理数据的部分/子集以查找max,然后在树中合并部分结果(合并两个max到get max)类似于结构,其中叶子的结果可以合并以获得父节点,并且每个节点基本上可以以分布式方式评估。那么什么操作确切地强制一个键必须由一个工作者/线程处理。看起来像任何全局操作,你有一个可交换和关联的组合器可以很容易地并行化。全球组合的哪个部分需要通过单个工作线程?

1 个答案:

答案 0 :(得分:0)

组合器将在shuffle之前被提升(意味着我们在进入shuffle之前进行一些组合)。这里有一些信息:https://cloud.google.com/blog/big-data/2016/02/writing-dataflow-pipelines-with-scalability-in-mind,搜索组合器。

Dataflow将为每个元素分配一个不同的键,因此您不会得到所有相同的键(因此没有并行性)。如果全部分配给一个密钥,那么只有一个工作人员能够处理,而且速度非常慢。