前提条件
已开通文件存储 HDFS 版服务并创建文件系统实例和挂载点。具体操作,请参见文件存储HDFS版快速入门。
已为Hadoop集群所有节点安装JDK,且JDK版本不低于1.8。更多信息,下载JDK。
已根据集群Hadoop版本对Tez重新编译。具体操作,请参见Tez安装。
已根据Hadoop版本对Tez重新编译。
本文使用的Apache Hadoop版本为2.8.5,Tez版本为0.9.2,编译后的两个压缩包如下。
tez-dist/target/tez-0.9.2-minimal.tar.gz //最小压缩包,仅包含Tez依赖
tez-dist/target/tez-0.9.2.tar.gz //完整压缩包,包含Tez和Hadoop依赖
背景信息
Apache Tez是构建在Hadoop YARN之上支持分布式DAG(Directed Acyclic Graph)的计算框架,支持通过复杂的DAG描述并处理大数据任务。Tez主要使用在Apache Hive中,作为Hive的一种执行引擎。与Hive on MR(MapReduce)相比,Hive on Tez具有更好的查询性能和稳定性。
步骤一:Hadoop集群挂载文件存储 HDFS 版实例
在Hadoop集群中配置文件存储 HDFS 版实例。具体操作,请参见挂载文件系统。
步骤二:安装Tez到Hadoop集群
安装Tez共有三种安装方式,差异点如下。
(推荐)方式一:安装Tez时使用本身预打包的Hadoop依赖
将编译好的完整压缩包上传至文件存储 HDFS 版目录下。
执行以下命令,解压完整压缩包到指定目录(例如tez-0.9.2/)。
mkdir tez-0.9.2
tar -zxvf tez-0.9.2.tar.gz -C tez-0.9.2/
执行以下命令,将已下载的文件存储 HDFS 版Java SDK放到指定目录中(例如tez-0.9.2/lib)。
cp aliyun-sdk-dfs-x.y.z.jar tez-0.9.2/lib
执行以下命令,重新压缩文件。
tar -zcvf tez-0.9.2.tar.gz -C tez-0.9.2/ .
执行以下命令,查看压缩包中包含文件存储 HDFS 版Java SDK。
tar -ztvf tez-0.9.2.tar.gz | grep aliyun-sdk-dfs-x.y.z.jar
执行以下命令,将重新压缩的压缩包放到文件存储 HDFS 版实例目录下。
hadoop fs -mkdir -p /apps/tez-0.9.2
hadoop fs -put tez-0.9.2.tar.gz /apps/tez-0.9.2
在${HADOOP_HOME}/etc/hadoop下新建文件tez-site.xml并同步到Hadoop集群所有节点。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>tez.lib.uris</name>
<value>${fs.defaultFS}/apps/tez-0.9.2/tez-0.9.2.tar.gz</value>
</property>
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>false</value>
</property>
</configuration>
为客户端节点添加Tez依赖库。
将编译好的最小压缩包解压到本地目录,同时将该目录同步到Hadoop集群所有节点。
mkdir -p /opt/module/tez-0.9.2
tar -xvzf tez-0.9.2-minimal.tar.gz -C /opt/module/tez-0.9.2
在Hadoop Classpath中添加tez-site.xml配置和最小压缩包解压后的Jar文件,并同步修改到Hadoop集群所有节点。
执行以下命令,打开hadoop-env.sh文件。
vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
在hadoop-env.sh文件末尾添加如下内容。
export TEZ_CONF_DIR=${HADOOP_HOME}/etc/hadoop/tez-site.xml
export TEZ_JARS=/opt/module/tez-0.9.2
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${TEZ_CONF_DIR}:${TEZ_JARS}/*:${TEZ_JARS}/lib/*
方式二:安装Tez时使用集群环境中的Hadoop依赖
将编译好的Tez最小压缩包上传至文件存储 HDFS 版目录下。
hadoop fs -mkdir -p /apps/tez-0.9.2-minimal
hadoop fs -put tez-0.9.2-minimal.tar.gz /apps/tez-0.9.2-minimal
在${HADOOP_HOME}/etc/hadoop下新建文件tez-site.xml并同步修改到Hadoop集群所有节点。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>tez.lib.uris</name>
<value>${fs.defaultFS}/apps/tez-0.9.2-minimal/tez-0.9.2-minimal.tar.gz</value>
</property>
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>true</value>
</property>
</configuration>
为客户端节点添加Tez依赖库。
将编译好的最小压缩包解压到本地目录,同时将该目录同步到Hadoop集群所有节点。
mkdir -p /opt/module/tez-0.9.2
tar -xvzf tez-0.9.2-minimal.tar.gz -C /opt/module/tez-0.9.2
在Hadoop Classpath中添加tez-site.xml配置和最小压缩包解压后的Jar文件,并同步修改到Hadoop集群所有节点。
执行以下命令,打开hadoop-env.sh文件。
vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
在hadoop-env.sh文件末尾添加如下内容。
export TEZ_CONF_DIR=${HADOOP_HOME}/etc/hadoop/tez-site.xml
export TEZ_JARS=/opt/module/tez-0.9.2
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${TEZ_CONF_DIR}:${TEZ_JARS}/*:${TEZ_JARS}/lib/*
方式三:安装Tez时使用额外的Hadoop依赖
使用该方式需要重新编译Hadoop,获取hadoop-dist/target/hadoop-x.y.z.tar.gz压缩包。
将编译好的Tez最小压缩包上传至文件存储 HDFS 版目录下。
执行以下命令,解压最小压缩包到指定目录(例如tez-0.9.2-minimal/)。
mkdir tez-0.9.2-minimal-new tez-0.9.2-minimal
tar -zxvf tez-0.9.2-minimal.tar.gz -C tez-0.9.2-minimal/
执行以下命令,将文件存储 HDFS 版Java SDK放到指定目录(例如tez-0.9.2-minimal/lib)。
cp aliyun-sdk-dfs-x.y.z.jar tez-0.9.2-minimal/lib
执行以下命令,重新压缩文件。
tar -zcvf tez-0.9.2-minimal-new/tez-0.9.2-minimal.tar.gz -C tez-0.9.2-minimal/ .
压缩完成后,你还可以执行以下命令,查看压缩包中包含文件存储HDFS版Java SDK。
tar -ztvf tez-0.9.2-minimal-new/tez-0.9.2-minimal.tar.gz | grep aliyun-sdk-dfs-x.y.z.jar
执行以下命令,将新压缩包上传至文件存储 HDFS 版实例目录中。
hadoop fs -mkdir -p /apps/tez-0.9.2-minimal
hadoop fs -put tez-0.9.2-minimal-new/tez-0.9.2-minimal.tar.gz /apps/tez-0.9.2-minimal
将编译后的Hadoop压缩包上传至文件存储 HDFS 版目录。
hadoop fs -mkdir -p /apps/hadoop-2.8.5
hadoop fs -put hadoop-dist/target/hadoop-2.8.5.tar.gz /apps/hadoop-2.8.5
在${HADOOP_HOME}/etc/hadoop下新建文件tez-site.xml,并将文件同步到所有Hadoop集群节点。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>tez.lib.uris</name>
<value>${fs.defaultFS}/apps/tez-0.9.2-minimal/tez-0.9.2-minimal.tar.gz#tez,${fs.defaultFS}/apps/hadoop-2.8.5/hadoop-2.8.5.tar.gz#hadoop-mapreduce</value>
</property>
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>false</value>
</property>
<property>
<name>tez.lib.uris.classpath</name>
<value>./tez/*:./tez/lib/*:./hadoop-mapreduce/hadoop-2.8.5/share/hadoop/common/*:./hadoop-mapreduce/hadoop-2.8.5/share/hadoop/common/lib/*:./hadoop-mapreduce/hadoop-2.8.5/share/hadoop/hdfs/*:./hadoop-mapreduce/hadoop-2.8.5/share/hadoop/hdfs/lib/*:./hadoop-mapreduce/hadoop-2.8.5/share/hadoop/yarn/*:./hadoop-mapreduce/hadoop-2.8.5/share/hadoop/yarn/lib/*:./hadoop-mapreduce/hadoop-2.8.5/share/hadoop/mapreduce/*:./hadoop-mapreduce/hadoop-2.8.5/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
为客户端节点添加Tez依赖库。
将编译好的最小压缩包解压到本地目录,同时将该目录同步到Hadoop集群所有节点。
mkdir -p /opt/module/tez-0.9.2
tar -xvzf tez-0.9.2-minimal.tar.gz -C /opt/module/tez-0.9.2
在Hadoop Classpath中添加tez-site.xml配置和最小压缩包解压后的Jar文件,并同步修改到Hadoop集群所有节点。
执行以下命令,打开hadoop-env.sh文件。
vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
在hadoop-env.sh文件末尾添加如下内容。
export TEZ_CONF_DIR=${HADOOP_HOME}/etc/hadoop/tez-site.xml
export TEZ_JARS=/opt/module/tez-0.9.2
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${TEZ_CONF_DIR}:${TEZ_JARS}/*:${TEZ_JARS}/lib/*
步骤三:验证Tez
检测Hadoop集群Tez引擎是否可运行。
执行以下命令,在文件存储 HDFS 版中生成测试数据。
${HADOOP_HOME}/bin/hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar \
randomtextwriter \
-D mapreduce.randomtextwriter.totalbytes=10240 \
-D mapreduce.randomtextwriter.bytespermap=1024 \
dfs://f-xxxxxxx.cn-zhangjiakou.dfs.aliyuncs.com:10290/input
其中,f-xxxxxxx.cn-zhangjiakou.dfs.aliyuncs.com
为文件存储 HDFS 版的挂载点,请根据实际情况替换。
执行以下命令,使用Tez对测试数据进行Word Count运算。
${HADOOP_HOME}/bin/hadoop jar /opt/module/tez-0.9.2/tez-examples-0.9.2.jar orderedwordcount dfs://f-xxxxxxx.cn-zhangjiakou.dfs.aliyuncs.com:10290/input dfs://f-xxxxxxx.cn-zhangjiakou.dfs.aliyuncs.com:10290/output
其中,tez-examples-0.9.2.jar在Tez最小压缩包的本地解压目录下。
执行以下命令,查看执行任务引擎是否为Tez。
/opt/module/hadoop-2.8.5/bin/yarn application -status <Application ID>
其中,<Application ID>
为执行任务的Application ID,请根据实际情况替换。
如果显示如下信息,则表示执行任务的引擎为Tez。
测试Hadoop集群MapReduce引擎是否受Tez引擎影响。
执行以下命令,提交MapReduce测试作业。
${HADOOP_HOME}/bin/hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.8.5-tests.jar sleep -mt 1 -rt 1 -m 1 -r 1
执行以下命令,查看任务详情。
/opt/module/hadoop-2.8.5/bin/yarn application -status <Application ID>
其中,<Application ID>
为执行任务的Application ID,请根据实际情况替换。
如果显示如下信息,则表示MapReduce引擎不受Tez引擎影响。
Hive服务验证。
检测Hive服务是否可以正常调用MapReduce引擎。
执行以下命令,配置Hive使用MapReduce引擎,然后进行Count运算。
hive> SET hive.execution.engine=mr;
hive> DROP TABLE IF EXISTS user_info_test;
hive> CREATE TABLE user_info_test(user_id BIGINT, firstname STRING, lastname STRING, country STRING);
hive> INSERT INTO user_info_test VALUES(1,'Dennis','Hu','CN'),(2,'Json','Lv','Jpn'),(3,'Mike','Lu','USA');
hive> SELECT country,count(*) FROM user_info_test GROUP BY country;
执行以下命令,查看任务详情。
${HADOOP_HOME}/bin/yarn application -status <Application ID>
其中,<Application ID>
为执行任务的Application ID,请根据实际情况替换。
如果显示如下信息,则表示Hive服务可以正常调用MapReduce引擎。
检测Hive服务是否可以正常调用Tez引擎。
执行以下命令,配置Hive使用Tez引擎,然后进行Count运算。
hive> SET hive.execution.engine=tez;
hive> DROP TABLE IF EXISTS user_info_test;
hive> CREATE TABLE user_info_test(user_id BIGINT, firstname STRING, lastname STRING, country STRING);
hive> INSERT INTO user_info_test VALUES(1,'Dennis','Hu','CN'),(2,'Json','Lv','Jpn'),(3,'Mike','Lu','USA');
hive> SELECT country,count(*) FROM user_info_test GROUP BY country;
执行以下命令,查看任务详情。
${HADOOP_HOME}/bin/yarn application -status <Application ID>
其中,<Application ID>
为执行任务的Application ID,请根据实际情况替换。
如果显示如下信息,则表示Hive服务可正常调用Tez引擎。