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 堆限制与卸载。
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 |
| JDK | OpenJDK 8(openjdk-8-jdk) |
| Hadoop | 3.4.1(伪分布式,NameNode 与 DataNode 同机) |
| Tez | 0.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
九、参考链接
- Apache Tez 官方安装文档:https://tez.apache.org/install.html
- Apache Tez 下载页:https://downloads.apache.org/tez/
- Apache Hadoop 下载页:https://downloads.apache.org/hadoop/common/
- Tez 0.10.5 发布说明:https://tez.apache.org/releases/apache-tez-0-10-5.html
- Tez 配置参数参考:https://tez.apache.org/releases/0.10.5/tez-api-javadocs/configs/TezConfiguration.html