Flink如何不为操作员保存状态?

时间:2019-04-22 18:34:27

标签: apache-flink flink-streaming flink-cep

我在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 {

    }
}

这在实践中可行吗?避免存储状态的最佳方法是什么?

2 个答案:

答案 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次。