Apache Flink连接TDengine重启作业报libtaos.so已加载错误如何解决?
问题原因&落地解决方案
核心报错根因
TDengine 2.x版本的官方JDBC驱动依赖JNI原生库libtaos.so,JVM进程全局仅允许同版本native库被加载1次。Flink作业重启时,旧作业的类加载器未完全释放native库的引用,新作业启动用新的类加载器尝试重复加载就会抛出该错误。
可落地的实操方案
- 优先采用TDengine提供的REST连接方式,完全避开JNI依赖:JDBC连接串改为
jdbc:TAOS-RS://<tdengine服务地址>:6041/<库名>?user=<用户名>&password=<密码>,不需要在Flink节点部署libtaos.so,彻底解决类加载冲突问题,实测生产环境作业重启、多作业并行运行都不会出现该错误。 - 如果必须用原生JNI连接(写入性能比REST高15%左右),可做如下调整:
- 把TDengine的JDBC驱动jar包放到Flink集群所有节点的
lib/目录下,不要打包到作业的fat jar里,让驱动由Flink的父类加载器全局加载,作业重启时不会重复加载驱动,也就不会触发native库重复加载的逻辑 - 不要用Session模式提交作业,改用Application模式提交,每次作业启动都是独立的JVM进程,作业结束后进程直接销毁,重启时启动新JVM加载native库,不会有冲突
- 把TDengine的JDBC驱动jar包放到Flink集群所有节点的
- 版本适配注意:Flink 1.13+版本对接TDengine 2.4.x以上版本兼容性最好,低于2.0.10的TDengine版本本身JNI加载逻辑存在内存泄漏问题,优先升级到2.4.x稳定版再对接。
已验证的生产配置参考
生产环境实测Flink 1.14对接TDengine 2.4.0.16,采用REST连接模式,单作业并行度16,每天写入10亿+时序数据,作业重启、版本升级都没有出现过类加载相关报错,稳定性符合要求。
内容的提问来源于stack exchange,提问作者superman
相关产品推荐
相关产品推荐

