通过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>-->
相关文章推荐
- 通过maven-shade-plugin 解决Elasticsearch与spark的jar包冲突问题
- 通过maven-shade-plugin 解决Elasticsearch与hbase的jar包冲突问题
- 通过maven-shade-plugin 解决Elasticsearch与hbase的jar包冲突问题
- 通过maven-shade-plugin 解决Elasticsearch与hbase的jar包冲突问题
- 使用maven-shade-plugin插件解决spark依赖冲突问题
- 使用maven-shade-plugin插件解决spark依赖冲突问题
- 施用 maven shade plugin 解决 jar 或类的多版本冲突
- 使用maven-shade-plugin构建可执行jar 解决junit4测试问题 maven项目
- maven-shade-plugin打包可执行jar包及解决schema报错问题
- 怎么spring security 和maven,spring,结合jar包冲突和依赖关系问题解决办法。
- 利用maven工具解决jar包冲突问题或重复加载问题
- Maven打包方式,以及jar包冲突问题的解决方法
- 用maven工具解决jar包冲突问题或重复加载问题
- 通过maven-shade-plugin插件打可以独立运行的jar包
- 怎么解决maven管理jar包冲突问题
- 查lib下的jar来自哪个maven依赖(通过用于解决jar版本冲突)
- 解决maven生成的web项目下的servlet.jar与tomcat自带servlet.jar冲突的问题
- 利用maven工具解决jar包冲突问题或重复加载问题
- maven解决jar冲突问题
- 解决gradle的本地工程依赖和通过maven依赖之间的冲突问题