分享

Flink动态加载代码,动态加载SQL方案

ld512870 2019-3-27 11:47:37 发表于 方案探讨 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 13233
对于不断增加的新业务需求,通常的方式是改flink代码,然后重新release,但是这并不是一种很好的方式,现在比较流行的就是动态的加载代码,比如新增了一条sql,我要在不停止job的情况下让job感知到,比如我新加udf,也要让job感知到,或者新的业务代码。 现在有什么好的方案吗?知乎上看到一个https://zhuanlan.zhihu.com/p/52007980 还没来得及细看。大家都有什么方案啊。

已有(3)人评论

跳转到指定楼层
ld512870 发表于 2019-3-27 11:48:46
另外,吐槽一下,答疑的模块为啥没有flink模块。。。
回复

使用道具 举报

s060403072 发表于 2019-3-27 16:53:40
ld512870 发表于 2019-3-27 11:48
另外,吐槽一下,答疑的模块为啥没有flink模块。。。

这个可以实现。需要使用Java 8 自带的 Nashorn虚拟机。Java 8 自带的 Nashorn虚拟机为什么可以实现加载那?
从引擎的原理入手,文中由于引擎是不可序列化,因此用了一个引擎池单例。

这个引擎的本质什么?
一个map变量,也就是可以理解为一个集合或则数据结构。这里面包含哪些内容?
一个key和value
Key为URL
Value为读取URL中的JS代码而创建的JavaScript引擎。

上面我们可以看到一个url对应一个JavaScript引擎。
当我们修改代码的时候,就修改配置。
引擎会定期读取的配置文件的时候会自动检测到新的URL并且启动一个新的引擎。

对于Flink来讲:
Flink作为流计算的框架,Flink的加载机制是:

生成DAG -> 序列化 -> 分发到各个节点 -> 加载DAG(这个时候会运行一些Rich的部分)-> 运行

而我们相当于在DAG中定义了一个动态的Node,所有的数据流到Node中来,然后再根据当前的加载情况去分发数据。

于是采用反复读取URL,对比有无改变来决定是否重新加载JavaScript引擎。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条