Ubuntu 22.04 安装 Apache Tez 0.10.5 指南

Ubuntu 22.04 从零部署 Apache Tez 0.10.5:安装 OpenJDK 8 与 Hadoop 3.4.1,配置 tez-site.xml 与 HADOOP_CLASSPATH,跑示例作业验证,含 JVM 堆限制与卸载。

Apache TezApache Tez2026/10/12

Ubuntu 22.04 安装 Apache Tez 0.10.5 指南

一、环境信息

本文在单台 Ubuntu 22.04 服务器上以 root 账号完成 Apache Tez 0.10.5 的完整安装与验证,安装形态为「Hadoop 伪分布式 + Tez 运行时库」。

项目值
操作系统Ubuntu 22.04.5 LTS
主机名node1
登录账号root
JDKOpenJDK 8(openjdk-8-jdk)
Hadoop3.4.1(伪分布式,NameNode 与 DataNode 同机)
Tez0.10.5
安装目录/opt/hadoop-3.4.1、/opt/apache-tez-0.10.5-bin
数据目录/data/hadoop/namenode、/data/hadoop/datanode

服务器内存建议不低于 8 GB。Tez 本身没有常驻守护进程,它以 YARN 应用(Tez ApplicationMaster 加执行单元)的形式运行,因此安装 Tez 的核心是:部署 Hadoop 集群、把 Tez 发行包放入 HDFS、在客户端配置 tez-site.xml 与 HADOOP_CLASSPATH。

二、前置条件

2.1 配置主机名与 hosts

hostnamectl set-hostname node1

在 /etc/hosts 中补充本机解析(将实际 IP 替换为服务器地址,例如 192.168.10.11):

cat >> /etc/hosts <<'EOF'
192.168.10.11 node1
EOF

2.2 安装基础软件

OpenJDK 8、SSH 服务与下载工具是必装项;sudo 用于 Hadoop 启动脚本的权限切换调用:

apt-get update
apt-get install -y openjdk-8-jdk openssh-server openssh-client rsync wget sudo

确认 Java 版本:

java -version

回显:

openjdk version "1.8.0_402"
OpenJDK Runtime Environment (build 1.8.0_402-8u402-ga-1ubuntu2~22.04-b06)
OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)

2.3 配置 SSH 免密登录

Hadoop 的启停脚本通过 SSH 连接本机拉起进程,必须配置 root 免密登录:

ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

启动 SSH 服务并设置开机自启(每条命令只操作一个单元):

systemctl enable ssh
systemctl start ssh

验证免密登录:

ssh -o StrictHostKeyChecking=no localhost echo ssh-ok

回显:

Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
ssh-ok

三、版本选型说明

  • Tez 0.10.5 是 Apache 官方当前最新稳定版(2025-05-12 发布),下载页 https://downloads.apache.org/tez/0.10.5/ 提供二进制包 apache-tez-0.10.5-bin.tar.gz(约 90 MB)。
  • Tez 0.10.5 的发行包内捆绑的是 Hadoop 3.4.1 客户端库(hadoop-hdfs-client-3.4.1.jar 等),因此 Hadoop 选用同版本 3.4.1,兼容性最佳。实测运行时 Tez 的 HadoopShim 自动探测日志为 hadoopVersion=3.4.1, majorVersion=3, minorVersion=4,说明二者完全匹配。
  • 运行时 JDK 使用 OpenJDK 8。Tez 0.10.5 与 Hadoop 3.4.1 在 Java 8 下运行最稳定;若使用 Java 11,需注意个别第三方依赖(如 Jersey 1.x)存在兼容风险。
  • 首次下载建议校验 sha512,文件与校验值均来自下载页同名 .sha512 文件。

四、部署步骤

4.1 下载并解压 Hadoop 3.4.1

wget https://downloads.apache.org/hadoop/common/hadoop-3.4.1/hadoop-3.4.1.tar.gz -O /opt/hadoop-3.4.1.tar.gz

回显(节选):

hadoop-3.4.1.tar.gz   100%[===================>] 928.66M  12.4MB/s  in 76s
cd /opt && tar -xzf hadoop-3.4.1.tar.gz

4.2 下载并解压 Tez 0.10.5

wget https://downloads.apache.org/tez/0.10.5/apache-tez-0.10.5-bin.tar.gz -O /opt/apache-tez-0.10.5-bin.tar.gz

回显(节选):

apache-tez-0.10.5-bin.tar.gz   100%[===================>]  90.11M  11.8MB/s  in 8.6s
cd /opt && tar -xzf apache-tez-0.10.5-bin.tar.gz

解压后的关键内容:

ls /opt/apache-tez-0.10.5-bin

回显:

LICENSE  LICENSE-BSD-3clause  LICENSE-CDDLv1.0  LICENSE-CDDLv1.1-GPLv2_withCPE  LICENSE-MIT
LICENSE-SIL_OpenFontLicense-v1.1  NOTICE  conf  hadoop-shim-0.10.5.jar  hadoop-shim-2.8-0.10.5.jar
lib  share  tez-api-0.10.5.jar  tez-common-0.10.5.jar  tez-dag-0.10.5.jar
tez-examples-0.10.5.jar  tez-mapreduce-0.10.5.jar  tez-runtime-internals-0.10.5.jar
tez-runtime-library-0.10.5.jar

其中 share/tez.tar.gz 是要上传到 HDFS 的完整运行时包,tez-examples-0.10.5.jar 是官方示例作业。

4.3 配置全局环境变量

cat > /etc/profile.d/hadoop-tez.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/opt/hadoop-3.4.1
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export TEZ_HOME=/opt/apache-tez-0.10.5-bin
export TEZ_CONF_DIR=$TEZ_HOME/conf
export TEZ_JARS=$TEZ_HOME
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_CLASSPATH=$TEZ_CONF_DIR:$TEZ_HOME/*:$TEZ_HOME/lib/*
EOF
source /etc/profile.d/hadoop-tez.sh

4.4 配置 Hadoop 环境(hadoop-env.sh)

向 /opt/hadoop-3.4.1/etc/hadoop/hadoop-env.sh 追加配置。这里显式限定各守护进程 JVM 堆为 256-512 MB,并以 root 运行:

cat >> /opt/hadoop-3.4.1/etc/hadoop/hadoop-env.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HDFS_NAMENODE_OPTS="-Xms256m -Xmx512m -Dhadoop.security.logger=INFO,RFAS"
export HDFS_DATANODE_OPTS="-Xms256m -Xmx512m -Dhadoop.security.logger=ERROR,RFAS"
export HDFS_SECONDARYNAMENODE_OPTS="-Xms256m -Xmx512m"
export YARN_RESOURCEMANAGER_OPTS="-Xms256m -Xmx512m"
export YARN_NODEMANAGER_OPTS="-Xms256m -Xmx512m"
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
EOF

说明:

  • Java 8 不支持 -Xlog:gc* 选项(那是 Java 9+ 的统一日志语法),不要把该参数写进上述 OPTS,否则 JVM 直接启动失败,报 Unrecognized option: -Xlog:gc*。
  • Hadoop 3.x 以 root 执行启动脚本时,五个 *_USER 变量缺一个都会报 Attempting to operate on hdfs namenode as root,并以 Aborting operation 结束。
  • 修改堆内存的位置就是这里;修改后用 jps -v 验证(见 4.9 节)。

4.5 配置 Hadoop 四个核心 XML

core-site.xml:

cat > /opt/hadoop-3.4.1/etc/hadoop/core-site.xml <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/data/hadoop/tmp</value>
  </property>
</configuration>
EOF

hdfs-site.xml:

cat > /opt/hadoop-3.4.1/etc/hadoop/hdfs-site.xml <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///data/hadoop/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///data/hadoop/datanode</value>
  </property>
</configuration>
EOF

mapred-site.xml(map/reduce 任务的 JVM 堆限制同样落在 256-512 MB 区间):

cat > /opt/hadoop-3.4.1/etc/hadoop/mapred-site.xml <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapreduce.map.java.opts</name>
    <value>-Xmx512m</value>
  </property>
  <property>
    <name>mapreduce.reduce.java.opts</name>
    <value>-Xmx512m</value>
  </property>
  <property>
    <name>mapreduce.map.memory.mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>1024</value>
  </property>
</configuration>
EOF

yarn-site.xml:

cat > /opt/hadoop-3.4.1/etc/hadoop/yarn-site.xml <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>4</value>
  </property>
  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>256</value>
  </property>
  <property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
  </property>
</configuration>
EOF

创建数据目录:

mkdir -p /data/hadoop/namenode /data/hadoop/datanode /data/hadoop/tmp

4.6 格式化 NameNode 并启动 Hadoop

hdfs namenode -format

回显(节选):

2026-10-12 00:56:33,007 INFO common.Storage: Storage directory /data/hadoop/namenode has been successfully formatted.

启动 HDFS 与 YARN:

start-dfs.sh

回显:

Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [node1]
start-yarn.sh

回显:

Starting resourcemanager
Starting nodemanagers

用 jps 确认五个进程都在:

jps

回显:

8126 NameNode
8237 DataNode
8444 SecondaryNameNode
8685 ResourceManager
8794 NodeManager
9000 Jps

4.7 上传 Tez 运行时包到 HDFS

hdfs dfs -mkdir -p /apps/tez-0.10.5
hdfs dfs -put $TEZ_HOME/share/tez.tar.gz /apps/tez-0.10.5/
hdfs dfs -ls /apps/tez-0.10.5/

回显:

Found 1 items
-rw-r--r--   1 root supergroup   72795938 2026-10-12 00:58 /apps/tez-0.10.5/tez.tar.gz

4.8 编写 tez-site.xml

在 $TEZ_CONF_DIR(即 /opt/apache-tez-0.10.5-bin/conf)下创建 tez-site.xml:

cat > /opt/apache-tez-0.10.5-bin/conf/tez-site.xml <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>tez.lib.uris</name>
    <value>hdfs:///apps/tez-0.10.5/tez.tar.gz</value>
  </property>
  <property>
    <name>tez.use.cluster.hadoop-libs</name>
    <value>false</value>
  </property>
  <property>
    <name>tez.am.resource.memory.mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>tez.am.launch.cmd-opts</name>
    <value>-Xmx512m</value>
  </property>
  <property>
    <name>tez.task.resource.memory.mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>tez.task.launch.cmd-opts</name>
    <value>-Xmx512m</value>
  </property>
  <property>
    <name>tez.am.log.level</name>
    <value>INFO</value>
  </property>
</configuration>
EOF

关键点:

  • tez.lib.uris 指向 4.7 节上传到 HDFS 的 tez.tar.gz,Tez ApplicationMaster 与各执行单元启动时由 YARN 本地化该包并加载其中的类。
  • tez.use.cluster.hadoop-libs 保持 false,使用 Tez 包内自带的 Hadoop 库,避免版本不一致。
  • tez.am.launch.cmd-opts 与 tez.task.launch.cmd-opts 将 AM 和 Task 的 JVM 堆限制在 512 MB;对应的 YARN 资源单元内存(resource.memory.mb=1024)留出一倍余量给堆外内存,防止执行单元被 YARN 判定超限杀死。

4.9 验证 JVM 堆参数

jps -v

回显(节选,五个进程均带 -Xms256m -Xmx512m):

8794 NodeManager -Dproc_nodemanager -Djava.net.preferIPv4Stack=true -Xms256m -Xmx512m -Dyarn.log.dir=/opt/hadoop-3.4.1/logs
8126 NameNode -Dproc_namenode -Djava.net.preferIPv4Stack=true -Dhdfs.audit.logger=INFO,NullAppender -Xms256m -Xmx512m
8237 DataNode -Dproc_datanode -Djava.net.preferIPv4Stack=true -Xms256m -Xmx512m
8685 ResourceManager -Dproc_resourcemanager -Djava.net.preferIPv4Stack=true -Xms256m -Xmx512m
8444 SecondaryNameNode -Dproc_secondarynamenode -Djava.net.preferIPv4Stack=true -Xms256m -Xmx512m

4.10 准备测试数据并运行 OrderedWordCount

hdfs dfs -mkdir -p /data/wc/input
printf "hello tez\nhello hadoop\napache tez is fast\nteza tez hello\n" > /tmp/wc.txt
hdfs dfs -put /tmp/wc.txt /data/wc/input/wc.txt

运行官方 OrderedWordCount 示例(一条由 3 个 Vertex 组成的 DAG):

hadoop jar $TEZ_HOME/tez-examples-0.10.5.jar orderedwordcount /data/wc/input/wc.txt /data/wc/output

回显(节选):

2026-10-12 00:58:55,405 INFO client.TezClient: Tez Client Version: [ component=tez-api, version=0.10.5, revision=60f3a013e904de3049e22b1a6784a51e5339bfcd, buildTime=2025-05-12T09:40:18Z, buildJavaVersion=1.8.0_292 ]
2026-10-12 00:58:55,443 INFO shim.HadoopShimsLoader: Picked HadoopShim org.apache.tez.hadoop.shim.DefaultHadoopShim, providerName=null, overrideProviderViaConfig=null, hadoopVersion=3.4.1, majorVersion=3, minorVersion=4
2026-10-12 00:58:57,597 INFO client.TezClient: Submitting DAG application with id: application_1791766665126_0001
2026-10-12 00:59:08,479 INFO client.DAGClientImpl: DAG: State: RUNNING Progress: 0% TotalTasks: 3 Succeeded: 0 Running: 0 Failed: 0 Killed: 0
2026-10-12 00:59:13,311 INFO client.DAGClientImpl: DAG: State: SUCCEEDED Progress: 100% TotalTasks: 3 Succeeded: 3 Running: 0 Failed: 0 Killed: 0
2026-10-12 00:59:13,318 INFO client.DAGClientImpl: DAG completed. FinalState=SUCCEEDED

查看词频结果(按出现次数排序):

hdfs dfs -cat /data/wc/output/*

回显:

apache  1
fast    1
hadoop  1
is      1
teza    1
hello   3
tez     3

在 YARN 侧确认应用类型为 TEZ 且最终状态 SUCCEEDED:

yarn application -status application_1791766665126_0001

回显(节选):

        Application-Name : OrderedWordCount
        Application-Type : TEZ
        User : root
        Queue : root.default
        State : FINISHED
        Final-State : SUCCEEDED
        Aggregate Resource Allocation : 28820 MB-seconds, 27 vcore-seconds

至此 Tez 安装与作业验证完成。

五、配置说明

配置文件位置作用
hadoop-env.sh/opt/hadoop-3.4.1/etc/hadoop/JAVA_HOME、守护进程 JVM 堆(-Xmx512m)、root 运行用户变量
core-site.xml同上fs.defaultFS 指定 NameNode 地址
hdfs-site.xml同上副本数、NameNode/DataNode 存储目录
yarn-site.xml同上Shuffle 服务、NodeManager 可分配资源
mapred-site.xml同上MR 框架类型、map/reduce 任务堆与内存
tez-site.xml/opt/apache-tez-0.10.5-bin/conf/tez.lib.uris、AM/Task 内存与 JVM 堆、日志级别
hadoop-tez.sh/etc/profile.d/JAVA_HOME/HADOOP_HOME/TEZ 环境变量与 HADOOP_CLASSPATH

客户端查找 tez-site.xml 的路径由 TEZ_CONF_DIR 决定;提交作业时 Tez 会把该文件随作业上传,AM 端按同一份配置运行。若 tez.lib.uris 指向的包未上传或路径写错,作业提交会直接失败,DAG diagnostics 中通常出现 AMResourceLocalize 相关错误。

六、注意事项

  • 堆内存统一控制在 256-512 MB:Hadoop 五个守护进程在 hadoop-env.sh 的 OPTS 中限定;Tez AM 与 Task 在 tez-site.xml 的 launch.cmd-opts 中限定;MR 任务在 mapred-site.xml 的 java.opts 中限定。三处都要检查,jps -v 是最终验证手段。
  • 每次修改 tez-site.xml 后重开 shell 或重新 source /etc/profile.d/hadoop-tez.sh,否则 HADOOP_CLASSPATH 可能未生效。
  • 输出目录不能已存在,否则 orderedwordcount 会报 Output path already exists;删除旧输出后重跑即可:hdfs dfs -rm -r /data/wc/output。
  • 服务器重启后需手动重新执行 start-dfs.sh 与 start-yarn.sh;NameNode 数据在 /data/hadoop/namenode 持久化,无需重新格式化。
  • HDFS 退出安全模式前提交作业会等待,启动后用 hdfs dfsadmin -safemode get 确认显示 Safe mode is OFF。

七、常见问题

Q1:启动报 ERROR: Attempting to operate on hdfs namenode as root? A:Hadoop 3.x 要求以 root 运行时显式声明运行用户。在 hadoop-env.sh 中追加 HDFS_NAMENODE_USER、HDFS_DATANODE_USER、HDFS_SECONDARYNAMENODE_USER、YARN_RESOURCEMANAGER_USER、YARN_NODEMANAGER_USER 五个变量并赋值 root(见 4.4 节),重新执行启动脚本。

Q2:start-dfs.sh 只打印 sudo: command not found,进程起不来? A:Ubuntu 22.04 最小安装没有 sudo,而 Hadoop 的启停函数库会调用它。执行 apt-get install -y sudo 后重新启动。

Q3:JVM 报 Unrecognized option: -Xlog:gc* 后退出? A:-Xlog 是 Java 9+ 的语法,OpenJDK 8 不支持。检查 hadoop-env.sh 中的 OPTS,删除该参数即可。

Q4:作业提交后一直卡在 RUNNING,最后失败,日志里有 Container 超内存被杀记录? A:Tez Task 的 JVM 堆是 512 MB,但 Java 进程实际占用(元空间、线程栈、堆外缓冲)会超过该值。保持 tez.task.launch.cmd-opts=-Xmx512m 的同时,把 tez.task.resource.memory.mb 调到 1024,为堆外开销留足余量。

Q5:提交作业报 Output path already exists? A:Tez 示例不会覆盖已有输出目录。执行 hdfs dfs -rm -r /data/wc/output 删除后再运行。

Q6:运行时 SLF4J 出现 multiple bindings 警告? A:Hadoop 与 Tez 各自携带了一份 slf4j-reload4j 绑定,属正常现象,不影响作业执行,可忽略。

八、卸载方式

停止集群(每条命令单独执行):

stop-yarn.sh
stop-dfs.sh

确认进程已退出:

jps

删除安装目录与数据目录:

rm -rf /opt/hadoop-3.4.1 /opt/hadoop-3.4.1.tar.gz /opt/apache-tez-0.10.5-bin /opt/apache-tez-0.10.5-bin.tar.gz /data/hadoop /tmp/wc.txt /opt/hadoop-3.4.1/logs

删除环境变量脚本:

rm -f /etc/profile.d/hadoop-tez.sh

如需彻底移除 JDK 与 SSH 包:

apt-get purge -y openjdk-8-jdk
apt-get autoremove -y

九、参考链接