- 背景
最近在做es线上和离线集群的隔离,在全量数据(采用mapreduce编写)时,需要追加全量时间推送到kafka的数据,kafka数据包含写入/更新和删除数据操作,写入和更新采用的是官方的EsOutPutFormat(elasticsearch-hadoop-mr-6.0.1)类型进行编写,这版不支持删除操作,因此在mapreduce中采用直连es来进行索引数据删除,上面错误是在创建RestClient对象时报的。
- 错误原因
上面那个原因主要是由于引用的下面的依赖中间接依赖了http-core4.4.5与hadoop上低版本http-core冲突导致,这个问题看着很难处理,hadoop上面的包又不能动,本地的高版本加了也白加,都会引用hadoop上的包,那么怎么解决呢?
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.0.1</version>
</dependency>
- 解决
包冲突无非是引用到了低版本的同样路径下的类,那把本地包的冲突的类路径更改就可以了。
我的解决办法是新建一个项目,把上面的restclient引入进来,通过下面的这个插件可以更改路径下包的位置。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>org.elasticsearch.client</pattern>
<shadedPattern>fullbuilder.org.elasticsearch.client</shadedPattern>
</relocation>
<relocation>
<pattern>org.apache.http</pattern>
<shadedPattern>org.fullbuilder.apache.http</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
- 把上面的引用单独打成jar包,在引用RestClient等相关的es包时使用自己打的包的类,这样就相当于引用的http-core包的类路径变了,就不会找到低版本的路径上去。