hive动态分区读写数据遇到的问题

2,816次阅读
没有评论

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;
admin
版权声明:本站原创文章,由admin2018-01-02发表,共计1368字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)