flink集群ArangoConfigure init 初始化失败报java.lang.NoSuchFieldError: INSTANCE异常解决办法

公司项目,运行在flink集群上,能够正常启动任务,但是没有正常工作。经过调查发现ArangoDB的ArangoConfigure 类在调用init方法初始化时报出java.lang.NoSuchFieldError: INSTANCE异常。

java.lang.NoSuchFieldError: INSTANCE
	at org.apache.http.conn.ssl.SSLConnectionSocketFactory.(SSLConnectionSocketFactory.java:144)
	at com.arangodb.http.HttpManager.initSSLConnectionSocketFactory(HttpManager.java:707)
	at com.arangodb.http.HttpManager.init(HttpManager.java:121)
	at com.arangodb.ArangoConfigure.init(ArangoConfigure.java:289)

我们的集群版本信息如下:

  • flink: 1.3.0  ,运行在yarn上。
  • hadoop: 2.7.2

通过排查,及打印错误日志,找到了原因。ArangoConfigure初始化时会使用httpclient中相关类。我们项目使用的ArangoDB客户端自带了httpclient 4.5.1,但是flink集群启动时在classpath中加载了hadoop common中的httpclient 4.2.5,导致项目中的4.5.1未能使用。故报了上面提到的异常。下面是hadoop common中的httpclient 相关jar包。

/usr/local/hadoop-2.7.2/share/hadoop/common/lib/httpcore-4.2.5.jar
/usr/local/hadoop-2.7.2/share/hadoop/common/lib/httpclient-4.2.5.jar

解决办法很简单,删除上述hadoop common中的httpclient相关的两个jar包,重启flink集群即可。