第十章 Hive调优 【合理设置Map数】

1. 合理设置Map数
1. MapTask任务数决定因素:
1. 文件个数
2. 文件大小
3. 集群设置的文件块大小
4. 指定的 切片大小
5. 处理文件的inputfor的实现类

2. 切片个数 = MapTask个数
1. 确定 InputFormat的实现类
hive中主要使用 :
HiveInputFormat :
1. 无论文件大小,对每个文件进行切分
2. 切片个数=文件大小/切片大小
3. 当文件大小 小于切片大小时,此文件做单独作为一个切片
实际切片 <= 设置切片大小
CombineHiveInputFormat :
1. 按照切片大小,对文件切分
2. 切片个数=文件大小/切片大小
3. 当文件大小 小于切片大小时,会将多个小文件合并从一个切片
实际切片 >= 设置切片大小

3. 思考 : 是不是map数越多越好?
不是
1. 当小文件过多时(远远小于块128M大小),每个文件都会启动一个mapTask,每个mapTask都会消耗一个CPU
2. 每个mapTask启动时间 远大于 数据处理时间,浪费资源

4. 思考 : 是不是保证每个map处理接近128M的文件块,就可以了?
不是
1. 当单个文件(128M)只有一个或者2个字段时,却有几千万行,mapTask的处理逻辑又比较复杂
此时一个map去处理,会比较耗时,需要将一个map拆分成多个map,并行处理
注意 :
解决2、3问题,可以通过 减少map或者增加map数

5. 设置 切片大小 (通过改变切片大小,改变map个数)
1. 通过控制 maxsize、minsize 设置切片大小
切片大小 = computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))
minSize : 1(默认)
maxsize=256000000(默认 244M)
blocksize=128M
注意 : 默认情况 切片大小 = block大小
-- 设置block大小(128M)
set dfs.block.size=134217728;

2. 设置 maxsize、minsize 大小
复制代码
            -- 设置 maxsize(默认256000000=244M)
            set mapreduce.input.fileinputformat.split.maxsize=256000000;
            -- 设置 minsize(默认1)
            set mapreduce.input.fileinputformat.split.minsize=1;

            -- 同时(设置一个即可)
            set mapred.max.split.size=256000000;
            set mapred.min.split.size=1;
复制代码
6.测试 (通过调整 切片大小来改变MapTask个数)
-- 测试1 : 文件个数1、文件大小34.8、inputformat类CombineHiveInputFormat、切片大小128M
-- 预期 : 生成一个切片=一个MapTask
复制代码
-- 测试1 : 文件个数1、文件大小34.8、inputformat类CombineHiveInputFormat、切片大小128M
-- 预期  : 生成一个切片=一个MapTask
34.8 M  104.4 M  /user/hive/warehouse/home.db/gulivideo_user_ori/user.txt

set mapreduce.input.fileinputformat.split.maxsize=256000000;

select
substr(uploader,0,1)
,count(1)
from gulivideo_user_ori
group by substr(uploader,0,1);

Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
Time taken: 10.86 seconds, Fetched: 62 row(s)
复制代码
-- 设置切片大小为 10M=10485760 Bytes
-- 测试2 : 文件个数1、文件大小34.8、inputformat类CombineHiveInputFormat、切片大小10M
-- 预期 : 切片个数=34.8/10=3个
复制代码
-- 设置切片大小为 10M=10485760 Bytes
-- 测试2 : 文件个数1、文件大小34.8、inputformat类CombineHiveInputFormat、切片大小10M
-- 预期  : 切片个数=34.8/10=3个
set mapreduce.input.fileinputformat.split.maxsize=10485760;

select
substr(uploader,0,1)
,count(1)
from gulivideo_user_ori
group by substr(uploader,0,1);

Hadoop job information for Stage-1: number of mappers: 3; number of reducers: 1
Time taken: 11.762 seconds, Fetched: 62 row(s)
复制代码
7. 思考 : 什么时候需要调整 切片大小?(改变MapTask个数)
1. 生成切片个数少且map逻辑复杂时,需要将MapTask任务拆分




posted @   学而不思则罔!  阅读(1260)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示