Hive优化:Hive的执行计划、分桶、MapJoin、数据倾斜

文章目录

  • 1. hive的执行计划
  • 1.1 为什么使用EXPLAIN
    • 1.2 使用EXPLAIN的步骤
    • 1.3 EXPLAIN在什么场合使用
  • 2. 分桶
    • 2.1 为什么要使用分桶
  • 3. Map Join
    • 3.1 Map Join
      • 3.1.1 大小表关联
      • 3.1.2 不等连接
    • 3.2 Bucket-MapJoin
      • 3.2.1 作用
      • 3.2.2 条件
    • 3.3 SMB Join
      • 3.3.1 作用
  • 4. 数据倾斜
    • 4.1 表连接数据倾斜(Join skew in)
      • 4.1.1 运行时优化
      • 4.1.2 编译时优化
    • 4.2 分组统计数据倾斜(Groupby skew in)
      • 4.2.1 Map阶段聚合
      • 4.2.2 MRJob随机数打散

1. hive的执行计划

1.1 为什么使用EXPLAIN

在处理大数据查询时,性能是一个关键问题。复杂的查询可能涉及多个表的连接、过滤、分组和排序操作,这些操作如果处理不当,会导致查询效率低下,甚至无法完成。在Hive中,EXPLAIN命令可以帮助我们理解查询的执行计划识别出潜在的性能瓶颈,从而进行有针对性的优化

1.2 使用EXPLAIN的步骤

使用EXPLAIN命令只需在查询语句前加上EXPLAIN关键字,即可查看该查询的执行计划。通过EXPLAIN输出的执行计划,可以看到每个阶段的操作,如表扫描、数据过滤、分组聚合等。

  • 编写SQL查询:确定要执行的查询。
  • 添加EXPLAIN关键字:在查询面前加上EXPLAIN
EXPLAIN SELECT ...;

1.3 EXPLAIN在什么场合使用

EXPLAIN命令适用于以下场合:

  • 复杂查询:当查询涉及多个表的连接、复杂的过滤条件或分组聚合时,使用EXPLAIN可以帮助理解查询的执行步骤,并能找出性能瓶颈。
  • 查询优化:在优化查询性能时,EXPLAIN可以帮助验证优化的效果。
  • 调试查询:如果查询执行时间过长或结果不符合预期,使用EXPLAIN可以帮助诊断问题,发现潜在的错误或低效的操作。

2. 分桶

2.1 为什么要使用分桶

  • 为了抽样
    在处理大规模数据集时,在开发和修改查询的阶段,可以使用整个数据集的一部分进行抽样测试查询、修改。可以使得开发更高效。
  • 为了提高查询
    连接两个在(包含连接列的)相同列上划分了桶的表,可以使用Map端连接(Map-side join)高效的实现。
    比如join操作,对于join操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行join操作就可以,可以大大减少join的数据量。

3. Map Join

3.1 Map Join

在这里插入图片描述
Map Join就是在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连接。这样就节省了在shuffle阶段时要进行大量的数据传输,从而起到了优化作业的作用。
要使MapJoin能够顺利进行,就必须满足这样的条件:除了一份表的数据分布在不同的Map中外,其他连接的表的数据必须在每个Map中有完整拷贝。
所以并不是所有的场景都适合用Map join。它通常会用在如下的一些场景:在两个要连接的表中,有一个大表,有一个小表,这个小表可以存放在内存中而不影响性能。
这样就可以把小表文件复制到每一个Map任务的本地,再让Map把文件读到内存中待用。

3.1.1 大小表关联

select f.a,f.b from A t join B f on (f.a = t.a and f.ftime=20110802)

该语句中B表有30亿行记录,A表只有100行记录,而且B表中数据倾斜特别严重,有一个key上有15亿行记录,在运行过程中特别的慢,而且在reduece的过程中遇到执行时间过长或者内存不够的问题。
MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map时进行了join操作,省去了reduce运行的效率会高很多。
这样就不会由于数据倾斜导致某个reduce上落数据太多而失败。于是原来的sql可以通过使用hint的方式指定join时使用mapjoin。
注意
在实际使用中,只要根据业务调整小表的阈值即可,hive会自动帮我们完成mapjoin,提高执行的效率。

3.1.2 不等连接

map join还有一个很大的好处是能够进行不等连接的操作,如果将不等条件写在where中,那么mapreduce过程中会进行笛卡尔积,运行效率特别低,如果使用map join操作,在map的过程中就完成了不等值的join操作,效率会高很多。

select A.a ,A.b from A join B where A.a>B.a

3.2 Bucket-MapJoin

3.2.1 作用

两个表join的时候,小表不足以放到内存中,但是又想用map side join这个时候就要用到Bucket MapJoin。其方法是两个join表在join key上都做hash bucket,并且把你打算复制的那个(相对)小表的bucket数设置为大表的倍数。这样数据就会按照key join,做hash bucket。小表依然复制到所有节点,Map join的时候,小表的每一组bucket加载成hashtable,与对应的一个大表bucket做局部join,这样每次只需要加载部分hashtable就可以了。

3.2.2 条件

1) set hive.optimize.bucketmapjoin = true;
2) 一个表的bucket数是另一个表bucket数的整数倍
3) bucket列 == join列(数值类型)
4) 必须是应用在map join的场景中

注意:如果表不是bucket的,则只是做普通join。

在这里插入图片描述

3.3 SMB Join

全称Sort Merge Bucket Join。

3.3.1 作用

大表对小表应该使用Map Join来进行优化,但是如果是大表对大表,如果进行shuffle,就会非常慢,并且容易出现异常,此时就可以使用SMB Join来提高性能。SMB Join基于Bucket-MapJoin的有序bucket,可实现map端完成join操作,可以有效地减少或避免shuffle的数据量。SMB join的条件和Map join类似但又不同。

bucket mapjoinSMB join
set hive.optimize.bucketmapjoin = true;set hive.optimize.bucketmapjoin = true; set hive.optimize.bucketmapjoin.sortedmerge = true; set hive.auto.convert.sortmerge.join=true; set hive.auto.convert.sortmerge.join.noconditionaltask=true;
一个表的bucket数是另一个表bucket数的整数倍小表的bucket数=大表bucket数
bucket列 == join列Bucket 列 == Join 列(数值) == sort 列
必须是应用在map join的场景中必须是应用在bucket mapjoin 的场景中

4. 数据倾斜

4.1 表连接数据倾斜(Join skew in)

4.1.1 运行时优化

set hive.optimize.skewjoin=true;
默认关闭。
如果大表和大表进行join操作,则可采用skewjoin(倾斜关联)来开启对倾斜数据的优化。
skewjoin原理:

  1. 对于skewjoin.key,在执行job时,将它们存入临时的HDFS目录,其它数据正常执行
  2. 倾斜数据开启map join操作(多个map并行处理),对非倾斜值采取普通join操作
  3. 将倾斜数据集和非倾斜数据集进行合并Union操作。

开启skewin以后,究竟多大的数据才会被认为是倾斜了的数据呢?
set hive.skewjoin.key=100000;
默认值100000。
如果join的key对应的记录条数超过这个值,就认为这个key产生了数据倾斜,则会对其进行分拆优化。

4.1.2 编译时优化

上面的配置项其实应该理解为hive.optimize.skewjoin.runtime,也就是sql运行时来对偏斜信息进行优化;除此之外还有另外一个配置:
set hive.optimize.skewjoin.compiletime=true;
默认关闭。
此参数的用处和上面的hive.optimize.skewjoin一致,但在编译sql时就已经将执行计划优化完毕。但要注意的是,只有在表的元数据中存储的有数据倾斜信息时,才能生效。因此建议runtime和compiletime都设置为true
可以通过建表语句来指定数据倾斜元数据

CREATE TABLE list_bucket_single (key STRING, value STRING)
-- 倾斜的字段和需要拆分的key值
SKEWED BY (key) ON (1,5,6)
--  为倾斜值创建子目录单独存放
[STORED AS DIRECTORIES];

4.2 分组统计数据倾斜(Groupby skew in)

4.2.1 Map阶段聚合

set hive.map.aggr=true;

开启map端combiner。此配置可以在group by语句中提高HiveQL聚合的执行性能。这个设置可以将顶层的聚合操作放在Map阶段执行,从而减轻数据传输和Reduce阶段的执行时间,提升总体性能。默认开启,无需显示声明。

4.2.2 MRJob随机数打散

set hive.groupby.skewindata=true;

默认关闭。
这个配置项是用于决定group by操作是否支持倾斜数据的负载均衡处理。当数据出现倾斜时,如果该变量设置为true,那么Hive会自动进行负载均衡
当选项设定为 true,生成的查询计划会有两个 MR Job
第一个MR Job中,Map 的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;
第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

注意:在多个列上进行的去重操作与hive环境变量hive.groupby.skewindata存在冲突
当hive.groupby.skewindata=true时,hive不支持多列上的去重操作,并报错:

Error in semantic analysis: DISTINCT on different columns not supported with skew in data.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GS-SLAM Dense Visual SLAM with 3D Gaussian Splatt 论文阅读

项目主页 2024 CVPR (highlight) https://gs-slam.github.io/ 摘要 本文提出了一种基于3D Gaussian Splatting方法的视觉同步定位与地图构建方法。 与最近采用神经隐式表达的SLAM方法相比,本文的方法利用实时可微分泼溅渲染管道,显著加速了地图优化和…

Lfsr32

首先分析 Lfsr5 首先要理解什么是抽头点(tap),注意到图中有两个触发器的输入为前级输出与q[0]的异或,这些位置被称为 tap position.通过观察上图,所谓抽头点指的就是第5个,第3个寄存器的输入经过了异或逻辑…

ArkUI自定义TabBar组件

在ArkUI中的Tabs,通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。其中内容是图TabContent作为Tabs的自组件,通过给TabContent设置tabBar属性来自定义导航栏样式。现在我们就根据UI设计的效果图来实现下图效果: 根…

【stm32】DMA的介绍与使用

DMA的介绍与使用 1、DMA简介2、存储器映像3、DMA框图4、DMA基本结构5、DMA请求6、数据宽度与对齐7、数据转运DMA(存储器到存储器的数据转运)程序编写: 8、ADC连续扫描模式DMA循环转运DMA配置:程序编写: 1、DMA简介 DM…

【python】OpenCV—Sort the Point Set from Top Left to Bottom Right

文章目录 1、功能描述2、代码实现3、效果展示4、更多例子5、参考 1、功能描述 给出一张图片,里面含有各种图形,取各种图形的中心点,从左到右从上到下排序 例如 2、代码实现 import cv2 import numpy as npdef process_img(img):img_gray c…

# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十四)--计算机网络基础和相关命令

linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十四)–计算机网络基础和相关命令 一、计算机网络基础1(Linux的网络基础) 1、网络相关概述:网络发展 1)信息传递 远古时期…

CANoe_数据回放功能功能介绍_时间段(区间)选择

CANoe的日志回放功能,可以选择时间段回放,这样可以在数据量很大的时候快速定位分析数据问题点 CANoe日志回放功能概述 CANoe的日志回放功能允许用户重现和分析已记录的CAN总线或其他网络总线数据。这些日志文件通常以CANoe自己的日志格式(.b…

MarkDownload 剪裁网页插件配置使用全流程

前言 写在前面,大家有什么问题和需要可以跟我交流 需求 之前一直使用 Joplin 的剪裁网页功能,但是剪裁下来后不可避免的需要使用 Joplin 对剪裁下来的内容做处理,Joplin 用起来不是很习惯,所以在想可不可以用 Obsidian 来实现网…

雷池WAF自动化实现安全运营实操案例终极篇

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

OpenShift 4 - 云原生备份容灾 - Velero 和 OADP 基础篇

《OpenShift 4.x HOL教程汇总》 说明: 本文主要说明能够云原生备份容灾的开源项目 Velero 及其红帽扩展项目 OADP 的概念和架构篇。操作篇见《OpenShift 4 - 使用 OADP 对容器应用进行备份和恢复(附视频) 》 Velero 和 OADP 包含的功能和模…

three.js 毛玻璃着色器的效果

three.js 毛玻璃着色器的效果 在线链接:https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idgroundglass 国内站点预览:http://threehub.cn github地址: https://github.com/z2586300277/three-cesium-examples import…

MySQL基础笔记小结

1. mysql : 1.1启动与停止mysql: net start mysql80 net stop mysel80 1.2客户端连接: 2种,系统cmd与自带的cmd(直接打开) mysql -u root-p 1.2.1 数据存储 RDBMS:关系型数据库:建立在关系模型基础上&…

在海外留学/工作,如何报考微软mos认证?

重点首先得强调的是,即使在海外也可以顺利地在国内获取微软MOS认证! 01 微软mos认证简介 Microsoft Office Specialist 简称MOS。是微软公司和第三方国际认证机构、全球三大IT测验与教学中心之一的思递波/Certiport公司于1997年联合推出的,…

python爬虫,爬取网页壁纸图片

python爬虫实战,爬取网页壁纸图片 使用python爬取壁纸图片,保存到本地。 爬取彼岸图网,网站地址https://pic.netbian.com/ 本人小白,记录一下学习过程。 开始前的准备 安装python环境,略。 python编辑器pycharm2…

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南 本文记录了将旧笔记本电脑 T480 拆机屏幕改装为便携式显示器的全过程。作者在决定升级设备后,选择通过 DIY 方式利用原有的屏幕资源。文章详细介绍了屏幕驱动板的安装、螺丝孔的剪裁、排线连接及固定的步…

[AWS]RDS数据库版本升级

背景:由于AWS上mysql5.7版本不再支持,需要进行版本升级。 吐槽:每年都要来那么几次,真的有病一样,很烦。 步骤一、升级检查 AWS提供了一个python的升级检测脚本,可以按照一下脚本下载测试: [r…

Kibana可视化Dashboard如何基于字段是否包含某关键词进行过滤

kinana是一个功能强大、可对Elasticsearch数据进行可视化的开源工具。 我们在dashboard创建可视化时,有时需要将某个index里数据的某个字段根据是否包含某些特定关键词进行过滤,这个时候就可以用到lens里的filter功能很方便地进行操作。 如上图所示&…

架构师备考-背诵精华(系统架构评估)

系统架构评估是在对架构分析、评估的基础上,对架构策略的选取进行决策。它利用数学或逻辑分析技术,针对系统的一致性、正确性、质量属性、规划结果等不同方面,提供描述性、预测性和指令性的分析结果。 重要概念 敏感点:敏感点是…

docker 下载netcore 镜像

dotnet-docker/README.runtime.md at main dotnet/dotnet-docker GitHub docker pull mcr.microsoft.com/dotnet/runtime:8.0 docker pull mcr.microsoft.com/dotnet/runtime:3.1

二分查找算法 (算法详解+模板+例题)

文章目录 二分查找算法简介1.朴素的二分查找2. 在排序数组中查找元素的第一个和最后一个位置3. 搜索插入位置4. 山脉数组的峰顶索引5.寻找峰值6. 寻找旋转排序数组中的最小值 二分查找算法简介 二分查找算法并不是针对在数组有序的情况下,通过后面的题我们就会知道实际上只要是…