Apache Flink:窗口检查点

时间:2018-10-30 13:05:19

标签: apache-flink flink-streaming

我想知道如何检查一个窗口。例如,窗口字数:

DataStream<Tuple3<String, Long, Long>> counts =
            // split up the lines in pairs (2-tuples) containing: (word,1)
                    text
                    .flatMap(new Tokenizer())
                    .assignTimestampsAndWatermarks(new timestamp())
                    .keyBy(0)
                    .timeWindow(Time.seconds(2))
                    .process(new CountFunction())   

第一季度:我应该在CountFunction()中保存什么状态?我需要保存窗口的缓冲元素吗?我应该使用ListState将缓冲的数据存储在窗口中,还是使用ValueState存储当前的总和值吗?

第二季度:发生故障时,如何处理窗口中的元素?恢复窗口后会发生什么?

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Flink窗口API所需的所有状态均由Flink管理-因此您无需执行任何操作。只要启用了检查点,就将对窗口缓冲区进行检查点并根据需要还原。

通常,CountFunction不会有任何需要检查点的状态。如果在CountFunction遍历窗口内容的过程中作业失败,则将倒退该作业,并使用相同的输入再次调用CountFunction。

如果确实需要在CountFunction中保持状态,请参见Using per-window state in ProcessWindowFunction,以获取有关如何执行此操作的信息。听起来您好像要使用globalState()(状态一直存在),您可以通过传递给过程窗口函数的Context对象来访问它。

虽然您没有键控流,但我建议您使用上述键控状态机制。您可以使用带有恒定键的keyBy将非密钥流转换为密钥流。