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)
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
5. hive 查询的时候 , 其中 , GROUP BY , 结果中必须包含此字段, 否则无法查询,
但是比如age>20 其列可以 不在查询中
6.