Apache Flink连续拆分奇怪的行为

时间:2019-06-24 13:45:55

标签: java apache-flink

我相信,当连续进行两次拆分时,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”)。但是,这不是我的问题的重点。我最初在我编写的一个更复杂的程序中注意到了此行为,该程序中需要两个连续的分割,因此我决定尝试以一个最小的示例重新创建它,以检查是否可以再现它。

2 个答案:

答案 0 :(得分:2)

最近在邮件列表上有关于此错误行为的讨论,主题为“关于弃用DataStream API的拆分/选择”。我认为主要评论是:

  

首先,我们必须承认当前的拆分/选择实现   有缺陷。我粗略地检查了源代码,问题可能是   对于连续的选择/拆分,前一个将被   在StreamGraph生成阶段的后续版本。这就是为什么我们禁止这样做   FLINK-11084中的连续逻辑。

查看了FLINK-11084和生成的补丁之后,我相信如果您连续进行两次拆分/选择,则Flink的最新版本将引发异常。

答案 1 :(得分:0)

鉴于我对拆分/选择是如何实现的了解,如果这样做不起作用也不会令我感到惊讶(尽管我不十分确定)。此外,最近不赞成使用分割/选择功能(尽管尚不清楚它是否会消失)。

进行拆分/选择的更好方法是通过side outputs。这是一种功能更强大且实现更简洁的机制。