前言
最近发现hive作业运行较慢,在对hive做了优化后,虽然效率提高了几倍,但总感觉还是可以再提高,想到之前使用Apache开源版本的Hadoop配置过Hive on Tez,于是照那一套方法配置,发现完全不是那么一回事儿,Cloudera公司针对Hive做了修改,很多框架在Apache开源版本上可以正常使用,但在CDH版本上会出现不兼容的问题,而Tez官方也没有提供CDH版本的Tez(Tez是Hortonworks的项目,Hortonworks与Cloudera是竞争关系),这时候就需要自己针对CDH版本编译对应的jar。于是查找了很多相关资料,修改了源码文件的几处代码和一些pom配置后才编译通过。
文章最后,我会把已经编译好的jar包共享出来,此编译好的二进制包是针对cdh5.5.4版本的,其他版本没有测试可用性。
关于Hive on Tez:
Tez是由Hortonworks公司发起的一个分布式计算框架项目,希望能够取代Map Reduce作为Hadoop生态系统下一代的分布式计算引擎。Hive on Tez作为Hortonworks stinger(Hortonworks改进Hive的项目代号)的一部分,已经在Hive 0.13版本(于2014年4月21号发布)中支持,目前最新稳定版为0.8.4
有关Apache 开源hadoop的tez安装和使用请参考本站博文:HIVE ON TEZ安装使用 参考手册
环境说明cdh版本:5.5.4
hive版本:1.1.2
hadoop版本:2.6.0
jdk版本:1.8
安装Tez1、将安装包里的名称为tez-0.8.4.tar.gz的包上传到hdfs上一个目录下,我这里使用的是/apps目录
命令:hadoop fs -put tez-0.8.4.tar.gz /apps2、在/etc/hive/conf目录下创建tez-site.xml文件,添加如下内容:
tez.lib.uris
${fs.defaultFS}/apps/tez-0.8.4.tar.gz
3、把tez-0.8.4目录下的所有jar包和lib下的jar包拷贝到hive的lib目录下。我的hive的lib路径为:/opt/cloudera/parcels/CDH-5.5.4-1.cdh5.5.4.p0.9/lib/hive/lib
Tez VS MR启动hive的shell环境,进入shell,执行命令:set hive.execution.engine=tez;
hive支持的执行引擎共三个,mr、spark、tez,hive默认的执行引擎为mr。将hive的执行引擎切换到tez,这个需要每次使用前执行这个命令,如果关闭了shell窗口,下次再进入hive的shell环境是需要重新设置执行引擎为tez,如果不设置,hive使用默认的执行引擎为mr。
使用Tez执行作业
此时,在yarn的作业监控界面,可以看到有一个作业类型为tez的长连接任务出现。如图:
使用MR执行作业
结论
使用mr引擎执行作业耗时:149.78s
使用tez引擎执行作业耗时:22.38s
由此可知,149.78/22.38=6.69,tez
note:tez好像不支持hive通过jdbc方式提交作业时,会报错。
错误堆栈:Exception in thread "main" java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:296)
at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:392)
at mx.tc.hive.common.HiveJdbcTest.main(HiveJdbcTest.java:59)
Hive日志
监控hive日志文件,如果没有特别配置hive的日志存储目录,则默认在/tmp/root/下,(root为你当前登录的用户名,我这里使用的是超级用户。)
命令:tail -f /tmp/root/hive.log
如果hive执行报错,在这个日志文件中都会有详细错误日志产生,便于排除错误。
下载地址
以下是共享的360云盘下载地址,tez-0.8.4.rar里包含所有需要的jar包和压缩包。