Hive查询优化

1.先过滤,再查询,因为每次生成中间表都会存储到Linux磁盘上 , 记住 , 不是HDFS

2.注意数据倾斜 , 倾斜的原因是reduce端数据的大量富集, 可适度增加reduce , 会着开启

Reduce自己判断 , 某一比较大 , 自己再分开点.也就是合理设置

reduce数量

hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)

hive.exec.reducers.max    每个人物最多Reduce任务,默认999

3.小文件优化

用于设置合并的参数有:

    • 是否合并Map输出文件:hive.merge.mapfiles=true(默认值为true)
    • 是否合并Reduce端输出文件:hive.merge.mapredfiles=false(默认值为false)
    • 合并文件的大小:hive.merge.size.per.task=256*1000*1000(默认值为256000000)

  

扫描二维码关注公众号,回复: 10491660 查看本文章

4.小文件产生原因

1,动态分区插入过多数据,产生小文件

2.数据源自己本身包含很多小文件

3.reduce数量越多 , 小文件也越多.

小文件太多会造成 map 多 ,耗内存

4.小文件解决方案.

  使用Sequencefile作为表存储格式,不要用textfile,在一定程度上可以减少小文件;

1. join操作, 把小表放在左边 , 否则会OOM

2.要写SQL先了解数据本身的特点 , 否则如果有join , group会造成数据倾斜

set hive.exec.reducers.max=200;

set mapred.reduce.tasks= 200;---增大Reduce个数

set hive.groupby.mapaggr.checkinterval=100000 ;--这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置

set hive.groupby.skewindata=true; --如果是group by过程出现倾斜 应该设置为true

set hive.skewjoin.key=100000; --这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置

set hive.optimize.skewjoin=true;--如果是join 过程出现倾斜 应该设置为true

猜你喜欢

转载自www.cnblogs.com/alpha-cat/p/12635817.html