插个眼,hive的数据存储格式:推荐使用orc+snappy压缩
stored as orc tblproperties ("orc.compress"="SNAPPY");
1. 1.fetch机制
能不走mapReduce就不走。
set hive.fetch.task.conversion=more;
2. mapreduce的本地机制
如果非要执行mapReduce程序,能够本地执行的,尽量不提交yarn上执行。
默认情况下是关闭的,需要设置为true
(1)hive提供了参数,自动切换MapReduce为本地模式,如果不满足就执行yarn模式
条件(同时满足):
- 数据量小于128M;
- maptask个数少于4个;
- reduceTask个数是0或1
(2) 切换hive的执行引擎(稳)
尝试使用spark或者tez
3. join优化
(1)优化1:hive自动尝试选择map端join提高join效率,省去shuffle过程
一般是大表和小表
适合join时有小表(小于25M)
(2)优化2:大表join大表
走reduce端join,会发生数据倾斜
方式一:空key的过滤,此行数据不重要
方式二:空key转换
CASE WHEN a.id IS NULL THEN concat('hive', rand()) ELSE a.id --避免转换之后数据倾斜 随机分布打散
(3)优化3:桶表join提高优化效率。bucket mapjoin
分桶表:大表文件变成小文件
4. group by 数据倾斜优化
[当某些表key过多时,数据处理速度会很慢]
(1)是否在map端进行聚合,默认为true
set hive.map.aggr=true;
(2)在map端进行聚合操作的条目数目
set hive.groupby.mapaggr.checkinterval=100000;
(3)有数据倾斜的时候进行负载均衡,默认是false,需要设置成true
set hive.groupby.skewindata=true;