Hive的MR优化

参考文档:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。