TEZ 0.8.5与Hadoop2.7.3的guava兼容性问题

来源:互联网 发布:反ps软件叫什么 编辑:程序博客网 时间:2024/06/05 02:39
1. 背景描述
为了提升Hive的处理能力,同时为Hive2.0的llap做技术准备,因此准备将集群Hive的引擎由mr更改为tez。
2. 问题
在将Hive的引擎由MR替换为tez后,在运行任务时,经常会出现如下的报错:
java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.mapred.FileInputFormat
3. 问题分析
网上查找后找到了问题原因:
   (1)此报错是因为hadoop调用google的guava中的一个stopwatch方法,但是该方法不存在造成的
之所以产生这个问题,是因为谷歌新版guava中,已经将这个stopwatch方法设置为deprecated。因此再调用此方法后就会产生错误。
(2)查看hadoop2.7.3源码
    查看源码发现,在hadoop2.7.3的org.apache.hadoop.mapred.FileInputFormat类中,的确有调用stopwatch方法,但是调用的方法是hadoop本身类org.apache.hadoop.util.JvmPauseMonitor.java中的方法,并没有使用guava
(3)再次查看,发现Hadoop官方修复过这个问题
    在HADOOP-11032中,已经修复了Hadoop调用stopwatch因guava版本变化造成的错误。如下所示:

(4)查看Tez安装目录
    在tez的lib目录中发现了hadoop2.6.0的包

    再次分析发现,官方的tez0.8.5基于Hadoop2.6.0编译,tez0.9.0基于Hadoop2.7.0编译
   总结:
在Hadoop2.7.0之前的版本中,使用了guava的stopwatch方法,该方法在guava v16后,被置为decprecated。hadoop为了解决这个问题,在hadoop2.7.0时,使用了自己的stopwatch方法替换掉了这个方法。集群使用的hadoop版本是hadoop2.7.3.而tez自带的hadoopjar包是2.6.0,还会调用guava的该方法,造成错误的出现
  
  4.解决方案
  (1)在hadoop2.7.3的环境下,用源码重新编译生成tez安装包
  (2)使用tez0.9.0 ,但是注意:0.9.0要求java版本为1.8
  (3)替换jar包
   其他不变,替换lib中对应的jar包,替换为2.7.3版本。同时将上传到hdfs上的tez.tar.gz包中的所有hadoop2.6.0的jar包,统一替换为2.7.3版本的,然后重新打包上传
原创粉丝点击