Hive 2.x集成Tez0.9.0引擎指南(Hive-on-Tez)
作者:家辉 日期:2018年12月19日 CSDN博客:https://blog.csdn.net/gobitan
目录
Hive为什么集成Tez
Tez版本选择
Tez版本下载
Tez编译
Tez安装
配置tez-site.xml
环境变量配置/etc/profile
解决Hadoop版本兼容性问题
启动Hive执行
测试数据准备
Hive-on-MR与Hive-on-Tez性能对比
Hive日志
常见错误及解决办法
参考资料
Hive为什么要集成Tez?
Hive默认的执行引擎为MapReduce,此外它还支持Apache Tez™, Apache Spark™。
Tez是一个构建于YARN之上的支持复杂的DAG任务的数据处理框架。它由Hontonworks开源,它把mapreduce的过程拆分成若干个子过程,同时可以把多个mapreduce任务组合成一个较大的DAG任务,减少了mapreduce之间的文件存储,同时合理组合其子过程从而大幅提升MapReduce作业的性能。
MapReduce:离线计算
Spark:内存计算
Storm:流式计算
Tez:YARN之上支持DAG作业的计算框架
Tez版本选择
根据tez官网关于tez与Hadoop版本之间的关系,Hadoop2.7.3可以使用Tez0.9.0这个版本。三个框架的版本如下:
Hadoop 2.7.3
Hive 2.1.1
Tez 0.9.0
参考:http://tez.apache.org/install.html
Tez版本下载
http://tez.apache.org/releases/apache-tez-0-9-0.html,有二进制版本和源码版本可以选择,分别为 apache-tez-0.9.0-bin.tar.gz和apache-tez-0.9.0-src.tar.gz。可直接下载编译好的二进制版本,也可以下载源码自己编译。
源码编译比较耗时,这里直接使用二进制版本,大约58M。
编译Tez
这里采用二进制版本,因此无需编译,略
Tez安装
前提:集群已启动,将apache-tez-0.9.0-bin.tar.gz上传到服务器。
[root@hadoop01 ~]# cd /opt/
[root@hadoop01 opt]# tar zxf ~/apache-tez-0.9.0-bin.tar.gz
[root@hadoop01 opt]# mv apache-tez-0.9.0-bin/ tez-0.9.0
[root@hadoop01 ~]# hdfs dfs -mkdir -p /apps/tez-0.9.0
[root@hadoop01 ~]# cd /opt/tez-0.9.0/
[root@hadoop01 tez-0.9.0]# hdfs dfs -put share/tez.tar.gz /apps/tez-0.9.0
配置tez-site.xml
在hadoop的配置文件目录下创建tez-site.xml配置文件,如下:
[root@hadoop01 ~]# cd /opt/hadoop-2.7.3/etc/hadoop/
[root@hadoop01 hadoop]# vi tez-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>tez.lib.uris</name>
<value>${fs.defaultFS}/apps/tez-0.9.0/tez.tar.gz</value>
</property>
<property>
<name>tez.container.max.java.heap.fraction</name>
<value>0.2</value>
</property>
</configuration>
参考:/opt/tez-0.9.0/conf/tez-default-template.xml
环境变量配置/etc/profile
追加如下部分:
export TEZ_CONF_DIR=$HADOOP_CONF_DIR
export TEZ_JARS=/opt/tez-0.9.0/*:/opt/tez-0.9.0/lib/*
export HADOOP_CLASSPATH=$TEZ_CONF_DIR:$TEZ_JARS:$HADOOP_CLASSPATH
执行"source /etc/profile"让环境变量生效。
解决Hadoop版本兼容性问题
[root@hadoop01 ~]# cd /opt/tez-0.9.0/lib
[root@hadoop01 lib]# rm -rf hadoop-mapreduce-client-core-2.7.0.jar hadoop-mapreduce-client-common-2.7.0.jar
[root@hadoop01 lib]# cp /opt/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.3.jar /opt/tez-0.9.0/lib/
[root@hadoop01 lib]# cp /opt/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.7.3.jar /opt/tez-0.9.0/lib/
启动Hive执行
[root@hadoop01 ~]# hive
SET hive.execution.engine=tez;
测试数据准备
CREATE TABLE user_info(user_id BIGINT, firstname STRING, lastname STRING, country STRING);
insert into user_info values(1, 'Dennis', 'Hu', 'CN'),(2, 'Mike', 'Lu','USA'),(3, 'Json', 'Lv', 'JPN'),(4, 'Terry', 'Tang', 'CN'),(5, 'Avril', 'Dong', 'CN'),(6, 'Colin', 'Liu', 'CN'),(7, 'Carl', 'Mo', 'CN'),(8, 'Mike', 'Zhao', 'CN'),(9, 'Nancy', 'Xu', 'CN'),(10, 'Jady', 'Gao', 'CN'),(11, 'Jack', 'Ma', 'USA'),(12, 'David', 'Yang', 'USA');
CREATE TABLE user_info_bucketed(user_id BIGINT, firstname STRING, lastname STRING)
COMMENT 'A bucketed copy of user_info'
PARTITIONED BY(country STRING)
CLUSTERED BY(user_id) INTO 3 BUCKETS;
INSERT OVERWRITE TABLE user_info_bucketed
PARTITION (country='CN')
SELECT user_id, firstname, lastname FROM user_info
WHERE country='CN';
Hive-on-MR与Hive-on-Tez性能对比
Tez
第一次:48s
第二次:20s
第三次:17s
清理数据可用truncate table user_info_bucketed
换回MR引擎测试
SET hive.execution.engine=mr;
MR
第一次:56s
第二次:56s
第三次:52s
Hive日志
/tmp/root/hive.log
常见问题及解决办法
问题[1]
错误现象:ERROR [main] exec.TaskRunner: Error in executeTask java.lang.NoSuchFieldError: DEFAULT_MR_AM_ADMIN_USER_ENV
问题原因:Hadoop版本与Tez中自带Hadoop JAR包版本不兼容导致的
解决办法:替换hadoop包,参见"解决Hadoop版本兼容性问题"部分。
问题[2]
错误现象:Container killed on request. Exit code is 143
错误原因:总内存较小,而container在JVM中内存占比过高
解决办法:在tez-site.xml中增加如下配置,默认0.8,调低占比
<property>
<name>tez.container.max.java.heap.fraction</name>
<value>0.3</value>
</property>
参考资料:
[2] https://www.infoq.com/articles/apache-tez-saha-murthy
[3] https://www.infoq.com/presentations/apache-tez