Hive优化高频面试题

文章目录


一、开启本地模式

数据量小的hive查询,集群模式浪费资源而且执行速度慢,此时可以开启本地模式,在单台机器上执行处理任务,执行时间会缩短。

二、explain分析sql语句

三、修改Fetch操作

Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算,在hive-site.xml文件中hive.fetch.task.conversion属性默认是more,在全局查找、字段查找、limit查找等都不走mapreduce

四、开启hive的严格模式

防止写的烂sql影响集群,开启严格模式以后,以下情况多报SQL错误:

1)分区表不使用分区过滤

2)使用order by没有limit过滤

3)笛卡尔积不允许出现 (select * from emp,dept)

五、JVM重用

jvm重用就是一个虚拟机开启以后,执行多个task任务,再关闭。大大提高执行效率

六、分区、分桶以及压缩

压缩分为map阶段的压缩和reduce阶段的压缩

压缩格式有bzip2、gzip、snappy、lzo

七、合理设置map和ruduce的数量

当input文件很大,任务逻辑复杂,map执行非常慢的时候,可以增加map数量,使每个map处理的数据量减少,提高任务的执行效率

过多的启动和初始化reduce也会消耗时间和资源,所以需要合理的设置reduce的数量

八、设置并行执行

set hive.exec.parallel=true;

set hive.exec.parallel.thread.number=16;

九、CBO优化-成本优化器

可以自动优化HQL中多个Join的顺序,并选择合适的Join算法。

十、谓词下推

所谓的谓词下推就是将where条件提前执行,比如先执行where过滤,再进行join关联

通过谓词下推,过滤条件将在map端提前执行,减少了map端的输出,降低了数据IO,节约资源,提升性能。

十一、小表join大表--使用MapJoin

Map Join :小表进行缓存并发送到各个节点,将数据量小的表放在join的左边,在map端进行join,只有map没有reduce,所有没有Shuffle的过程

十二、大表join大表--使用SMB Join

分桶表join:创建两个分桶表,把大表的数据导入进去,然后让分桶表和分桶表进行join,速度会快,当然在执行之前,需要开启smb join的设置。

十三、列裁剪与分区裁剪

列裁剪就是在查询时只读取需要的列,分区裁剪就是只读取需要的分区。

sql 复制代码
-- 列裁剪
select name,age from emp;
-- 分区裁剪
select * from emp where dept='技术部';

十四、避免数据倾斜

1、数据倾斜的表现

数据倾斜是由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点的现象。

2、数据倾斜的原因和解决方案

1)数据类型不一致造成数据倾斜

原因:两个表join时,on后面用来连接的两个字段类型不一致

解决办法:把类型转成一致的

如:

sql 复制代码
select * from users a join logs b on a.usr_id = cast(b.user_id as int)

2)数据中出现大量的null值

第一种情况:

null是异常值:比如userid出现null

解决方法:提前使用where过滤

如:

select * from (select * from user where id is not null) n join

bigtable o on n.id = o.id;

第二种情况:

出现null的数据不是异常数据,需要保留

解决方法:对应为null的数据随机赋一个表中不可能存在的值

如:

sql 复制代码
select n.* from nullidtable n full join bigtable o on  nvl(n.id,rand()) = o.id;

如果id为空,则赋一个0~1之间的随机数字,不包含1,这个数字是id列不可能出现的数字

3)单表group by 出现数据倾斜

原因:按照 Key 分组以后,少量的任务负责绝大部分数据

解决方法:

第一种:使用参数优化

当任务中存在group

by操作同时聚合函数为count或者sum时,可以使用Combine(运行在map端的reduce)操作,在map端提前进行聚合

sql 复制代码
-- 是否在Map端进行聚合,默认为True
set hive.map.aggr = true
-- 在Map端进行聚合操作的条目数目
set hive.groupby.mapaggr.checkinterval = 100000
-- 有数据倾斜的时候进行负载均衡(默认是false)
set hive.groupby.skewindata = true

第二种:

增加Reduce数量

4)多表join出现数据倾斜

大表join小表:

可以使用MapJoin,没有Reduce阶段就不会出现数据倾斜

还可以使用大表打散,小表扩容

大表join大表:

使用smb join:

分桶表join:创建两个分桶表,把大表的数据导入进去,然后让分桶表和分桶表进行join,速度会快,当然在执行之前,需要开启smb join的设置。

相关推荐
光电的一只菜鸡16 小时前
小白从零开始学agent(二)——如何高效编写 Prompt 与 Skill
hadoop·microsoft·prompt
William Dawson4 天前
【踩坑实录|Hive1\.2\.1数据服务接口5大疑难问题调试与全方位优化方案】
java·hive·spring boot
ha_lydms4 天前
Hologres 简介
大数据·hadoop·阿里云·mapreduce·yarn·dataworks·hologres
Francek Chen7 天前
【大数据处理与分析】实验5:MapReduce初级编程实践
大数据·hadoop·分布式·mapreduce
牛奶咖啡1311 天前
大数据Hadoop运维应用实践——HIVE与Hadoop实现整合_Hive的配置安装与使用
大数据·hive·hive的配置与安装·metastore服务的配置·hiveserver2服务配置·hive的常用sql操作·beeline的使用
Zhu75812 天前
在k8s集群环境部署高可用的Apache Hadoop3.1.1定制版集群
hadoop·kubernetes
coder!mq12 天前
什么是泛型?有什么好处?
linux·运维·服务器·面试题·八股文
还有你Y13 天前
软件工程架构
hadoop·架构·软件工程
向夏威夷 梦断明暄13 天前
基于Tez引擎的 Hive SQL 性能优化
hive·sql·性能优化
曾阿伦17 天前
Windows 下运行 Hadoop 并部署到 AWS EMR 指南
hadoop·windows·aws