Hive 2.x集成Tez0.9.0引擎指南(Hive-on-Tez)

作者:家辉  日期:2018年12月19日 CSDN博客:

 

目录

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>

参考资料:

[1] http://tez.apache.org/

[2] 

[3]