我在Flink作业中设置了it('runs child', () => {
return parent().then(() => { // <<<--- return
expect(child).toHaveBeenCalledTimes(1);
})
})
,它有2个滑动窗口(这些arent连接)和1个翻转窗口连接。我的想法是,我真的不需要为checkpointing
本身保存状态,因为为join
滑动窗口本身保存状态就足够了。 2
最终处于20-30gb的状态,导致作业滞后并崩溃,检查点也从未保存。
我该如何完成?
我正在尝试类似的事情:
Join
这实际上避免了存储联接状态吗?其称呼为:
public class CustomJoin implements JoinFunction<A, A, A>, ListCheckPointed<A> {
@Override
public A join(A a, A b){
// Some irrelevant join logic
}
@Override
public List<A> snapshotState(long l, long l1) throws Exception {
return new ArrayList<>();
}
@Override
public void restoreState(List<A> list) throws Exception {
}
}
这在实践中可行吗?避免存储状态的最佳方法是什么?
答案 0 :(得分:0)
根据我对Flink的理解,检查点需要确保可以安全有效地恢复整个计算,因此这种全局状态是不可避免的。但是Flink自己的检查点可以关闭(它基于 ABS 算法,性能损失很小,我不建议这样做),但是可以使用Flink提供的 SavePoint 用于自定义快照,但Flink检查点是增量的。保存,并且SavePoint是完整保存。我建议您查看以下材料: 1,分布式快照-确定分布式系统的全局状态 2,轻量级异步快照的分布式数据流 3,https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/stream/state/checkpointing.html 我认为这可以很好地解决您的问题。
答案 1 :(得分:0)
在窗口联接中,JoinFunction由窗口运算符执行。它没有自己的状态。因此,您要尝试的操作无济于事。
此外,滑动窗使用的状态比您可能想象的要多得多。每个重叠的实例都有其自己的窗口内容副本。因此,例如,如果您有一个小时的滑动窗口,滑动了1分钟,那么每个事件将被复制60次。