Apache flink ApacheFlink如何处理扭曲的数据?

Apache flink ApacheFlink如何处理扭曲的数据?,apache-flink,Apache Flink,例如,我有一大堆单词,想数一数每个单词。问题是这些词有失偏颇。这意味着一些单词的频率会很高,但大多数其他单词的频率很低。在暴风雨中,我们可以用以下方法来解决这个问题。首先在流上执行随机分组,在每个节点中计算一个窗口时间内本地的单词数,最后将计数更新为累积结果。 从我的另一个例子中,我知道Flink只支持键控流上的窗口,否则窗口操作将不会是并行的 我的问题是,有没有一种好方法可以解决Flink中的这种扭曲数据问题 数据流API目前不支持预聚合。原则上,可以为事件时间窗口添加类似组合器的功能。在国际

例如,我有一大堆单词,想数一数每个单词。问题是这些词有失偏颇。这意味着一些单词的频率会很高,但大多数其他单词的频率很低。在暴风雨中,我们可以用以下方法来解决这个问题。首先在流上执行随机分组,在每个节点中计算一个窗口时间内本地的单词数,最后将计数更新为累积结果。 从我的另一个例子中,我知道Flink只支持键控流上的窗口,否则窗口操作将不会是并行的

我的问题是,有没有一种好方法可以解决Flink中的这种扭曲数据问题


数据流API目前不支持预聚合。原则上,可以为事件时间窗口添加类似组合器的功能。在国际海事组织,这将是一个非常有价值的补充,但尚未完成

但是,您可以自己实现此功能。DataStream API提供了类似于Storm Bolt的低级操作员界面。该接口称为
OneInputStreamOperator
。此运算符类型为您提供完全控制。事实上,内置操作符(如窗口操作符)也基于此类

OneInputStreamOperator
可以像以下那样应用:

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

DataStreamThanks寻求帮助。关于我自己实现这个特性的一个问题。由于Flink只支持键控流上的窗口,否则窗口操作将不会并行。因此,实现不能是stream.PreAggregation(reduce\u-fun).keyBy().window().reduce(reduce\u-fun)
。因为预聚合应该在一个窗口时间内。据我所知,它应该是
stream.PreAggregationWithWindow(reduce\u-fun).keyBy().reduce(reduce\u-fun)
。然后我需要实现一个窗口操作符来处理非键控流。我说的对吗?您还可以在预聚合器中实现近似内存窗口逻辑。为此,您可以查看/复制Flink的常规窗口代码。我知道,这不是一件容易的事,但应该是可能的。这将使第二个(最终)窗口也能够并行运行,这就是更清洁的解决方案,IMO。我对您提到的更清洁的解决方案不清楚的一点是,在预聚合之后,似乎不再需要第二个窗口。如果有其他原因,是的,它是并行的。您可以按照之前的建议执行
stream.transform(新的PreAgg()).keyBy().window().reduce()
。在这种情况下,
PreAgg
应该实现与Flink的窗口实现非常相似的键控窗口逻辑(具有固定大小的状态,可能还有LRU逐出)。由于未对
PreAgg
的输入进行分区(无
keyBy
),因此键是随机分布的,没有扭曲。在
PreAgg
之后,您需要按键进行分区,并定义一个窗口来计算最终结果,类似于MapReduce中的组合器。@FabianHueske从今天开始实现了吗?如果没有,这是否在路线图上?在Storm中,我使用了“部分键分组”,它可以更好地处理数据倾斜。