hive 优化
数据倾斜、数据冗余、job的IO以及不同底层引擎配置情况和Hive本身参数和HiveSQL的执行
1 hive本身参数的配置优化:
1 针对小文件过多的配置:
输入、输出端合并
输入:更改hive的输入文件格式,参数名称是 hive.input.format
默认值是org.apache.hadoop.hive.ql.io.HiveInputFormat
我们改成org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
输出:
hive.merge.mapfiles 和 hive.merge.mapredfiles都设为true即可
2 表的存储格式
设置表的默认文件格式:
set hive.default.fileformat=<file_format> -- orc
这是表的默认类型:
set hive.default.fileformat.managed = <file_format> -- external
3 表的压缩格式
采用 orc + 默认的压缩zlib
4 分区分桶
对于一张大表设置成分区表,避免数据的全表扫描。同时注意避免多级分区,一般二级分区足够使用。一般使用日期字段、地里位置字段设置分区字段。
对于一张大表,通过分桶操作,对数据进行更细粒度的划分成多个数据文件,可以提升join性能(join字段是分桶字段);也可以提升过滤操作的效率(过滤字段是分桶字段)
这分桶表
5 配置jvm重用
参数mapred.job.reuse.jvm.num.tasks来设置。JVM重用可以使得JVM示例在同一个job中时候使用N此。
6 推测执行
通过mapred-site.xml中配置
mapred.map.tasks.speculative.execution=true
mapred.reduce.tasks.speculative.execution=true
2 数据倾斜
1 什么是数据倾斜
由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点
2 数据倾斜的现象
在执行任务时,任务进度长时间维持在99%
3 数据倾斜的情况
1 join操作
2 group by
3 count(distinct)
4 数据倾斜解决方案
1 map端聚合
设置
--Map 端部分聚合,相当于Combiner
hive.map.aggr = true;
--有数据倾斜的时候进行负载均衡
hive.groupby.skewindata=true;
-- 有数据倾斜时进行负载均衡,生成的查询计划会有两个mr job 。
第一个mr job中, map的输出结果集合会随机分布到reduce中,每个reduce做部分聚合操作,并输出结果。这样处理使得相同的key有可能被分发到不同的reduce中,从而达到负载均衡的目的。
第二个mr job ,走常规的mr流程,完成最终的聚合操作。
2 如何选取关联驱动表join
选取key值相对数据量小 并且 分布均匀的表作为 驱动表,以达到两表在join时,数据量相对变小
3 大小表join -- map join
使用map join让小维度(千条记录)先进内存。在map端完成reduce
4 空值产生的数据倾斜
把空值的key使用case when 变成 concat(字符串,round()),把倾斜的数据分散到不同的reduce中,由于空值关联不上,处理后不影响最终结果。
5 count(distinct)
采用 sum() group by 替代 count(distinct)
6 特殊情况特殊处理
将特殊的数据拿出来,最后再union回去
7 关联字段为不同数据类型
将字段类型使用cast转换一致,on a.usr_id = cast(b.user_id as string);
3 架构层面
1 选择更合适更快的引擎,比如 tez,mr , spark