注册 登录
    • 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

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

Sql admin 51次浏览 0个评论 扫描二维码

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;

Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明hive动态分区读写数据遇到的问题
喜欢 (0)
[xiaocui]
分享 (0)

您必须 登录 才能发表评论!