1.了解Tez
什么是Tez,我们为什么要安装它,官方的Introduction是这样的
Introduction
The Apache TEZ® project is aimed at building an application framework which allows for a complex directed-acyclic-graph of tasks for processing data. It is currently built atop Apache Hadoop YARN.
(Apache Tez®项目目标是构建一个可以通过复杂DAG处理数据流程任务的应用框架,目前构建在Apache Hadoop YARN上)
The 2 main design themes for Tez are:(Tez的两个设计主题)
Empowering end users by:(通过以下方式给予终端用户更多的权利:)
Expressive dataflow definition APIs(富有表现力的数据流程定义API)
Flexible Input-Processor-Output runtime model(灵活的输入处理器输出运行时模型)
Data type agnostic(数据类型无关性,即不关注数据格式类型)
Simplifying deployment(简易部署)
Execution Performance(执行情况)
Performance gains over Map Reduce(性能优于Map Reduce)
Optimal resource management(最佳的资源管理)
Plan reconfiguration at runtime(运行时计划重新配置)
Dynamic physical data flow decisions(动态物理数据流决策)
By allowing projects like Apache Hive and Apache Pig to run a complex DAG of tasks, Tez can be used to process data, that earlier took multiple MR jobs, now in a single Tez job as shown below.(通过允许类似Apache Hive、Apache Pig这样的项目运行复杂的DAG任务,通过tez来处理数据。在这之前需要多个mr作业实现,现在在一个tez作业中就可以完成,如下所示。)
左图中运行多个MR任务,每一个MR任务会将中间结果存储在HDFS中,每个reducer的中间结果为下一个mapper提供数据处理来源。Tez的处理过程就是一个MRR的过程,启用一个任务完成处理流程,任务与任务间不需要额外访问HDFS。
以上是Tez一个大体介绍,更多详细的Tez实现原理及过程请大家访问Tez官方网址:http://tez.apache.org/ 或检索其他文章,本文重点介绍与记录Tez在CDH环境下的搭建与融合,对于Tez的详细原理不做展开描述。
2.编译安装
公司Online环境中使用的是HDP,最近由于一些项目的实验加资源紧张于是随手抓来3台台式机,自建CDH集群。
2.1 软件环境 (版本适配)
- CM/CDH 版本:CM5.16.1 / CDH5.16.1(hadoop2.6.0)
- Tez 0.8.5
- JDK 1.8.0_121
- CentOS-6.8-x86_64
2.2 编译环境
- Maven3 及以上版本
- JDK8及以上版本
- Protobuf2.5.0 【必须使用此版本】
2.3 编译环境配置
2.3.1 JDK环境变量 (自行配置并验证其成功)
[root@node3 ~]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
2.3.2 Maven 环境变量 (自行配置并验证其成功)
[root@node3 ~]# mvn -version
Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 23:22:22+0800)
Maven home: /opt/maven3
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_121/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-642.el6.x86_64", arch: "amd64", family: "unix"
2.3.3 安装编译环境依赖的OS包
[root@node3 ~]# yum -y install gcc gcc-c++ libstdc++-devel make build
安装Protobuf2.5.0
需要通过源码的方式编译安装
Protobuf2.5.0的源码包下载地址:
链接: https://pan.baidu.com/s/1L0iMTCxr9m91X5MZdP1Txw 提取码: x3sh
[root@node3 download]# tar -zxvf protobuf-2.5.0
[root@node3 download]# cd protobuf-2.5.0
编译安装
[root@node3 protobuf-2.5.0]# ./configure
[root@node3 protobuf-2.5.0]# make & make install
执行安装……
验证是否成功
[root@node3 protobuf-2.5.0]# protoc --version
libprotoc 2.5.0
[root@node3 protobuf-2.5.0]#
2.4 编译Tez 0.8.5
2.4.1 下载Tez
从Apache官网及GitHub 下载均可
http://apache.claz.org/tez/0.8.5/apache-tez-0.8.5-src.tar.gz
https://github.com/apache/tez/archive/rel/release-0.8.5.tar.gz
[root@node3 download]# wget http://apache.claz.org/tez/0.8.5/apache-tez-0.8.5-src.tar.gz
--2018-12-29 16:54:41-- http://apache.claz.org/tez/0.8.5/apache-tez-0.8.5-src.tar.gz
正在解析主机 apache.claz.org... 216.245.218.171
正在连接 apache.claz.org|216.245.218.171|:80... 已连接。
解压文件
[root@node3 download]# tar -zxvf apache-tez-0.8.5-bin.tar.gz
2.4.2 Tez 文件修改
进入解压目录
[root@node3 download]# cd apache-tez-0.8.5-src
2.4.2.1 修改pom.xml 文件
在apache-tez-0.8.5-src 根目录下找到pom.xml做以下三处修改:
- 修改
为自己CDH的版本名称 - 添加CDH Maven仓库依赖
- 注释掉一些不需要的模块 注释掉tez-ext-service-tests(编译会报错);tez-ui、tez-ui2(不安装)
版本名称修改
添加CDH Maven仓库依赖 在
中及 中
cloudera
https://repository.cloudera.com/artifactory/cloudera-repos/
Cloudera Repositories
false
cloudera
Cloudera Repositories
https://repository.cloudera.com/artifactory/cloudera-repos/
注释掉一些不需要的模块 在
中
2.4.2.2 修改JobContextImpl.java 文件
进入目录找到JobContextImpl.java文件
[root@node3 apache-tez-0.8.5-src]# cd tez-mapreduce/src/main/java/org/apache/tez/mapreduce/hadoop/mapreduce
[root@node3 mapreduce]# ls
JobContextImpl.java package-info.java TaskInputOutputContextImpl.java
MapContextImpl.java TaskAttemptContextImpl.java TezNullOutputCommitter.java
在类的最后增加如下方法
/**
* Get the boolean value for the property that specifies which classpath
* takes precedence when tasks are launched. True - user's classes takes
* precedence. False - system's classes takes precedence.
* @return true if user's classes should take precedence
*/
@Override
public boolean userClassesTakesPrecedence() {
return getJobConf().getBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, false);
}
2.4.2.3 执行Tez编译(注意在apache-tez-0.8.5-src目录下进行)
[root@node3 apache-tez-0.8.5-src]# mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true
开始编译……
当显示BUILD SUCCESS 则编译成功,如报错按照错误网上进行下排查重新编译。
至此编译Tez环节全部结束,下面进入Tez与CDH hive的相关配置
2.4 配置Tez 0.8.5与CDH 5.16.1 Hive集成
进入apache-tez-0.8.5-src 目录找到编译后的文件
[root@node3 apache-tez-0.8.5-src]# cd tez-dist/target/
2.4.1 将tez-0.8.5.tar.gz 上传至HDFS目录
(注意:root用户可能没有权限 可以用hdfs用户操作)
[root@node3 target]# su -hdfs
[hdfs@node3 target]$ hadoop fs -mkdir -p /apps/
[hdfs@node3 target]$ hadoop fs -put tez-0.8.5.tar.gz /apps/
[hdfs@node3 target]$ hadoop fs -chmod -R 777 /apps
[hdfs@node3 target]$ hadoop fs -ls /apps
Found 1 items
-rwxrwxrwx 3 hdfs supergroup 46364342 2018-12-28 12:12 /apps/tez-0.8.5.tar.gz
2.4.2 {HIVE_HOME}/conf目录下创建tez-site.xml文件
CM安装的Hive conf目录在/etc/hive/conf 目录下,在Client、HiveServer2和HiveMetastore服务所在节点的相应目录下均创建该文件
tez.lib.uris
${fs.defaultFS}/apps/tez-0.8.5.tar.gz
2.4.3 拷贝Tez jar包至 Hive lib 中
将tez-dist/target/tez-0.8.5目录下和lib目录下的所有jar包拷贝至{HIVE_HOME}/lib目录下
CM安装的hive程序目录我这里是在/app/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hive/lib/
对照你自己安装时的目录查找即可
[root@node3 tez-0.8.5]# cd /opt/download/apache-tez-0.8.5-src/tez-dist/target/tez-0.8.5
[root@node3 tez-0.8.5]# cp -r *.jar /app/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hive/lib/
[root@node3 tez-0.8.5]# cp -r lib/*.jar /app/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hive/lib/
注意:Client、HiveServer2和HiveMetastore服务所在节点均cp一份,我这里的node3是hive client 同时也是HiveMetastore 服务,我的HiveServer2 在node2上所以我需要scp进行下同步
[root@node3 tez-0.8.5]# scp -r *.jar node2.hadoop:/app/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hive/lib/
[root@node3 tez-0.8.5]# scp -r lib/*.jar node2.hadoop:/app/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hive/lib/
2.4.4 避免kryo错误
删除hive/auxlib下的hive-exec-1.1.0-cdh5.9.3-core.jar和hive-exec-core.jar 否则会有kryo错误
我这里的CDH安装目录为:/app/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hive/auxlib
将两个jar包删除或重名下即可
(Client、HiveServer2和HiveMetastore服务均需要操作)
[root@node3 auxlib]# ls
hive-exec-1.1.0-cdh5.16.1-core.jar.bak hive-exec-core.jar.bak
重启HiveServer2和HiveMetastore服务
2.5 运行Hive
hive> set hive.execution.engine=tez;
hive> select count(1) from default.kylin_account;
Query ID = hdfs_20181229182828_b27d6636-7ff0-4de1-8667-bc47b11117e2
Total jobs = 1
Launching Job 1 out of 1
Status: Running (Executing on YARN cluster with App id application_1545810060751_0024)
--------------------------------------------------------------------------------
VERTICES STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
--------------------------------------------------------------------------------
Map 1 .......... SUCCEEDED 1 1 0 0 0 0
Reducer 2 ...... SUCCEEDED 1 1 0 0 0 0
--------------------------------------------------------------------------------
VERTICES: 02/02 [==========================>>] 100% ELAPSED TIME: 4.50 s
--------------------------------------------------------------------------------
OK
10000
Time taken: 14.274 seconds, Fetched: 1 row(s)
通过Yarn的8080界面可以看到作业类型变为了TEZ
测试成功……
这种部署方式是非侵入式的,为集群使用保留了一定的自由度。
hive执行时可以自行切换tez或mr来运行
hive> set hive.execution.engine=tez;
或
hive> set hive.execution.engine=mr;
另外一种方式就是配置hadoop运行环境,则整体运行就会默认都使用yarn
以后有时间再进行补充