java.lang.NoSuchMethodError: io.netty.bootstrap.Bootstrap.config()Lio/netty/bootstrap/BootstrapConfig
错误原因是,spark和es引用了io.netty的包的不同版本。在依赖树里把spark的低版本的去掉就行了。
但在spark的集群环境还会报错
java.lang.AbstractMethodError: org.apache.spark.network.protocol.MessageWithHeader.touch(Ljava/lang/Object;)Lio/netty/util/
ReferenceCounted;
java.lang.AbstractMethodError: org.apache.spark.network.protocol.MessageWithHeader.touch(Ljava/lang/Object;)Lio/netty/util/ReferenceCounte
d;
因为spark的io.netty的版本低,但是类加载器会优先加载spark的jars包里的类,然后就不加载用户自己的类了。
尝试通过设置:--conf spark.driver.userClassPathFirst=true --conf spark.executor.userClassPathFirst=true
但是并不好用,spark自己加载的时候会出异常。
最后采用的:maven-shade-plugin
在打包的时候把es依赖下的io.netty包改名,然后传到集群后,就能和集群的io.netty并存了,也不会出错了。