今天更新flink程序时候报了一个异常,如下图:

第一反应就是看代码是否有未判断类型的强转,找到代码对应位置

确认了在强转前做了类型判断了,所以只能是怀疑val类的oracle.sql.TIMESTAMP和强转的(oracle.sql.TIMESTAMP)类不一样?

接着debug时候加了jvm参数 -D -verbose:class 将程序中加载的所有类以及类所在的路径都打印出来,找oracle.sql.TIMESTAMP,结果如下:

果然oracle.sql.TIMESTAMP类被load了两次,一次是blobStore-xxxx,一次是自己程序xxx.jar加载,到这里如果熟悉flink的朋友们应该就知道为啥了, blobStore-xxx路径是flink的作业缓存服务路径,这里同时涉及到flink作业的类加载部分内容。

通过flink官方文档介绍看到该问题有3种解决方案:

  • 将oracle的jar包上传到flink的lib目录下
  • 配置classloader.resolve-order: parent-first选项
  • 配置classloader.parent-first-patterns-additional将jdbc驱动类都添加到这里

上述方法都测试过都不会再报那个错误了,最终我选择了第3种方法,后续如果有别的类也需要使用parent-first加载方式都可以直接再后边添加。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐