hive优化

命令

explain (sql语句)查看MR
explain extended (sql语句) 查看参数的MR 更详细了一点

4种排序

order by 全局排序
sort by MR中reduce有序
distribute by 中分区内有序
cluster by 相当于 sort by和distribute by结合,用同一个字段排序,不过不能desc
总结
order by是全局排序,sort by是组内排序。distribute by sort by可以结合桶表使用,给桶中的数据排序。

动态分区

就是说给分区表导入数据的时候,想给数据动态分区插入进去
1首先开去动态分区功能
set hive.exec.dynamic.partition=true;
2 设置为非严格模式(动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict表示允许所有的分区字段都可以使用动态分区)
set hive.exec.dynamic.partition.mode=nonstrict
3 再所有执行MR的节点上,最大一共可以创建多少个动态分区。默认1000
set hive.exec.max.created.files=1000

分桶表

用处 1 抽样查询,2 join更快了

HQL语法优化

单表查询优化

列裁剪和分区裁剪

列裁剪(就是说查询的时候不要select * 而要把每一列写上)和分区裁剪(where后带上分区)

group by 产生数据倾斜

(1) 是否在map端进行聚合 set hive.map.aggr =true
(2) 在map端进行聚合操作的条目数目
set hive.groupbu.mapaggr.chechinterval=100000;
(3) 有数据倾斜的时候进行负载均衡
set hive.groupby.skewindata=true;
这个就是两阶段聚合 生成两个MR,第一个就是生成不同的

矢量计算 Vectorization

就是说,当scan,filter和aggregation的时候,矢量技术以设置批处理的增量大小为1024行单次来达到比单挑记录单次获得更高的效率。
就是说之前是一行一行读取,这个是批量的读取
set hive.vectorized.execution.enabled=true
set hibe.vectorized.ececution.reduce.enabled=true

多重模式

hive优化_第1张图片

left semi join

hive优化_第2张图片

多表优化

cbo优化

cost base optimizer
join的时候表的顺序关系,前面的表会被加载到内存中,后面的表进行磁盘扫描
在hive1.1.0之后,这个feature是默认开启的。
他可以自动优化HQL中的多个join顺序,并选择合适的join算法。
这个优化默认自动开启,这个主要是底层,不用管

谓词下推

将SQL语句中的where谓词逻辑都尽可能的提前执行,减少下游处理的数据量,对应逻辑优化器是PredicatePushDown,配置项为hive.optimize.ppd默认为true,把它关闭掉还不行,还需关闭cbo

set hive.optimize.ppd

MAPJOIN

不用mapjoin应该是在map阶段读取两张表,然后reduce阶段join,
mapjoin就是在map阶段将一个大表拆分成几部分,然后用第二个表,分别与几部分join,等于说是在map阶段join成功了。
set hive.auto.convert.join=false
这个只能大表join小表

大表SMB JOin (重要)

sort Merge Bucket Join
原理就是将表拆分成一个个小桶,然后对小桶进行join 分而治之
set hive.optimize.bucketmapjoin =true;
set hive.optimize.bucketmapjoin.sortedmerge =true;
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat

HiveJob的优化

map优化

增加map值

当input的文件都很大,增加map值
增加map的方法为:根据
computeSliteSize(Math.max(minSize,Math.min(maxSize,blockSIze)
) 切片大小就是按照blockSIze(128M)和minSize和MaxSize的中间值划分
要想增大map的个数就把maxSize变得比blockSize小。
总结 :小于等于128就按照其本身,大于128就按128处理

小文件进行合并

在map执行前合并小文件,减少map数,CombineHiveinputFormat
set hive.inputformat=org.spache.hadoop.hive.ql.io.CombineHiveInputFormat
在map-Reduce的任务结束时合并小文件的设置:

fetch抓取

hive中对某些情况的查询可以不必使用Mapreduece计算
select * 不走MR,只走scan
在hive-default.xml.template文件中hive.fetch.task.conversion改为more老版本默认是miminal

并行执行

当一个大sql运行的时候会有多个MR运行,这时候,有些mR之间是不关联的
set hive.exec.parallel=true
set hive.exec.parallel.thread.number=16

orderby后面要有limit

orderby 就是说每个map都取出前10,再排序比较

jvm重用

主要用在小文件过多的时候,主要是文件打开关闭所占用的就比处理文件所占用的时间长

hive on spark

练习题

总结,只要是连续问题,简单的就用等差,前后相关联的就用下推

连续问题

查找连续三天碳排放量在100以上的用户
1选择要的数据
2 给分区内排序
hive优化_第3张图片想法
如果是连续两天可以用两个表join求差值,但是多个表怎么处理
求连续几天,那就是连续问题,可以采用等差的比较,你增我也增的方法

这道题 第一步
先把id 日期聚合在一块,筛选出有用的数据
第二布 新增一列row_number或者rank() over()通过id,
第三步 开始相减date_sub的方式
第四步 count>3的就是最终的结果,就是有没有连续的等差的。

等差数列
select id,dt,lowcarbon,rank() over(partition by id order by dt) rk from table;
select id,flag,count(*)

分组问题

hive优化_第4张图片lead 领导 lag延迟
lag(dt,1,0)表示把dt数据向下移1个位置,第一行的默认0
正常思路,用上个时间减去下个时间,看看是否大于60,然后进行

间隔连续问题

hive优化_第5张图片等差数列的方式。
第一就是说先减,减去完之后再聚合,再减

第二种方式,还是下推,用datediff(dt1,dt2)

打折交叉问题

hive优化_第6张图片

同时在线问题

hive优化_第7张图片采用流式处理!
1)对数据进行分类,在开始数据后添加1,表示有主播上线,同时在关播数据后添加-1,表示有主播下线。
2)然后over进行开窗,得到某一时刻的值。
太巧妙了。

参考

尚硅谷
https://www.bilibili.com/video/BV1Cb4y1r7p2?p=12

你可能感兴趣的:(大数据,hive)