Flink状态与普通类变量之间的区别

时间:2020-02-10 03:40:19

标签: java variables streaming state apache-flink

我无法理解Apache Flink中状态的使用。据我了解,状态在Flink程序执行期间会保持变量值。我认为可以通过类变量来实现相同的目的。

例如,如果我声明一个类变量“ someCounter”并在某些Map函数中增加其值,那么在代码执行过程中将保留“ someCounter”值,那么为什么我们需要一个昂贵的状态来维护与该链接上的示例中提到的值类似:https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/state/state.html#tab_java_0

static class abc extends RichMapFunction<X,Y> {
    long someCounter = 0;
    //ctor
    public  abc() {};

    @Override
    public Y map(X x) throws Exception {            
        someCounter++;
        if(someCounter > 1000)
            someCounter = 0;
        return someCounter;
    }
}

1 个答案:

答案 0 :(得分:3)

故障恢复,重新部署和调整规模是其中的一些大差异。

Flink对其管理的状态进行定期检查。发生故障时,您的作业可以使用最新的检查点自动恢复并恢复处理。您也可以手动触发状态快照(在这种情况下称为保存点),并在重新部署后使用它重新启动。在使用时,您还可以向上或向下重新缩放群集。

您还可以选择Flink状态的位置-作为堆中的对象,还是磁盘上的序列化字节。因此,可能有更多的状态无法容纳在内存中。

从操作的角度看,这更像是将数据存储在数据库中而不是存储在内存中。但是从性能的角度来看,它更像是使用变量:状态始终是局部的,具有高吞吐量和低延迟。