一般对于这种配置类的,官网都有相应的指南。但官网上的Hive on Tez指南太简略了(至少我配置的时候是这样的),再加上今天在尝试的时候着实花了一番功夫,所以有些点还是值得写出来,以免大家重复踩坑。我的安装版本分别是hive-2.1.1,tez-0.8.4。
(1) 关于版本
为了保证兼容性,Hive和Tez需要使用对应的版本。所以务必下载对应的版本,然后再开始配置。
(2) 关于Tez的安装
我在网上以及官网上看到的都需要下载tez项目(github)然后进行Maven打包,生成tez-version-SNAPSHOT-archive.tar.gz
。
但在实际操作中,我从官网上下载了对应版本的tar.gz包之后就开始使用,具体流程如下:
由于Tez是新一代的计算引擎并且是构建在YARN之上的,所以一些依赖需要被集群共享,因此它包含的一些jar包需要上传到HDFS中。
解压tez-0.8.4-tar.gz
,进入share目录,将tez.tar.gz
放到HDFS中:
hdfs dfs -put /user/allen/ ~/OpenSource/tez-0.8.4/share/tez.tar.gz
(3) 关于Hive的配置
由于Hive本身是基于HDFS的,所以如果Hadoop的计算引擎替换成了Tez,那么它也可以使用,但是这种方式侵入性比较大,需要整个Hadoop集群都替换。另外一种,在Hive层面配置Tez。
首先在${HIVE_HOME}/conf/hive-site.xml中将计算引擎替换成tez,这个是全局层面的。当然也可以在进入hive console之后,配置Session层面的。
<property>
<name>hive.execution.engine</name>
<value>tez</value>
</property>
hive> set hive.execution.engine=tez;
然后在${HIVE_HOME}/conf/中新建tez-site.xml
并配置如下属性,以让Hive使用:
# tez-site.xml
<property>
<name>tez.lib.uris</name>
<value>hdfs://localhost/user/allen/tez.tar.gz</value>
</property>
<property>
<property>
<name>tez.lib.uris.classpath</name>
<value>
$HADOOP_CONF_DIR,
$HADOOP_HOME/share/hadoop/common/*,
$HADOOP_HOME/share/hadoop/common/lib/*,
$HADOOP_HOME/share/hadoop/hdfs/*,
$HADOOP_HOME/share/hadoop/hdfs/lib/*,
$HADOOP_HOME/share/hadoop/mapreduce/*,
$HADOOP_HOME/share/hadoop/mapreduce/lib/*,
$HADOOP_HOME/share/hadoop/yarn/*,
$HADOOP_HOME/share/hadoop/yarn/lib/*
</value>
</property>
tez.lib.uris.classpath
配置一些属性是因为Tez好像不能加载Hadoop的一些包,比较典型的是如果Hive中的查询涉及到LZO格式文件的读取,就会出现com.hadoop.compression.lzo.LzoCodec not found
异常。
接下来这点是我目前还不能理解的,即使上面配置好了。还需要将解压后的tez-0.8.4中所有tez-*.jar以及tez-0.8.4/lib中的部分jar(我配置的时候是commons-collections4-4.1.jar
)也放入{HIVE_HOME}/conf/lib
下面。
运行hive命令,然后看到日志中出现如下信息就说明配置成功了。
INFO [Tez session start thread]: impl.YarnClientImpl (:()) - Submitted application application_1483168665382_0018
INFO [Tez session start thread]: client.TezClient (:()) - The url to track the Tez Session: http://192.168.31.65:8088/proxy/application_1483168665382_0018/
我在配置中遇到的问题大多集中在NoClassDefFoundError,像什么org/apache/tez/dag/api/SessionNotRunning
,org.apache.tez.dag.app.DAGAppMaster
,这类问题一般是Hive找不到相应的依赖,所以可以尝试在${HIVE_HOME}/conf/lib以及tez-site.xml中添加相应依赖来解决。
最重要的一点是 – 在配置的过程中,一定要时刻关注hive日志以及Hadoop Resource Manager(http://localhost:8088)中的任务日志,它们会输出很多有用的信息,可以帮助我们进行错误的排查。
Hive日志的位置在${HIVE_HOME}/conf
中配置,同样如果这种开源项目你接触多了,你就会了解很多配置文件默认都是以模板(template)形式存在的,默认是hive-log4j2.properties.template
,复制一份hive-log4j2.properties
,配置property.hive.log.dir
属性即可
property.hive.log.dir = /path/hive/log
参考
> Hive on Tez com.hadoop.compression.lzo.LzoCodec not found
> Hive on Tez com.hadoop.compression.lzo.LzoCodec not found CDH5
> Tez安装
> Tez官网配置