java—flink状态和普通类变量之间的差异

d6kp6zgx  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(405)

我无法理解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;
    }
}
kulphzqa

kulphzqa1#

故障恢复、重新部署和重新缩放是其中的一些重大区别。
flink定期检查它所管理的状态。如果出现故障,您的作业可以使用最新的检查点自动恢复,并继续处理。您还可以手动触发状态快照(在本例中称为保存点),并在重新部署后使用它重新启动。同时,还可以向上或向下重新缩放集群。
您还可以选择flink状态所在的位置——要么作为堆上的对象,要么作为磁盘上的序列化字节。因此,有可能有更多的状态比可以容纳在内存中。
从操作的Angular 来看,这更像是将数据放在数据库中,而不是内存中。但是从性能的Angular 来看,它更像是使用变量:状态总是本地的,具有高吞吐量和低延迟。

相关问题