CentOS 8 安装 Apache Tez 0.10.5 指南
CentOS 8 从零部署 Apache Tez 0.10.5:安装 OpenJDK 8 与 Hadoop 3.4.1 伪分布式环境,配置 tez-site.xml 并上传 Tez 包到 HDFS,跑示例作业验证,含 JVM 堆限制与卸载。
CentOS 8 安装 Apache Tez 0.10.5 指南
一、环境信息
本文在单台 CentOS 8 服务器上以 root 账号完成 Apache Tez 0.10.5 的完整安装与验证,安装形态为「Hadoop 伪分布式 + Tez 运行时库」。
| 项目 | 值 |
|---|---|
| 操作系统 | CentOS Linux 8 |
| 主机名 | node1 |
| 登录账号 | root |
| JDK | OpenJDK 8(java-1.8.0-openjdk-devel) |
| 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 上的 DAG 计算框架,本身无常驻服务;部署重点是准备好 Hadoop 集群,再把 Tez 发行包放进 HDFS 并让客户端能找到 Tez 类库。
二、前置条件
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 关闭 SELinux 与放行防火墙端口
将 SELinux 调整为宽容模式并写入配置持久化:
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
确认 firewalld 状态(每条命令只操作一个单元):
systemctl status firewalld
若 firewalld 处于运行状态,放行 HDFS NameNode、YARN ResourceManager 的常用端口:
firewall-cmd --permanent --add-port=9000/tcp
firewall-cmd --permanent --add-port=9870/tcp
firewall-cmd --permanent --add-port=8088/tcp
firewall-cmd --reload
2.3 安装 OpenJDK 8 与基础软件
yum install -y java-1.8.0-openjdk-devel openssh-server openssh-clients rsync wget sudo
回显(节选):
Installed:
java-1.8.0-openjdk-devel-1:1.8.0.312.b07-2.el8_5.x86_64
openssh-server-8.0p1-25.el8_10.x86_64
rsync-3.1.3-20.el8_10.x86_64
wget-1.19.5-11.el8.x86_64
sudo-1.9.5p2-1.el8_10.x86_64
Complete!
确认 Java 版本:
java -version
回显:
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
2.4 启动 SSH 并配置免密登录
CentOS 8 首次启动 sshd 前需要生成主机密钥:
ssh-keygen -A
启动 SSH 服务并设置开机自启(每条命令只操作一个单元):
systemctl enable sshd
systemctl start sshd
生成 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 -o StrictHostKeyChecking=no localhost echo ssh-ok
回显:
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
ssh-ok
三、版本选型说明
- Tez 0.10.5 是 Apache 官方当前最新稳定版(2025-05-12 发布),二进制包 apache-tez-0.10.5-bin.tar.gz 约 90 MB。
- Tez 0.10.5 发行包内捆绑 Hadoop 3.4.1 客户端库,因此 Hadoop 选择 3.4.1 同版本部署。实测提交作业时 Tez 日志输出
Picked HadoopShim org.apache.tez.hadoop.shim.DefaultHadoopShim, hadoopVersion=3.4.1,确认版本匹配。 - JDK 使用 yum 仓库的 java-1.8.0-openjdk-devel(Java 8 是 Tez 0.10.5 与 Hadoop 3.4.1 组合最稳妥的运行时)。
- 下载后建议对照下载页同名 .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 11.9MB/s in 80s
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 10.7MB/s in 9.2s
cd /opt && tar -xzf apache-tez-0.10.5-bin.tar.gz
确认目录内容:
ls /opt/apache-tez-0.10.5-bin
回显:
LICENSE 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-1.8.0-openjdk
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)
cat >> /opt/hadoop-3.4.1/etc/hadoop/hadoop-env.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
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
要点:
- 五个守护进程 JVM 堆固定为 256-512 MB;修改位置就在 hadoop-env.sh,改完用
jps -v验证。 - 不要给这些 OPTS 加
-Xlog:gc*(Java 9+ 语法),OpenJDK 8 会直接报Unrecognized option并退出。 - root 运行 Hadoop 3.x 时五个
*_USER变量必须齐全,否则启动脚本直接中止。
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 01:06:49,263 INFO common.Storage: Storage directory /data/hadoop/namenode has been successfully formatted.
start-dfs.sh
回显:
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [node1]
start-yarn.sh
回显:
Starting resourcemanager
Starting nodemanagers
jps
回显:
923 NameNode
1060 DataNode
1315 SecondaryNameNode
1608 ResourceManager
1741 NodeManager
2104 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 01:07 /apps/tez-0.10.5/tez.tar.gz
4.8 编写 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.use.cluster.hadoop-libs=false 表示使用 Tez 包内自带 Hadoop 库;AM 与 Task JVM 堆 512 MB、YARN 资源单元内存 1024 MB,堆与资源单元内存保持约 1:2,避免 Java 进程因堆外开销被 YARN 杀掉。
4.9 验证 JVM 堆参数
jps -v
回显(节选):
923 NameNode -Dproc_namenode -Djava.net.preferIPv4Stack=true -Dhdfs.audit.logger=INFO,NullAppender -Xms256m -Xmx512m
1060 DataNode -Dproc_datanode -Djava.net.preferIPv4Stack=true -Xms256m -Xmx512m
1315 SecondaryNameNode -Dproc_secondarynamenode -Djava.net.preferIPv4Stack=true -Xms256m -Xmx512m
1608 ResourceManager -Dproc_resourcemanager -Djava.net.preferIPv4Stack=true -Xms256m -Xmx512m
1741 NodeManager -Dproc_nodemanager -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
hadoop jar $TEZ_HOME/tez-examples-0.10.5.jar orderedwordcount /data/wc/input/wc.txt /data/wc/output
回显(节选):
2026-10-12 01:07:38,187 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 01:07:39,677 INFO client.TezClient: Submitting DAG application with id: application_1791767228652_0001
2026-10-12 01:07:41,043 INFO client.TezClient: Submitting DAG to YARN, applicationId=application_1791767228652_0001, dagName=OrderedWordCount, callerContext={ context=TezExamples, callerType=null, callerId=null }
2026-10-12 01:34:29,667 INFO client.DAGClientImpl: DAG: State: SUCCEEDED Progress: 100% TotalTasks: 3 Succeeded: 3 Running: 0 Failed: 0 Killed: 0
2026-10-12 01:34:29,673 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 侧确认应用状态:
yarn application -status application_1791767228652_0001
回显(节选):
Application-Name : OrderedWordCount
Application-Type : TEZ
User : root
Queue : root.default
State : FINISHED
Final-State : SUCCEEDED
五、配置说明
| 配置文件 | 位置 | 作用 |
|---|---|---|
| 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_CONF_DIR 找到 tez-site.xml,并通过 HADOOP_CLASSPATH 加载 Tez 类库;两个变量都在 /etc/profile.d/hadoop-tez.sh 中定义。
六、注意事项
- 三处 JVM 堆限制必须同时检查:hadoop-env.sh(守护进程)、tez-site.xml 的 launch.cmd-opts(Tez AM/Task)、mapred-site.xml 的 java.opts(MR 任务),最终用
jps -v确认都在 256-512 MB。 - SELinux 与 firewalld 是 CentOS 上最常见的两类「进程正常但连不上」的根因,部署前先按 2.2 节处理。
- 修改 tez-site.xml 后重新加载环境变量(source /etc/profile.d/hadoop-tez.sh)或新开终端再提交作业。
- 重跑示例前删除旧输出目录:
hdfs dfs -rm -r /data/wc/output。 - 服务器重启后重新执行 start-dfs.sh 与 start-yarn.sh;NameNode 已格式化过,不要重复执行 hdfs namenode -format。
七、常见问题
Q1:start-dfs.sh 报 ERROR: Attempting to operate on hdfs namenode as root?
A:在 hadoop-env.sh 中补齐 HDFS_NAMENODE_USER、HDFS_DATANODE_USER、HDFS_SECONDARYNAMENODE_USER、YARN_RESOURCEMANAGER_USER、YARN_NODEMANAGER_USER 五个变量(见 4.4 节),重新启动。
Q2:jps 提示 command not found?
A:只装了 JRE 或未装 devel 包。执行 yum install -y java-1.8.0-openjdk-devel,jps 包含在 devel 包中。
Q3:SSH 连 localhost 仍然要求输密码?
A:检查三处:/root/.ssh 目录权限 700、authorized_keys 权限 600、SELinux 上下文(执行 restorecon -Rv /root/.ssh)。CentOS 8 上 SELinux 上下文缺失是免密失败的高频原因。
Q4:DataNode 起来了但 NameNode 一直处于安全模式? A:DataNode 与 NameNode 的 clusterID 不一致(通常是重复格式化导致)。清空 /data/hadoop/namenode 与 /data/hadoop/datanode 后重新执行一次 hdfs namenode -format,再依次 start-dfs.sh、start-yarn.sh。
Q5:作业提交报 Connection refused 8032?
A:ResourceManager 未启动或 firewalld 拦截。先 jps 确认 ResourceManager 进程存在,再检查 2.2 节的端口放行。
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:
yum remove -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
九、参考链接
- 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