例如,我有大量的单词,想计算每个单词。问题是这些词是歪斜的。这意味着某些单词的频率会很高,而其他大多数单词的频率会很低。在 Storm 中,我们可以使用以下方式解决此问题。首先对流进行随机分组,在每个节点中统计窗口时间内本地的单词数,最后更新为累加结果。
从我的另一个question中,我知道Flink仅在键控流上支持window,否则window操作将不会并行。

我的问题是,有没有一种好的方法来解决Flink中这种偏斜的数据问题?

apache-flink - Apache Flink如何处理倾斜的数据?-LMLPHP

最佳答案

DataStream API当前不支持预聚合。原则上,可以为事件时间窗口添加类似合并器的功能。 IMO,这将是非常有值(value)的补充,但尚未完成。

但是,您可以自己实现此功能。 DataStream API提供了类似于Storm Bolts的低级运算符(operator)界面。该接口(interface)称为OneInputStreamOperator。此运算符类型使您可以完全控制。实际上,内置运算符(例如Window运算符)也基于此类。
OneInputStreamOperator可以像这样应用:

DataStream<Tuple2<String,Integer> inStream = ...
DataStream<String> outStream = inStream
  .transform("my op", BasicTypeInfo.STRING_TYPE_INFO, new MyOISO());

10-08 13:30