Apache Flink:KeyedStream上的数据分布偏差

时间:2017-06-22 22:39:12

标签: parallel-processing apache-flink flink-streaming windowing

我在Flink中有这个Java代码:

ngModelChange

问题是窗口应该能够以parallelism = 2进行处理,因为有两个不同的数据组,带有键" odd"和"甚至"在Tuple3中的第二个String中。所有东西都以并行性6运行,但不是以并行性= 1运行的窗口,我只需要它因为我的要求而具有并行性= 2。

代码中使用的函数如下:

env.setParallelism(6);

//Read from Kafka topic with 12 partitions
DataStream<String> line = env.addSource(myConsumer);

//Filter half of the records 
DataStream<Tuple2<String, Integer>> line_Num_Odd = line_Num.filter(new FilterOdd());
DataStream<Tuple3<String, String, Integer>> line_Num_Odd_2 = line_Num_Odd.map(new OddAdder());

//Filter the other half
DataStream<Tuple2<String, Integer>> line_Num_Even = line_Num.filter(new FilterEven());
DataStream<Tuple3<String, String, Integer>> line_Num_Even_2 = line_Num_Even.map(new EvenAdder());

//Join all the data again
DataStream<Tuple3<String, String, Integer>> line_Num_U = line_Num_Odd_2.union(line_Num_Even_2);

//Window
DataStream<Tuple3<String, String, Integer>> windowedLine_Num_U_K = line_Num_U
                .keyBy(1)
                .window(TumblingProcessingTimeWindows.of(Time.seconds(10)))
                .reduce(new Reducer());

感谢您的帮助!

解决方案:我已经改变了键的内容来自&#34; odd&#34;和&#34;甚至&#34;到&#34; odd0000&#34;和&#34; even1111&#34;它现在正常运作。

1 个答案:

答案 0 :(得分:2)

通过散列分区将密钥分发给工作线程。这意味着键值被散列并且线程由模数#workers确定。使用两个密钥和两个线程很可能将两个密钥分配给同一个线程。

您可以尝试使用其哈希值分布在两个线程中的不同键值。