Hive性能调优(三)
第7章 Hive数据处理模式
过滤模式
-
普通的where的在map端过滤,map端的任务在执行时尽可能将计算逻辑发送到数据所在的机器中执行,多机同时过滤。对一个作业应尽量将其放在前面进行数据过滤
-
having子句过滤发生在数据聚合后,MR引擎中在Reduce阶段过滤,在Reduce 和Group by操作之后
-
distinct 在Reduce阶段,和用group by的执行计划类似,分组聚合的方式不是Hive去重的唯一方式,有时还会用到Hash表
-
multi-group-by-insert语法 ,表在读取一次后,可以被多个查询语句使用
from student_tb_txt insert into table student_stat partition(tp) select s_age,max(s_birth) stat, 'max' tp group by s_age insert into table student_stat partition(tp) select s_age,min(s_birth) stat, 'min' tp group by s_age
-
分区列筛选,能够在Map之前进行数据过滤,得益于分区表存储格式——分区表|分区列(part = ?)
-
分桶列筛选,能够对数据重新组织,快速过滤不需要的文件,分区是对目录的过滤**,分桶是对文件的过滤**,记录所存储的桶 = mod(hash(分桶列的值),16) 把所有文件按照hash值分到16个桶
-
在列过滤中,ORC/Parquet格式中存储了文件定义的Schema,可以直接读取表所在的列,比一般的格式先取整行数据,再通过列的偏移量得到对应的列值更快。
聚合模式
- distinct模式,在map端开启聚合,会在Map中进行数据局部聚合,再在Reduce中开启全局聚合
- **COUNT(*)和COUNT(1)会得到包含NULL的数据行数,在数据统计时,不会读取表中的数据,只是使用到HDFS文件中每一行的行偏移量(**HDFS添加的),
- 而COUNT(<列名>)会得到NULL之外的数据行数。针对列的计数,涉及字段的筛选和数据序列化和反序列化
- 在ORC文件中,这三者相差不多
- 可计算中间结果的聚合模式,sum、max、min、avg等 在本地处理阶段被聚合成少量数据,之后再做计算可以减少网络和下游节点处理的数据量
- 不可计算中间结果的聚合模式,collect_list collect_set,和前面的类似,不同的是Map阶段Reduce Output Operator 中 value输出的是个集合数组
连接模式
-
Repartition连接,发生在shuffle和Reduce阶段,Map读取两个表的数据,将按照连接条件发往相同的Reduce,在Reduce中计算合并
-
Replication连接(map join),发生在Map阶段,减少从HDFS中读取表的次数,在操作时将一个表的数据复制到各个Map任务所在的节点并存储在缓存中,适用于有小表的情况
-
map join
- 先启动一个作业读取小表的数据,在内存中构建哈希表,把哈希表写入本地磁盘,然后把哈希表上传到HDFS并添加到分布式缓存中。
- 再启动一个任务读取B表的数据,在连接时map会获取缓存中的数据并存入哈希表中,B表会和哈希表的数据匹配
- 时间复杂度是O(1)
- 开启hint命令 set hive.ignore.mapjoin.hint = false /*+mapjoin(b)*/ hint操作
- 推荐:
- hive.auto.convert.join = true 是否根据文件大小把repartition 转为 replication;
- hive.smalltable.filesize = 25000000 byte 小表数据小与阈值时,将转换 和上面的一起用
-
使用桶的Map连接要保证连接的两张表的分桶数之间是倍数关系
-
倾斜连接
-
set hive.optimize.skewjoin = true 是否优化有倾斜键的表连接
-
set hive.skewjoin.key = 100000 相同键的行数多于指定值 认为该键是倾斜连接键
-
-- 可以通过创建表时制定数据倾斜键,将制定的数据键分割成单独的数据文件或目录 create table a(s_no string,s_score bigint) skewed by (s_score) on (99,97) stored as directories
-
-
表连接与基于成本的优化器
- 一开始 Hive使用的是基于规则的优化器 Rule Based Optimizer
- 后来使用Calcite 是一个开源的基于成本优化器(CBO),根据Hive收集到表、列的统计信息,估算成本
- CBO优点
- 表连接的顺序优化,不需要特别制定大小表的顺序,会根据收到的情况,自动算出
- Bushy Tee连接的执行,可以估算出每个表连接的组合,两两结合生成中间结果,未引入的时候所有表连接都被表示成左深树,内部节点都至少有一个叶子作为子节点
- 简化表的连接,多表连接时,识别并抽取相同的连接谓词,构造一个隐式的连接谓词作为替换