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的设置。

十三、列裁剪与分区裁剪

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

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

十四、避免数据倾斜

1、数据倾斜的表现

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

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

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

原因:两个表join时,on后面用来连接的两个字段类型不一致
解决办法:把类型转成一致的

如:

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的数据随机赋一个表中不可能存在的值

如:

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端提前进行聚合

-- 是否在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的设置。

以下是一些常见的 Hive 面试题: 1. Hive中什么是元数据? 答:在Hive中,元数据是指描述表、分区和列的信息,包括表结构、数据类型、位置及其它有关表的信息。 2. Hive中的分区是什么? 答:Hive中的分区是将表数据按照指定的列值进行划分,从而提高查询效率。通常情况下,分区列是表中的时间列或者地理位置列。 3. Hive中的Bucket是什么? 答:Hive中的Bucket是将表数据划分成固定数量的文件,从而提高查询效率。Bucket可以通过HASH函数对表数据进行划分。 4. Hive中UDF和UDAF有什么区别? 答:UDF(User Defined Function)是用户自定义函数,主要用于处理单行数据。UDAF(User Defined Aggregation Function)是用户自定义聚合函数,主要用于处理多行数据并返回一个结果。 5. Hive中的数据类型有哪些? 答:Hive中的数据类型包括:整型、浮点型、字符串型、日期型、数组型、Map型、Struct型等。 6. 如何在Hive中加载数据? 答:可以使用LOAD DATA语句将数据加载到Hive表中。例如: ``` LOAD DATA INPATH '/input/data' INTO TABLE table_name; ``` 7. 如何在Hive中创建表? 答:可以使用CREATE TABLE语句创建表。例如: ``` CREATE TABLE table_name ( column1_name data_type, column2_name data_type, ... ) PARTITIONED BY (partition_column_name data_type) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; ``` 8. 如何在Hive中查询数据? 答:可以使用SELECT语句查询数据。例如: ``` SELECT column1_name, column2_name FROM table_name; ``` 9. Hive的执行流程是什么? 答:Hive的执行流程包括:解析HQL语句、生成逻辑计划、生成物理计划、执行物理计划、输出结果。 10. Hive的优点和缺点是什么? 答:Hive的优点包括:易于使用、支持SQL语法、扩展性好、适合大数据处理等。缺点包括:性能相对较差、不支持实时查询、不支持事务处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值