Flink es-sink解决java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW

在写Flink实例时,遇到将case class 样例类转换为jsonObject后,在添加到es sink source中时,报错java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW。

问题总结

出现以下问题的原因是jar包的依赖版本问题。解决该问题需要引入高版本的包,同时解决包冲突问题。

java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW

从以下两图中可以看出,2.3.1的包中确实没有FAIL_ON_SYMBOL_HASH_OVERFLOW 字段,而在2.8.11版本的包中可以看到注释,在2.4版本后加入了这个字段,由此问题找到,是因为引入的jar包版本问题,解决过程中还需要考虑jar包冲突的问题。

Flink es-sink解决java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW

在这里插入图片描述

  • 解决jar包冲突
  1. IDEA安装maven helper插件,如下图,安装完后重启IDEA。

Flink es-sink解决java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW

2.打开pom文件,在下方会出现dependency Analyzer,点击这个标签打开对应界面。如下面第二个图,圈出来的都是具有冲突的jar包,需要我们逐一解决冲突。

Flink es-sink解决java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
Flink es-sink解决java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW

3.将左边含有冲突的jar包点开,在右边会出现冲突的包的具体版本和位置。选择自己要排除的引用,右键点击Exclude即可,解决完冲突后,点击Reimport重新加载引用,冲突全部解决完左边列表将是空的。

Flink es-sink解决java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW

4.另外可以使用maven 命令来查看具体的引用。使用命令 mvn dependency:tree -Dverbose以层级树方式查看全部传递原来。可以看到层级树对应的上图插件的内容(层级树是父引用在上面,而插件显示的是父引用在选项栏最下面),这里还显示与2.3.1版本的包冲突。

Flink es-sink解决java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW

5.上面命令显示的是全部的传递依赖,也可以通过命令控制输出内容为自己想要的或不想要的。 -Dincludes= xxx是过滤有xxx字段的依赖,-Dexcludes=xxx是排除我不想要的依赖。