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

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

记录一次flink程序类转换异常_第1张图片

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

记录一次flink程序类转换异常_第2张图片

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

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

记录一次flink程序类转换异常_第3张图片

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

你可能感兴趣的:(java,大数据,flink,大数据,java)