记录一次flink程序类转换异常

316 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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

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

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

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

image.png 果然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加载方式都可以直接再后边添加。