您的位置:首页 > 其它

通过maven-shade-plugin 解决Elasticsearch与spark的jar包冲突问题

2017-08-29 16:27 666 查看
项目需求,通过spark写入ES,用官方自带的restful 接口,存在性能问题,改用TCP方式写入,但是遇到和spark环境jar冲突,冲突为guava jar包。
刚开始通过修改spark 环境变量使得 guava jar版本包统一,但是只能运行spark local 模式下。
后来采用网上技术文章maven-shade-plugin,才得以彻底解决。网上有很多现成的maven-shade-plugin解决ES jar冲突问题,包括ES 官网也有提示。
但是总有一些坑,所以现在我结合自己的亲身实践,将经验分享给大家
新建一个maven项目进行如下配置如下


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>my.elasticsearch</groupId>
<artifactId>es-shaded</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<elasticsearch.version>2.3.3</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.elasticsearch.plugin</groupId>-->
<!--<artifactId>shield</artifactId>-->
<!--<version>${elasticsearch.version}</version>-->
<!--</dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.guava</pattern>
<shadedPattern>my.elasticsearch.guava</shadedPattern>
</relocation>
<relocation>
<pattern>org.joda</pattern>
<shadedPattern>my.elasticsearch.joda</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>my.elasticsearch.common</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.thirdparty</pattern>
<shadedPattern>my.elasticsearch.thirdparty</shadedPattern>
</relocation>
</relocations>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" />
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>elasticsearch-releases</id>
<url>http://maven.elasticsearch.org/releases</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>


可能有冲突的jar包通过maven-shade-plugin插件迁移后重新打个jar包从而使得在引入这个jar包时能够使用该jar包自己的依赖而不是使用外部依赖。
pom文件配置完成后运行:


mvn clean install

回到原来的应用项目的pom文件中。引入该jar包

<dependency>
<groupId>my.elasticsearch</groupId>
<artifactId>es-shaded</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>


运行spark job时

spark-submit \
--class XXX \
--jars es-shaded-1.0-SNAPSHOT.jar  \
--master yarn-client \
--executor-memory 5G \
--num-executors 50 \
--packages XXX \
XXX.jar \
XXX XXX


一切OK了,maven-shade-plugin本质是重新打包,将包名替换以避免冲突。

好多技术文章带有以下这个依赖,但是解决版本冲突不需要,所以被注释,

<!--<dependency>-->
<!--<groupId>org.elasticsearch.plugin</groupId>-->
<!--<artifactId>shield</artifactId>-->
<!--<version>${elasticsearch.version}</version>-->
<!--</dependency>-->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: