我想知道如何检查一个窗口。例如,窗口字数:
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
存储当前的总和值吗?
第二季度:发生故障时,如何处理窗口中的元素?恢复窗口后会发生什么?
谢谢您的帮助。
答案 0 :(得分:0)
Flink窗口API所需的所有状态均由Flink管理-因此您无需执行任何操作。只要启用了检查点,就将对窗口缓冲区进行检查点并根据需要还原。
通常,CountFunction不会有任何需要检查点的状态。如果在CountFunction遍历窗口内容的过程中作业失败,则将倒退该作业,并使用相同的输入再次调用CountFunction。
如果确实需要在CountFunction中保持状态,请参见Using per-window state in ProcessWindowFunction,以获取有关如何执行此操作的信息。听起来您好像要使用globalState()(状态一直存在),您可以通过传递给过程窗口函数的Context对象来访问它。
虽然您没有键控流,但我建议您使用上述键控状态机制。您可以使用带有恒定键的keyBy将非密钥流转换为密钥流。