Tez 部署与调优指南
Tez 是 Hive 的 DAG 执行引擎,把多轮 MapReduce 的”写盘-重读”改成一张 DAG 内存流转,SQL 性能提升 2~3 倍是常态。它不独立部署(寄生于 YARN),部署动作是”把 Tez 库放到 HDFS + 让 Hive 引擎指向它”。本文覆盖底层原理(衔接《Tez 底层原理与知识要点》)、部署、参数优化与常见问题。
底层原理速览
- DAG:一次提交整个执行计划图,顶点(Vertex)是逻辑阶段,边(Edge)描述数据流转
- 三种 Edge:OneToOne(窄依赖)、Broadcast(小表广播)、ScatterGather(shuffle)
- Session 复用:Tez 会话常驻 AM 与容器,多个作业复用,省去 JVM 反复启动
- 容器复用:一个容器内连续跑多个任务,任务启动开销趋近于零
Tez 的性能来源三句话:中间结果不落 HDFS、一次调度多阶段、容器 JVM 复用。与 MR 对比,复杂 SQL 的磁盘读写从”每阶段一次”降到”只读输入只写输出”。
部署
1. 准备 Tez 包并上传 HDFS
1 | |
2. 配置 tez-site.xml($TEZ_HOME/conf)
1 | |
3. Hive 切换引擎
1 | |
参数优化(三档规格)
| 参数 | 8C16G(每节点) | 32C256G(每节点) | 64C512G(每节点) |
|---|---|---|---|
tez.am.resource.memory.mb |
1G | 2G | 4G |
tez.am.java.opts(AM 堆) |
768M | 1.5G | 3G |
tez.container.size |
2G | 4G | 8G |
tez.task.max.memory.mb |
1.5G | 3G | 6G |
tez.task.scale.memory.additional-resource.fraction |
0.3 | 0.3 | 0.3 |
tez.session.client.timeout |
120 | 300 | 600 |
tez.runtime.sort.threads |
2 | 4 | 8 |
tez.container.size 必须与 Hive 的 hive.tez.container.size 一致(Hive 侧是配置入口),且容器总量不能超过 YARN 的 yarn.scheduler.maximum-allocation-mb。容器申请超过上限会被 YARN 拒绝,作业直接失败。
优化理解:
- 容器内存 = 数据排序的池子:Tez 的 shuffle 在容器内排序,
tez.container.size越大,单任务能处理的数据量越大,溢写(spill)越少;但容器大 → 并发任务少,需要按数据量平衡 - Session 超时:
tez.session.client.timeout是会话闲置回收时间;调大让跑批作业间的复用率提高(省 AM 启动),但占用 YARN 资源不释放,按作业密度取舍 - AM 内存:
tez.am.resource.memory.mb只影响 AM 本身,占资源小,2~4G 足够,不用跟着规格涨
集群规模优化(几十~上百节点)
- 容器复用是收益主力:批作业密集时段让 Session 常驻(timeout 调大),削峰时段回收;配合 YARN 队列隔离
- 与 YARN 资源联动:
tez.container.size别超过节点可用内存 ÷ 期望并发任务数;优先保证单节点 2~4 个 Tez 容器并发 - 本地模式:小任务自动降级
tez.local.mode=true(本地文件系统跑),不占 YARN 资源,适合测试与临时查询 - 数据倾斜:
tez.groupby.split.grouping.enabled+ 二阶段聚合兜底;与 Hive 的hive.groupby.skewindata配合 - RPC 与元数据:
tez.am.am-rm.heartbeat.interval-ms(默认 1s)在百节点集群可放宽到 5s,减少心跳流量
常见问题
- **
ClassNotFoundException: org.apache.tez.dag...**:tez.lib.uris指向的 HDFS 路径不存在或权限不足,或节点没配HADOOP_CLASSPATH - 作业卡在 INITIALIZING:AM 无法获取容器——
tez.am.resource.memory.mb超 YARN 上限,或 Session 被回收后客户端仍在等旧会话 - Container OOM:
tez.container.size与hive.tez.container.size不一致(Hive 侧默认 512M 覆盖)、或排序数据量超过容器 - Session 僵死:
tez.session.client.timeout太小导致频繁建 Session,作业排队;调大或确认 AM 被 YARN 回收后客户端重连逻辑 - 本地模式误开:
tez.local.mode开了但本地磁盘不足,任务失败;确认本地目录空间 - 与 Spark 引擎切换后参数残留:
hive.execution.engine切换时,两边引擎参数(tez.*/spark.*)互相残留影响,切换后验证首条 SQL
部署检查清单
- tez.tar.gz 在 HDFS 且
tez.lib.uris正确 hive.tez.container.size与 YARN 上限匹配- Session 超时与作业密度匹配
- 与 08-09 原理文章联动:Edge 类型决定 shuffle 成本,优化 SQL 时先看执行计划(
EXPLAIN)
Tez 部署与调优指南
https://chaggle.github.io/2026/08/09/bigdata/tez-deploy-tuning-20260810/