我相信,当连续进行两次拆分时,Flink的行为会很奇怪。我的实现逻辑中可能会出现一些错误,这就是为什么我在这里发布以征求您的意见。
最小示例:我有一个文本文件,其中包含单词Apple,Banana和Orange。我在流执行环境中将此作为源传递。我进行了第一次拆分,其中选择条件是参数是否为单词“ Apple”。如果是,我将其放置为“主题” Apples ,否则将其放置为“主题” NotApples 。然后,我在此拆分流中选择“主题” NotApples ,然后再次拆分,但这一次条件检查参数是否为单词“ Orange”。如果是,则将其放置在“主题” 橙色中,否则放置在“主题” NotOranges 中。
当我打印最后一个拆分流的主题 NotOranges 时,最后期望的是只打印单词“ Banana”。但是,我实际打印的是“ Apple”和“ Banana”两个词。我注意到完成第二次拆分后,处理的流不是仅包含我从中选择的主题元素(即NotApples)而是所有元素的流。我想念什么吗?
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> datastream = env.readTextFile("input.txt");
SplitStream<String> splitStream1 = datastream.split(new OutputSelector<String>() {
@Override
public Iterable<String> select(String arg0) {
List<String> output = new ArrayList<String>();
if (arg0.equals("Apple")) {
output.add("Apples");
} else {
output.add("NotApples");
}
return output;
}
});
DataStream<String> notApplesStream = splitStream1.select("NotApples");
SplitStream<String> splitStream2 = notApplesStream.split(new OutputSelector<String>() {
@Override
public Iterable<String> select(String arg0) {
List<String> output = new ArrayList<String>();
if (arg0.equals("Orange")) {
output.add("Oranges");
} else {
output.add("NotOranges");
}
return output;
}
});
DataStream<String> notApplesAndNotOrangesStream = splitStream2.select("NotOranges");
notApplesAndNotOrangesStream.print();
env.execute("SplitTest");
输出:
1> Apple
1> Apple
1> Banana
2> Apple
2> Apple
2> Apple
4> Apple
4> Apple
4> Banana
3> Apple
3> Banana
3> Apple
NB .:我知道我可以通过一个拆分来实现相同的逻辑(在该逻辑中,我检查参数是“ Apple”还是“ Organge”)。但是,这不是我的问题的重点。我最初在我编写的一个更复杂的程序中注意到了此行为,该程序中需要两个连续的分割,因此我决定尝试以一个最小的示例重新创建它,以检查是否可以再现它。
答案 0 :(得分:2)
最近在邮件列表上有关于此错误行为的讨论,主题为“关于弃用DataStream API的拆分/选择”。我认为主要评论是:
首先,我们必须承认当前的拆分/选择实现 有缺陷。我粗略地检查了源代码,问题可能是 对于连续的选择/拆分,前一个将被 在StreamGraph生成阶段的后续版本。这就是为什么我们禁止这样做 FLINK-11084中的连续逻辑。
查看了FLINK-11084和生成的补丁之后,我相信如果您连续进行两次拆分/选择,则Flink的最新版本将引发异常。
答案 1 :(得分:0)
鉴于我对拆分/选择是如何实现的了解,如果这样做不起作用也不会令我感到惊讶(尽管我不十分确定)。此外,最近不赞成使用分割/选择功能(尽管尚不清楚它是否会消失)。
进行拆分/选择的更好方法是通过side outputs。这是一种功能更强大且实现更简洁的机制。