关于Flink Rich Function中open方法与static final变量是否等效的疑问
Flink Rich Function open() 与 static final 变量的区别
直接说结论:完全不一样,核心差异体现在这几个方面:
时机与范围不同
static final变量是在类加载阶段就完成初始化,属于类级别的全局共享变量,同一个算子的所有实例都会共用这一个值;而open()方法是在每个算子实例初始化时被调用一次,属于实例级别的初始化逻辑,每个实例可以独立执行自己的初始化操作。灵活性与适用场景天差地别
static final只能赋值一次,而且必须是编译期就能确定的常量,或者类加载时就能计算出的值,根本没法用到Flink运行时的上下文信息(比如当前算子的并行度、状态后端配置);而open()可以拿到RuntimeContext,能动态获取运行时参数,还能初始化一些需要运行时资源的东西——比如创建数据库连接池、加载外部配置文件、初始化状态句柄,这些都是static final做不到的。生命周期绑定逻辑不同
static final的生命周期和类本身绑定,只要类没被JVM卸载就一直存在;而open()里初始化的资源,通常可以在close()方法里释放,生命周期和算子实例完全绑定,更贴合Flink算子的生命周期管理机制。分布式场景下的隔离性不同
Flink算子是多实例并行运行的,static final是所有实例共享的,哪怕是final修饰的引用类型,内部状态如果被修改(虽然变量本身不能改引用),会影响所有实例;而open()里初始化的实例变量是每个实例独有的,互相之间完全隔离,更适合分布式计算的场景。
内容的提问来源于stack exchange,提问作者Baiqing
相关产品推荐
相关产品推荐

