本节摘要:参数是调优的最后一级杠杆,用对的前提是分级与场景化。本节按"扫描重、Shuffle 重、小文件、内存与并行度"四类场景组织参数清单,讲清 SET 的三个生效层级、每个参数改动在执行计划或任务形态上的验证锚点,最后给一套从日志到 Web UI 的排错工具箱与调优方法论收尾。
SET 命令的参数有三个家:会话级(Beeline 里 SET,断连即失效)、脚本级(脚本头部 SET,只影响本脚本)、服务器级(配置文件,全局默认)。生产纪律:实验在会话级验证,稳定后进脚本头部,团队共识后才申请进服务器配置。全局改参数影响所有作业,是平台事故的常见起点。
另外,SET 显示当前值、SET 加 key 显示单项——调优前先看默认值,不同版本默认差异不小,照抄网上的"最优参数"前先确认自己环境里的起点。
特征:EXPLAIN 只有一两个 Stage、没有复杂 Join,但 TableScan 的数据量大;任务日志显示大部分时间在读。参数杠杆:
SET hive.input.format = ...CombineHiveInputFormat; -- 小文件合并切片 默认已开 SET mapreduce.input.fileinputformat.split.maxsize = 268435456; -- 切片上限 控制并行度 SET hive.exec.parallel = true; -- 无依赖 Stage 并行提交
但扫描重的真正解药不在参数:分区裁剪(路径区验证)、列裁剪(投影清单验证)、ORC 跳读(第 7.1 节)每一项的收益都大于切片微调。参数之前,先回 EXPLAIN 六问自查一遍。
Reduce 任务数决定并行度与每任务负载,Hive 的默认推算常常保守:
SET hive.exec.reducers.bytes.per.reducer = 268435456; -- 每任务目标处理量 默认约 256 兆 SET hive.exec.reducers.max = 1009; -- 集中上限 防打爆调度 SET mapreduce.job.reduces = 64; -- 直接指定覆盖推算
判读方法:任务平均处理量过大(每任务几个 GB)就压低 bytes per reducer 或直接指定任务数;任务数上千但每个秒级完成,说明过头了,调度开销反噬。Reduce 数是"每任务几百 MB 到一两 GB"的甜点区间游戏,配合第 3 章的溢写知识看任务日志的 Spilled Records 与 Map output records 比值:比值远大于 1 说明溢写过多,要么加大缓冲要么(更根本地)减少 Map 输出。
Map 端的两个经典内存参数:
SET mapreduce.task.io.sort.mb = 512; -- 环形缓冲区 溢写前的蓄水池 SET hive.map.aggr.hash.percentmemory = 0.5; -- Map 端聚合哈希表占堆比例
缓冲区加大减少溢写轮数,但受 Map 容器内存约束(不超过容器内存的合理比例)。
写入端产小文件(动态分区放大、高频追加),扫描端任务爆炸。两条战线:
-- 写入侧 控制 Reduce 数 让每个任务多攒点数据 SET hive.merge.mapfiles = true; -- Map-only 任务结束合并 SET hive.merge.mapredfiles = true; -- 带 Reduce 任务结束合并 SET hive.merge.size.per.task = 268435456; -- 合并目标文件大小 SET hive.merge.smallfiles.avgsize = 16777216; -- 平均低于此值触发合并
合并参数让写出前先把碎片聚一聚。存量治理(把历史碎片重写成大文件)则按分区 INSERT OVERWRITE 自身(配 ALTER CONCAT 或直接重写),第 8 章运维节给调度化方案。
任务挂在 Java heap 错误上,先分清是哪一段在要内存:MapJoin 建哈希表(第 6 章)、Map 端聚合哈希表、排序缓冲、Tez 顶点容器。对症的三个杠杆:
SET hive.auto.convert.join.noconditionaltask.size = 32000000; -- 收紧广播阈值 SET hive.map.aggr.hash.force.flush.memory.threshold = 0.9; -- 聚合哈希更早落盘 SET hive.tez.container.size = 2048; -- 容器加大 兜底
顺序很重要:先收广播与聚合的胃口,再谈加大容器——直接加内存是掩盖而非治疗,集群资源是公地。
EXPLAIN 与 EXPLAIN ANALYZE:主战场,全册的方法论核心,不赘述。
日志三件套。任务日志(YARN 页面进 Container 日志):看溢写计数、GC 时间、错误栈;HiveServer2 日志:看编译期错误与会话异常;Metastore 日志:看元数据操作异常(大分区表的清单拉取慢会在这里现形)。
Web UI 两层。YARN 的应用页面看任务耗时分布(倾斜长尾的直接证据)、容器内存与 CPU 曲线;Tez 的 DAG 视图(若启用)看顶点间数据量——比文字日志直观一个量级。
DESCRIBE 与 SHOW 家族。DESCRIBE FORMATTED 看表事实(位置、格式、统计时间戳),SHOW PARTITIONS 看分区清单与分区数,SHOW CREATE TABLE 看完整建表语句(迁移与审查必备)。
统计命令族:第 7.2 节的 ANALYZE 系列,CBO 健康的保养品。
把全册的调优哲学压缩成一段流程,遇到慢查询按序走:
这套流程的每一环在前面的章节都有展开,本节的参数清单只是第 4 步的弹药库。参数调不好查询很正常,但用参数掩盖设计问题,是债务的开始——分区分桶没设计好、统计没人维护、SQL 写法随缘,靠参数救不回来。