G:\Bigdata\2.hive\大数据技术之Hive源码编译
第1章 部署Hadoop和Hive
1.1 版本测试
Hadoop3.3.6 和Hive3.1.3
运行hive客户端时报错:
java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
查看Hadoop在Github上的pom依赖,在hadoop-project模块中:
hadoop/hadoop-project/pom.xml at rel/release-3.3.6 · apache/hadoop · GitHub
查看Hive的Guava依赖:
hive/pom.xml at rel/release-3.1.3 · apache/hive · GitHub
Hadoop启动后调用了guava-27中的一些方法,而Hive在启动时,它的JVM中加载的是guava-19这个版本,而这版本中就没有这个方法。
第2章 Hadoop和Hive的兼容性问题
2.1 问题原因
上述问题是由Hadoop3.1.3版本所依赖的guava-27.0-jre和Hive-3.1.3版本所依赖的guava-19.0不兼容所致。
2.2 解决思路
1)更换Hadoop版本
经过观察发现,Hadoop-3.1.0,Hadoop-3.1.1,Hadoop-3.1.2版本的guava依赖均为guava-11.0.2,而到了Hadoop-3.1.3版本,guava依赖的版本突然升级到了guava-27.0-jre。
Hive-3的所有发行版本的guava依赖均为guava-19.0。而guava-19.0和guava-11.0.2版本是兼容的,所以理论上降低Hadoop版本,这个问题就能得到有效的解决。
通过对github上源码的提交记录,可以找到跟guava相关的信息:branch 选择Hadoop rel/3.1.3
找到hadoop-project的pom.xml, 点击history,搜索guava
点进去之后发现这个升级跟guava的漏洞CVE-018-10237有关:
继续搜索这个漏洞的详细信息,发现里面描述的这个guava漏洞从guava11.0 一直到guava-24版本都存在,因此Hadoop才从3.1.3一下子升级到guava-27.