参考文档:
https://blog.csdn.net/qq_26442553/article/details/99438121
https://blog.csdn.net/B11050101/article/details/78754652
Map端
1.Map端小文件多的情况:
以下方法来在map执行前合并小文件,减少map数:
set mapred.max.split.size=100000000; --每个Map最大输入大小
set mapred.min.split.size=100000000; --每个Map最小输入大小
set mapred.min.split.size.per.node=100000000; --每个节点处理的最小split
set mapred.min.split.size.per.rack=100000000; --每个机架处理的最小slit
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
这四个参数的作用优先级分别如下
max.split.size <= min.split.size <= min.size.per.node <= min.size.per.rack
大概解释一下,100000000表示100M, set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;这个参数表示执行前进行小文件合并,
前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分割大文件剩下的)进行合并,最终生成了74个块。
2.Map端文件少,但是数据量大,增加Map数:
先利用临时表将一个文件合理的拆分成多个,这样就可以用多个map任务去完成:
set mapred.reduce.tasks=10;
create table a_1 as
select * from a
distribute by rand(123); --临时表
这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替之前sql中的a表,则会用10个map任务去完成(因为a_1表生成了10个小文件)
Reduce端
调整reduce个数方法一:
调整hive.exec.reducers.bytes.per.reducer参数的值;
set hive.exec.reducers.bytes.per.reducer=500000000; (500M)
select pt,count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’ group by pt; 这次有20个reduce
调整reduce个数方法二;
set mapred.reduce.tasks = 15; (多少个task就会生成多少个rudeuce)
select pt,count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’ group by pt;这次有15个reduce