在 Hive 中,Map 和 Reduce 任务的数量由不同的策略和参数共同决定,直接影响作业的并行度和性能。以下是核心逻辑总结:
一、Map 任务数量
由输入数据的物理切分(Split)决定,与以下因素相关:
-
输入文件数量和大小
- 每个文件至少生成 1 个 Map 任务。
- 大文件会被拆分为多个 Split(分片),每个 Split 启动 1 个 Map 任务。
-
分片大小控制参数
# 单个 Split 的最大值(默认 256MB) set mapreduce.input.fileinputformat.split.maxsize = 268435456; # 单个 Split 的最小值(默认 1B) set mapreduce.input.fileinputformat.split.minsize = 1;
计算公式:
Split 数量 = Σ(每个文件大小 / maxsize)
-
小文件合并优化
-- 合并小文件为一个 Split(减少 Map 任务数) set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
-
特殊文件格式的影响
- ORC/Parquet:支持内部分片(Stripe/Row Group),即使单个文件也可能启动多个 Map 任务。
- 压缩文件:
- Gzip/Zlib 不可分片 → 整个文件只能由 1 个 Map 处理。
- Bzip2/Snappy 可分片 → 支持多 Map 并行。
示例:一个 1GB 的未压缩文本文件,
maxsize=256MB
→ 生成 4 个 Map 任务。
二、Reduce 任务数量
需手动干预,分为三种策略:
1. 自动计算(默认策略)
-- 每个 Reduce 任务处理的数据量(默认 256MB)
set hive.exec.reducers.bytes.per.reducer = 256000000;
-- Reduce 任务最大数量(默认 1009)
set hive.exec.reducers.max = 1009;
计算公式:
Reduce 任务数 = min(总输入数据量 / bytes.per.reducer, reducers.max)
2. 用户直接指定
-- 强制设定 Reduce 任务数(优先级最高)
set mapreduce.job.reduces = 10;
3. 基于数据倾斜优化
-- 启用倾斜 Key 自动拆分(Hive 0.10.0+)
set hive.optimize.skewjoin = true;
当某些 Key 的数据量超过阈值时,Hive 会启动额外的 Reduce 任务处理倾斜数据。
三、影响任务数量的关键场景
场景 | Map 任务数影响 | Reduce 任务数影响 |
---|---|---|
小文件过多 | 数量暴涨(每个文件至少 1 个 Map) | 无直接影响 |
Gzip 压缩文件 | 只能启动 1 个 Map(不可分片) | 依赖自动计算或手动设置 |
动态分区插入 | 无直接影响 | 需调大数量避免 OOM:set hive.exec.reducers.max=2000; |
数据倾斜 | 无直接影响 | 需增加 Reduce 数或开启 skewjoin |
四、调优建议
-
Map 任务调优
- 避免小文件:合并成 256MB~512MB 的文件。
- 压缩格式优先选 Snappy/Bzip2(可分片)。
- 控制最大 Split 大小:避免单个 Map 处理过大数据。
-
Reduce 任务调优
- 黄金法则:单个 Reduce 处理 1~5GB 数据(调整
bytes.per.reducer
)。 - 监控 Reduce 时长:若平均运行时间 < 30 秒 → 减少 Reduce 数;若 > 5 分钟 → 增加 Reduce 数。
- 倾斜场景:结合
skewjoin
和手动增加 Reduce 数。
- 黄金法则:单个 Reduce 处理 1~5GB 数据(调整
-
动态设置示例
-- 根据数据量动态调整 Reduce set hive.exec.reducers.bytes.per.reducer = 512000000; -- 512MB/Reduce set hive.exec.reducers.max = 2000; -- 强制指定 Reduce 数(复杂计算时) set mapreduce.job.reduces = 50;
执行过程验证
-
查看任务数量分配:
EXPLAIN SELECT count(*) FROM large_table;
- 输出中搜索
Number of reduce tasks
和input splits
。
- 输出中搜索
-
运行时监控:
- YARN ResourceManager Web UI → 查看实际运行的 Map/Reduce 数量。
总结:
任务类型 | 决定机制 | 调优核心参数 |
---|---|---|
Map | 输入文件分片(Split) | split.maxsize 、split.minsize |
Reduce | 输入数据量 ÷ 单Reduce处理能力 | bytes.per.reducer 、reducers.max |