我有一个带有“最终”级的线性管线,每秒可输出约200k个元素(短字符串)。
但是,当我在该阶段(myPCollection.apply(Distinct.<String>create());
之后添加Distinct操作时,Distinct
之前阶段的速度下降到每秒处理约80k元素。
但是,我正在处理没有最大数量的工作人员的有界集合,因此我希望Dataflow能够自动增加工作人员的数量以匹配工作量。不仅不会发生这种情况,而且当我手动启动具有许多工作人员(超过20个)的管道时,它会自动缩小为几个工作人员。
如何使Dataflow扩展工作池,以使此Distinct操作不会显着降低管道的处理速率?
答案 0 :(得分:2)
看看the implementation of Distinct
可能很有趣。
如您所见,它首先将元素分组,然后再拾取第一个元素。我已提交a bug来改善此行为。
在当前实现中,所有元素首先进行分组,这要求将它们写入持久性存储,然后再提取。如果您有多次出现的元素(即热键),则会遇到可写多少数据的瓶颈。
作为一个技巧,您可以添加一个DoFn,以便在写出元素之前 对元素进行重复数据删除。像这样:
class MapperDedupFn extends DoFn<String, String> {
Set<String> seenElements;
MapperDedupFn() {
seenElements = new HashSet<>();
}
@ProcessElement
public void processElement(@Element String element, OutputReceiver<String> receiver) {
if (seenElements.contains(element)) return;
seenElements.add(element)
receiver.output(word);
}
}
}
您应该可以在Distinct
函数之前使用它,并希望它具有更好的性能。