【发布时间】:2018-08-28 09:52:04
【问题描述】:
在我的 apache 梁和数据流管道中,我做了一些需要全局合并操作的转换,例如 min 、 max 、自定义全局合并函数。 pcollection 中要处理的项目数量为 2-40 亿。
我读到大多数组合操作都是建立在 groupBykey 之上的,这会导致 shuffle ,我相信这会使我当前的管道变慢,或者从 UI 中观察到,这是全局组合操作中最高的挂壁时间。我查看了代码, groupByKey 尝试向所有元素添加一个静态 void 键,然后执行 groupby ,这是否意味着我们正在改组数据(特别是当我们只有一个键时)? 有没有办法有效地做到这一点
我自己理解的另一个问题:beam/dataflow 文档说键的所有元素都由单个工作线程/线程处理。以在整数的 pcollection 中查找最大值为例,此全局操作是完全可并行化的,其中我的组合器/累加器在数据的部分/子集上工作以找到最大值,然后在树中合并部分结果(合并两个最大值以获得最大值)类似结构,叶子的结果可以合并得到父节点,每个节点基本上可以分布式评估。那么究竟是什么操作强制一个键必须由一个工作线程/线程处理。似乎任何具有可交换和关联组合器的全局操作都可以轻松并行化。全局组合的哪一部分需要通过单个工作线程?
【问题讨论】:
-
我已经观察到这种行为,我正在努力解决这个问题。当您创建一个 Combine.globally() 时,只有方法 createAccumulator、addInput 和 extractOutput 被调用。这意味着 threre 是一个 shuffle 并且不需要 mergeAccumulators。我试图找出寻找代码的原因,但 apache 梁代码很糟糕。对我来说,在以后的部分合并中对每个捆绑包进行部分合并并最终收集所有内容是有意义的。但这并不是真正发生的事情,所以医生在撒谎。
标签: google-cloud-platform google-cloud-dataflow shuffle apache-beam apache-beam-io