maven打包本地jar包
使⽤HiveUDF时jar包冲突问题及解决⽅案
问题背景
使⽤Hive开发UDF,UDF中使⽤到了com.fasterxml.jackson包中的jackson-databind,版本为2.10.2,pom引⽤⽅式如下:
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.2</version>
</dependency>
开发完成后,本地测试通过,打包上传集,然后通过hive客户端创建TEMPORARY FUNCTION测试,结果报错如下:
FAILED: SemanticException [Error 10014]: org.apache.hadoop.adata.HiveException: Unabl
e to execute method public java.lang.String com.soul .hiveudf.Ip2CityInfoByAw.evaluate(java.lang.String) with arguments {223.104.148.143}:com.fasterxml.de.ArrayNode.<init>(Lcom/faster xml/jackson/databind/node/JsonNodeFactory;Ljava/util/List;)V
原因分析
1. 此问题不难看出,是jackson-databind jar包版本冲突导致
2. 由于本地测试时没有jar包冲突,便想到应该是hive环境与udf-jar包中的依赖存在冲突问题。
3. 排查hive安装⽬录lib下的相关jar包及hive-env.sh配置中的HIVE_AUX_JARS_PATH参数配置,看是否存在不同版本的jackson-
databind或jackson-core包
4. 果不其然,在hive的lib⽬录下存在2.6.5版本的jackson-databind包,由于udf中使⽤了⾼版本的jar包,但hive执⾏时却出现jar包冲
突导致实际引⽤了低版本的jar包,⽽低版本jar包中没有此⽅法,导致的报错。
解决⽅式:
1. 删除hive lib⽬录下冲突的相关jar包或更新⾄⾼版本,但此⽅案可能影响到其他功能的使⽤,风险太⾼,不采⽤。
2. 修改udf中的引⽤版本,但是本场景下此⽅法会涉及到相关引⽤源码的修改,成本⾼且不是很合适,不采⽤。
3. 经过询问同事及资料搜索,最终到了⼀种较完美的解决⽅案:从udf项⽬的pom⽂件⼊⼿,把引⽤到的⾼版本jackson相关jar包以
shaded的⽅式引⽤,⼤概原理类似于给引⽤到的jar包改个名字,这样就可以解决与集中的jar包冲突问题,配置如下:
4.  <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
<configuration>
<relocations>
<relocation>
<pattern>com.fasterxml.jackson</pattern>
<shadedPattern>shaded.fasterxml.jackson</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。