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任务拆分
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?