当前位置: 首页 > news >正文

Hive优化高频面试题

文章目录

  • 一、开启本地模式
  • 二、explain分析sql语句
  • 三、修改Fetch操作
  • 四、开启hive的严格模式
  • 五、JVM重用
  • 六、分区、分桶以及压缩
  • 七、合理设置map和ruduce的数量
  • 八、设置并行执行
  • 九、CBO优化-成本优化器
  • 十、谓词下推
  • 十一、小表join大表--使用MapJoin
  • 十二、大表join大表--使用SMB Join
  • 十三、列裁剪与分区裁剪
  • 十四、避免数据倾斜
    • 1、数据倾斜的表现
    • 2、数据倾斜的原因和解决方案
      • 1)数据类型不一致造成数据倾斜
      • 2)数据中出现大量的null值
      • 3)单表group by 出现数据倾斜
    • 4)多表join出现数据倾斜


一、开启本地模式

数据量小的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的设置。

相关文章:

  • Centos Stream 9根目录扩容
  • 【MySQL】函数及存储过程
  • GUI-工具栏(页签)和选择网格
  • leetcode621. 任务调度器
  • C++【类和对象】(构造函数与析构函数)
  • 全球200多个国财政数据(1991-2023年)
  • 学习之什么是装饰器
  • Java | Leetcode Java题解之第435题无重叠区间
  • 5.3 克拉默法则、逆矩阵和体积
  • Kafka系列之:安装使用kafka_exporter详细步骤
  • 基于大数据的亚健康人群数据分析及可视化系统
  • 828华为云征文|华为云Flexus X实例:快速搭建FTP服务器,高效便捷!
  • 计算机毕业设计 基于Python的热门微博数据可视化分析系统的设计与实现 Python+Django+Vue 可视化大屏 附源码 讲解 文档
  • 给Ubuntu虚拟机设置静态IP地址(固定IP)
  • 安全开发指南
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 5、React组件事件详解
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Kibana配置logstash,报表一体化
  • leetcode386. Lexicographical Numbers
  • linux学习笔记
  • nodejs实现webservice问题总结
  • OSS Web直传 (文件图片)
  • spark本地环境的搭建到运行第一个spark程序
  • use Google search engine
  • vue-loader 源码解析系列之 selector
  • 大主子表关联的性能优化方法
  • 分享一份非常强势的Android面试题
  • ------- 计算机网络基础
  • 如何使用 JavaScript 解析 URL
  • 物联网链路协议
  • 原生 js 实现移动端 Touch 滑动反弹
  • ionic异常记录
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​MySQL主从复制一致性检测
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #考研#计算机文化知识1(局域网及网络互联)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (九)c52学习之旅-定时器
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .Net 4.0并行库实用性演练
  • .NET Core 成都线下面基会拉开序幕
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?