Apache Flink 如何处理倾斜数据?
How Apache Flink deal with skewed data?
比如我有一个很大的词流,想统计每个词。问题是这些话是歪曲的。这意味着某些词的频率会很高,但大多数其他词的频率很低。在storm中,我们可以使用下面的方法来解决这个问题。首先对流进行shuffle分组,在window时间内每个节点统计局部单词数,最后更新统计结果累加。
从我的另一个得知,Flink只支持keyed stream上的window,否则window操作不会并行。
请问有没有什么好的方法可以解决Flink中这种数据倾斜的问题?
Pre-aggregation 当前不受 DataStream API 的原生支持。原则上,可以为event-timewindows添加一个combiner-like特征。 IMO,这将是一个非常有价值的补充,但尚未完成。
但是,您可以自己实现此功能。 DataStream API 提供 low-level 类似于 Storm Bolts 的操作界面。该界面称为 OneInputStreamOperator
。此操作员类型可让您完全控制。其实built-in运算符(比如Window运算符)也是基于这个class。
A OneInputStreamOperator
可以像这样应用:
DataStream<Tuple2<String,Integer> inStream = ...
DataStream<String> outStream = inStream
.transform("my op", BasicTypeInfo.STRING_TYPE_INFO, new MyOISO());
比如我有一个很大的词流,想统计每个词。问题是这些话是歪曲的。这意味着某些词的频率会很高,但大多数其他词的频率很低。在storm中,我们可以使用下面的方法来解决这个问题。首先对流进行shuffle分组,在window时间内每个节点统计局部单词数,最后更新统计结果累加。
从我的另一个
请问有没有什么好的方法可以解决Flink中这种数据倾斜的问题?
Pre-aggregation 当前不受 DataStream API 的原生支持。原则上,可以为event-timewindows添加一个combiner-like特征。 IMO,这将是一个非常有价值的补充,但尚未完成。
但是,您可以自己实现此功能。 DataStream API 提供 low-level 类似于 Storm Bolts 的操作界面。该界面称为 OneInputStreamOperator
。此操作员类型可让您完全控制。其实built-in运算符(比如Window运算符)也是基于这个class。
A OneInputStreamOperator
可以像这样应用:
DataStream<Tuple2<String,Integer> inStream = ...
DataStream<String> outStream = inStream
.transform("my op", BasicTypeInfo.STRING_TYPE_INFO, new MyOISO());