Hive中Map任务和Reduce任务数量计算原理

Hive MapReduce任务计算原理与优化策略
本文详细解析了Hive中Map任务和Reduce任务的数量计算原理,包括MapReduce的基本步骤,Map任务数量与分片大小的关系,以及Reduce任务数量的估算策略。Hive的Map数量基于输入文件的分片,而Reduce数量则考虑了用户配置和数据输入大小。针对小文件问题,Hive会尝试合并小文件以减少Map任务。在调整任务数量时,需平衡资源利用和任务并发度,避免空文件浪费或小文件过多的问题。

Hive中Map任务和Reduce任务数计算原理

MapReduce原理

  • Map阶段(以FileInputFormat为例)
    步骤:map, partition, sort, combiner

    • InputFormat负责计算分片,一个分片对应一个Map任务,InputFormat而且还负责创建RecordReader,通过RecordReadernext()方法,然后循环调用map()方法
    • map()方法的输入为一行文本,处理的结果先是写到内存缓冲区,达到阈值之后,溢写到磁盘,如果多次溢出,则会有多个溢出文件,这些溢出文件经过了分区,排序,而且还可能作过Combiner,map任务结束之后,多个溢出文件会合并成一个,结果写在本地
  • Reduce阶段
    步骤:copy, sort, reduce

    • reduce阶段先会进行copy,如果copy过来的文件很小,则直接copy到内存中,如果文件较大,则copy到磁盘
    • copy完成之后,会进行一个归并,由于在map端已经作过排序,所以,归并其实是在将多个有序的文件合并成一个有序的文件,这个文件中,一个key会生成一条记录,value为这个key对应的数组
    • 对归并后的文件循环调用reduce()方法,对每个key进行处理。

Map数量

hive的Map数量与分片大数量一致,一个分片生成一个Map任务,分片不是数据本身,是记录了数据的位置和长度,长度用于考虑优先运行,位置用于查找数据,一个分片大小的计算取决于使用的Input

Hive Tez 引擎中,可通过以下方式设置 map reduce数量: ### 设置 map 数量 map 任务数量主要取决于输入数据的分片情况,可通过 `mapred.max.split.size` 参数控制每个 map 处理的最大数据量,进而影响 map 数量。例如,若要增加 map 数,可将每个 Map 处理的最大数据设置为 128MB: ```sql SET mapred.max.split.size=134217728; ``` 判断虚拟存储的文件大小是否大于 `split.maxSize`,若大于等于则形成一个逻辑切片;若虚拟存储的文件大小小于 `split.maxSize`,则下一个虚拟文件进行合并,直到大于 `split.maxsize`,共同形成一个切片[^3]。 ### 设置 reduce 数量 - **根据处理数据量设置**:使用 `hive.exec.reducers.bytes.per.reducer` 参数,设置每个 Reduce 处理的数据量,从而间接控制 reduce 数量。例如,设置每个 Reduce 处理的数据为 1GB,可减少 Reduce 数: ```sql SET hive.exec.reducers.bytes.per.reducer=1073741824; ``` - **直接指定数量**:使用 `mapred.reduce.tasks` 参数直接设置 Reduce 任务数。例如,将 Reduce 任务数设置为 50: ```sql SET mapred.reduce.tasks=50; ``` ### 其他相关设置 还可以开启任务执行时的合并小文件功能,相关设置如下: ```sql SET hive.merge.mapfiles=true; SET hive.merge.mapredfiles=true; SET hive.merge.size.per.task=256000000; -- 合并后文件的大小 SET hive.merge.smallfiles.avgsize=16000000; -- 当输出文件的平均大小小于该值时,启动一个独立的 map - only 任务进行文件 merge ``` 同时,若存在 GROUP BY 操作的数据倾斜问题,可开启相应的优化: ```sql SET hive.groupby.skewindata=true; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值