刚才打开自己在阿里云的一台服务器,并准备在上面测试Hive的一些功能,原以为很顺利,没想到一上来一个show databases;就报错了,如图
奇怪了,以前是没有问题的啊,为啥会出现这个错误呢?
定睛一看,十有八九是jar包冲突了,问题就是出在guava这个包里头,于是跑去hive下的lib上看一看
会不会guava的版本太高或者太低了,先试一试。
先后把guava-13.0.1.jar,guava-16.0.1.jar,guava-20.0.jar分别替换掉/data/aaron/app/hive-1.1.0-cdh5.12.2/lib目录底下的guava-14.0.1.jar。
不幸的是,进入hive之后重新show databases;,依然报开篇所说的那个错误。好吧,再仔细想想,这样的话,有可能依然还是guava这个包冲突了,就是说有可能某个地方guava的版本太高了,没有了emptyIterator()这个方法了,或者是被其他包覆盖了,这都是有可能的。
假设是第一种可能,某个地方guava的版本太高了,没有了emptyIterator()这个方法。先来看看guava是什么时候移除掉这个方法的。
https://github.com/google/guava/wiki/Release20
通过这个网址就能知道,在guava-20.0就把emptyIterator()这个方法移除掉,有图为证
那问题来了,我哪个地方用到了高版本的guava啊,find来看看
[hadoop@hadoop004 lib]$ find /data/aaron/ -name "guava*"
我还真用了高版本的guava,还把原来的11版本的guava做了个备份,好吧,估计问题就是出现在这里,直接把版本降回来
[hadoop@hadoop004 lib]$ mv /data/aaron/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/lib/guava-20.0.jar /data/aaron/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/lib/guava-20.0.jar.bak
[hadoop@hadoop004 lib]$ mv /data/aaron/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/lib/guava-11.0.2.jar.bak /data/aaron/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/lib/guava-11.0.2.jar
再运行Hive
妥了,搞定!!