共计 1368 个字符,预计需要花费 4 分钟才能阅读完成。
1、map和reduce个数设置的问题
map和reduce的个数不是越多越好,因为启动时都会消耗很长的时间,而且也要考虑资源问题。
因此需要控制保证合适的个数用于执行任务
–默认一个map的大小是100m,当然可以调整为500m或者1g都可以,根据实际情况调整
set mapred.max.split.size=100000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
—下面这个是用于合并小文件操作
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
reduce的个数也要适当调整
–调整hive.exec.reducers.bytes.per.reducer参数的值;
set hive.exec.reducers.bytes.per.reducer=500000000; (500M)
还存在这个情况–只有一个reduce;
很多时候你会发现任务中不管数据量多大,不管你有没有设置调整reduce个数的参数,任务中一直都只有一个reduce任务;
其实只有一个reduce任务的情况,除了数据量小于hive.exec.reducers.bytes.per.reducer参数值的情况外,还有以下原因:
a) 没有group by的汇总,比如把select pt,count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’ group by pt; 写成 select count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’;
这点非常常见,希望大家尽量改写。
b) 用了Order by
c) 有笛卡尔积
通常这些情况下,除了找办法来变通和避免,我暂时没有什么好的办法,因为这些操作都是全局的,所以hadoop不得不用一个reduce去完成;
同样的,在设置reduce个数的时候也需要考虑这两个原则:使大数据量利用合适的reduce数;使单个reduce任务处理合适的数据量;
2、提示产生的分区数过多,超出了默认设置的100个,因此需要临时调整动态分区数的设置
--设置所有节点的分区数上界值
SET hive.exec.max.dynamic.partitions=2048;
—设置单节点动态分区个数上界值
SET hive.exec.max.dynamic.partitions.pernode=256;
3、向动态分区表写数据注意分区字段的位置
hive先获取select的最后两个位置的dt和ht参数值,然后将这两个值填写到insert语句partition中的两个dt和ht变量中,即动态分区是通过位置来对应分区值的。原始表select出来的值和输出partition的值的关系仅仅是通过位置来确定的,和名字并没有关系,比如这里dt和st的名称完全没有关系。
INSERT OVERWRITE TABLE T PARTITION (ds, hr)
SELECT key, value, ds, hr FROM srcpart WHERE ds is not null and hr>10;