龙空技术网

Hive优化设计

小王子1680 51

前言:

此刻看官们对“hive oracle”大体比较注重,小伙伴们都想要剖析一些“hive oracle”的相关内容。那么小编同时在网上收集了一些有关“hive oracle””的相关资讯,希望你们能喜欢,你们一起来了解一下吧!

分区表结构设计

例如下图SQL查询时,会扫描全表,假如全表有几十G数据,查询会很慢。

通过打印SQL执行计划可以看到,该语句执行是直接到表去扫描的。这是因为Hive会使用表的最后一级目录作为底层处理数据的输入进行扫描

分区表结构设计思路:依据查询的需求,将数据按照查询的条件【一般以时间】进行划分分区存储,将不同分区的数据单独使用一个HDFS目录进行存储,当底层实现计算时,依据查询的条件,只读取对应分区的数据作为输入,减少不必要的数据加载,提高程序的性能。

分桶表结构设计

思路:2个表的数据量很大,将join关联字段按相同的规则划分后再进行Join。

例子:

执行计划可以看到,没有分桶前查询时全表扫描的。

构建分桶表

分桶Join执行计划

可以看到是桶之间Join

索引设计优化

在索引中MySQL,Oracle与Hive唯一的区别是Hive不支持主键或者外键的索引

由于太慢,要运行MapReduce程序执行,每次还要更新索引和变移量。Hive3.0已经不支持这种索引了。

文件格式优化

Hive的默认文件格式是TextFile。通过stored as file_format更改文件格式压缩文件大小。

格式1:SequenceFile

格式2:Partquet

格式3:ORC

数据压缩

实例,指定压缩格式,选用压缩算法,如下:

存储优化--合并小文件

1、判断小文件,

2、合并小文件

第一

第二

第三,只适合ORC

Hive优化器

谓词下推(PDD)

推荐形式1:先过滤再join

数据倾斜--Group by 、Count(distinct)产生

优化方案1:开启Map端聚合

hive.map.aggr=true

通过减少suffle数量和Reducer阶段的执行时间,避免每个Task数据差异过大导致数据倾斜

优化方案2:实现随机分区

select * from table distribute by rand()

distribute by 用于指定底层按照哪个字段作为Key实现分区、分组等,通过rand函数随机实现分区,避免数据倾斜。

优化方案3:数据倾斜时自动负载均衡

hive.groupby.skewindata=ture

开启该参数以后,当前程序会自动通过两个MapReduce来运行

第一个MapReduce自动进行随机分布到Reducer中,每个Reducer做部分聚合操作,输出结果。第二个MapReduce将上一步聚合的结果再按照业务(group by key )进行处理,保证相同的分布到一起,最终聚合得到结果。

数据倾斜--Join产生

优化方案1:提前过滤,将大数据变成小数据,实现Map Join

优化方案2:使用Bucket Join

如果使用方案1过滤后数据依然是一张大表,那么最后的Join依旧是一个Reduce Join ,这种情况下,可以将2张表的数据构建为桶表,实现Bucket Map Join,避免数据倾斜。

优化方案3:使用Skew Join

Skew Join是Hive中一种专门为了避免数据倾斜而设计的特殊的Join过程。原理是将Map Join和Reduce Join进行合并,如果某个值出现了数据倾斜,就会产生数据倾斜的数据单独使用Map Join来实现。其他没有产生数据倾斜的数据由Reduce Join的结果进行Union合并。

配置

标签: #hive oracle