在文件存储 HDFS 版上使用Apache Tez

本文主要介绍在挂载文件存储 HDFS 版的Hadoop集群上安装及使用Apache Tez。

前提条件

  • 已开通文件存储 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 版Java SDK放到Tez的依赖中。

  • 支持Hadoop集群滚动升级。

方式二:安装Tez时使用集群环境中的Hadoop依赖

  • 如果Hadoop环境中已配置文件存储 HDFS 版Java SDK,则不需要额外配置。

  • 不支持Hadoop集群滚动升级。

方式三:安装Tez时使用额外的Hadoop依赖

  • 需要将文件存储 HDFS 版Java SDK放到Tez的依赖中或者额外的Hadoop依赖中。

  • 支持Hadoop集群滚动升级。

(推荐)方式一:安装Tez时使用本身预打包的Hadoop依赖

  1. 将编译好的完整压缩包上传至文件存储 HDFS 版目录下。

    1. 执行以下命令,解压完整压缩包到指定目录(例如tez-0.9.2/)。

      mkdir tez-0.9.2
      tar -zxvf tez-0.9.2.tar.gz -C tez-0.9.2/
    2. 执行以下命令,将已下载的文件存储 HDFS 版Java SDK放到指定目录中(例如tez-0.9.2/lib)。

      cp aliyun-sdk-dfs-x.y.z.jar tez-0.9.2/lib
    3. 执行以下命令,重新压缩文件。

      tar -zcvf tez-0.9.2.tar.gz -C tez-0.9.2/ .
    4. 执行以下命令,查看压缩包中包含文件存储 HDFS 版Java SDK。

      tar -ztvf tez-0.9.2.tar.gz | grep aliyun-sdk-dfs-x.y.z.jar
    5. 执行以下命令,将重新压缩的压缩包放到文件存储 HDFS 版实例目录下。

      hadoop fs -mkdir -p /apps/tez-0.9.2
      hadoop fs -put tez-0.9.2.tar.gz /apps/tez-0.9.2

  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>

  3. 为客户端节点添加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
  4. 在Hadoop Classpath中添加tez-site.xml配置和最小压缩包解压后的Jar文件,并同步修改到Hadoop集群所有节点。

    1. 执行以下命令,打开hadoop-env.sh文件。

      vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
    2. 在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依赖

  1. 将编译好的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

  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-minimal/tez-0.9.2-minimal.tar.gz</value>
        </property>
        <property>
            <name>tez.use.cluster.hadoop-libs</name>
            <value>true</value>
        </property>
    </configuration>
  3. 为客户端节点添加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
  4. 在Hadoop Classpath中添加tez-site.xml配置和最小压缩包解压后的Jar文件,并同步修改到Hadoop集群所有节点。

    1. 执行以下命令,打开hadoop-env.sh文件。

      vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
    2. 在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压缩包。

  1. 将编译好的Tez最小压缩包上传至文件存储 HDFS 版目录下。

    1. 执行以下命令,解压最小压缩包到指定目录(例如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/

    2. 执行以下命令,将文件存储 HDFS 版Java SDK放到指定目录(例如tez-0.9.2-minimal/lib)。

      cp aliyun-sdk-dfs-x.y.z.jar tez-0.9.2-minimal/lib

    3. 执行以下命令,重新压缩文件。

      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
    4. 执行以下命令,将新压缩包上传至文件存储 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

  2. 将编译后的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

  3. 在${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>
  4. 为客户端节点添加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
  5. 在Hadoop Classpath中添加tez-site.xml配置和最小压缩包解压后的Jar文件,并同步修改到Hadoop集群所有节点。

    1. 执行以下命令,打开hadoop-env.sh文件。

      vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
    2. 在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

  1. 检测Hadoop集群Tez引擎是否可运行。

    1. 执行以下命令,在文件存储 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 版的挂载点,请根据实际情况替换。

    2. 执行以下命令,使用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最小压缩包的本地解压目录下。

    3. 执行以下命令,查看执行任务引擎是否为Tez。

      /opt/module/hadoop-2.8.5/bin/yarn application -status <Application ID>

      其中,<Application ID>为执行任务的Application ID,请根据实际情况替换。

      如果显示如下信息,则表示执行任务的引擎为Tez。Tez-1

  2. 测试Hadoop集群MapReduce引擎是否受Tez引擎影响。

    1. 执行以下命令,提交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  
    2. 执行以下命令,查看任务详情。

      /opt/module/hadoop-2.8.5/bin/yarn application -status <Application ID> 

      其中,<Application ID>为执行任务的Application ID,请根据实际情况替换。

      如果显示如下信息,则表示MapReduce引擎不受Tez引擎影响。MapReduce

  3. Hive服务验证。

    1. 检测Hive服务是否可以正常调用MapReduce引擎。

      1. 执行以下命令,配置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;

      2. 执行以下命令,查看任务详情。

        ${HADOOP_HOME}/bin/yarn application -status <Application ID>

        其中,<Application ID>为执行任务的Application ID,请根据实际情况替换。

        如果显示如下信息,则表示Hive服务可以正常调用MapReduce引擎。MapReduce1

    2. 检测Hive服务是否可以正常调用Tez引擎。

      1. 执行以下命令,配置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; 
      2. 执行以下命令,查看任务详情。

        ${HADOOP_HOME}/bin/yarn application -status <Application ID>

        其中,<Application ID>为执行任务的Application ID,请根据实际情况替换。

        如果显示如下信息,则表示Hive服务可正常调用Tez引擎。Tez2