1

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

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

我自己理解的另一个问题:梁/数据流文档说密钥的所有元素都由单个工作线程/线程处理。以在整数的 pcollection 中查找最大值为例,此全局操作是完全可并行化的,其中我的组合器/累加器在数据的部分/子集上工作以找到最大值,然后在树中合并部分结果(合并两个最大值以获得最大值)像这样的结构,叶子的结果可以合并得到父节点,每个节点基本上可以以分布式的方式进行评估。那么究竟是什么操作强制一个键必须由一个工作线程/线程处理。似乎任何具有可交换和关联组合器的全局操作都可以轻松并行化。全局组合的哪一部分需要通过单个工作线程?

4

1 回答 1

0

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

Dataflow 将为每个元素分配一个不同的键,因此您最终不会得到所有相同的键(因此没有并行性)。如果全部分配给一个键,那么只有一个工人可以处理,而且速度很慢。

于 2018-03-19T20:20:13.150 回答