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

news2024/10/19 1:40:33

文章目录

  • 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.coloradmin.cn/o/2218149.html

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

相关文章

nginx过滤模块怎么生效的

在nginx中,如果你要开发一个过滤模块,config中必须要加 HTTP_FILTER_MODULES$HTTP_FILTER_MODULES xxx 否则,即使在postconfiguration回调中加了ngx_http_top_header_filtermy_xxxx_filter_handle,最终my_xxxx_filter_handle也不…

c语言必备知识-->文件操作(内存与磁盘交互)

引言:本篇文章主要的内容是关于c语言文件相关的知识点,包括相应的代码实操,及文件操作时常用的接口讲解。 本篇文章用来解决如何将内存中的数据永久保存到磁盘当中,并且如何从磁盘读取内容放到我们内存当中。 我将讲解如下知识点: 1:文件(是什么,为什么要用,) 2:常用…

《Spring Cloud Config与Bus整合实现微服务配置自动刷新》

目录 Config与Bus整合自动刷新步骤1:安装RabbitMQ并启动RabbitMQ的安装 步骤2:创建项目创建Eureka Server创建config-server 步骤3: 添加依赖步骤4:Config Client步骤5:测试运行问题一问题二 总结 Config与Bus整合自动…

Java爬虫:从入门到精通实战指南

在信息技术飞速发展的今天,数据已成为最宝贵的资源之一。Java作为一种成熟且功能强大的编程语言,不仅在企业级应用开发中占据主导地位,也成为了编写爬虫程序的理想选择。Java爬虫能够自动化地从网页或API中提取数据,为数据分析、机…

一篇文章带你走进Java集合中的HashMap

文章目录 一、了解常见的数据结构二叉平衡树AVL树红黑树 二、HashMap的实现原理HashMap的jdk1.7和jdk1.8有什么区别? 三、HashMap put的具体流程四、HashMap的扩容机制五、HashMap的寻址算法**第一步:** 计算对象的hashCode第二步: 二次哈希第…

基于springboot的学习平台系统

springbootjava学习平台作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的,前后端分离。 开发语言:Java数据库&#xff1a…

2024第七届全国大学生数学竞赛暨数学精英挑战赛第二场,第一场获奖名单已公布

第七届全国大学生数学竞赛暨数学精英挑战赛(原网络挑战赛)由浙江应用数学研究会组织举办。自2018年起已经连续举办6届,吸引来自全国900余所高校选手参赛,近三年累计参赛人数1.5万人。2024年,第七届全国大学生数学竞赛暨…

力扣MySQL 1581

先把两张表连接,amount为null 的正是我们需要的,再按customer_id聚合 select Visits.visit_id,customer_id ,Transactions.visit_id ,transaction_id ,amount from Visits left join Transactions on Visits.visit_idTransactions.visit_id 正确代码&…

银河麒麟V10系统+Windows10双系统启动顺序正确修改方法

***正确可行方法***,测试OK且稳定; 银河麒麟桌面操作系统V10是一款适配国产软硬件平台并深入优化和创新的新一代图形化桌面操作系统,同源支持国内外主流处理器架构,并不断使能GPU、桥片、网卡等各种新硬件,提供更优的软…

Electron+Vue实现两种方式的截屏功能

本次介绍的截屏功能一共有两种分别是在electron环境中与非electron环境中 非electron环境 这个环境下会有一些限制: 1.只能截浏览器中的画面 2.如果里面有iframe或者base64的图片会加载不出来(这个会有解决办法) yarn add -D js-web-scree…

Vue详细入门(语法【三】)

今天滴的学习目标!!! Vue组件是什么?组件的特性和优势Vue3计算属性Vue3监听属性 在前面Vue详细入门(语法【一】——【二】)当中我们学习了Vue有哪些指令,它的核心语法有哪些?今天我们…

大模型学习方法之——大模型技术学习路线,小白也能学会大模型

技术学习无非涵盖三个方面,理论,实践和应用 大模型技术爆火至今已经有两年的时间了,而且大模型技术的发展潜力也不言而喻。因此,很多人打算学习大模型,但又不知道该怎么入手,因此今天就来了解一下大模型的…

java-uniapp小程序-引导关注公众号、判断用户是否关注公众号

目录 1、前期准备 公众号和小程序相互关联 准备公众号文章 注册公众号测试号 微信静默授权的独立html 文件 2: 小程序代码 webview页面代码 小程序首页代码 3:后端代码 1:增加公众号配置项 2:读取公众号配置项 3&…

【学习笔记】什么是MongoDB

文章目录 MongoDB 简介体系结构数据模型MongoDB 的特点 MongoDB 简介 学习一个东西就跟认识一个人一样,下面有情MongoDB来做个自我介绍 大家好,俺是MongoDB,是一个开源、高性能、无模式的文档型数据库,当初的设计俺就是用于简化开…

学习笔记(202410)

课程:Generative AI for Software Development 链接:吴恩达同步最新AI专业课,第54讲:用人工智能做软件开发--Generative AI for Software Development_哔哩哔哩_bilibili 时间:2024-10-12 至 概述:使用C…

强化学习与深度强化学习:深入解析与代码实现

个人主页:chian-ocean 文章专栏 强化学习与深度强化学习:深入解析与代码实现 强化学习(Reinforcement Learning, RL)是一种机器学习方法,通过智能体(agent)与环境(environment&am…

【Linux】Linux常见指令及权限理解

1.ls指令 语法 : ls [ 选项 ][ 目录或文件 ] 功能 :对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用选项: -a 列出目录下的所有文件,包括以 . 开头的隐含文…

无人机视角下火灾检测数据集 共12736张 标注文件为YOLO适用的txt格式。已划分为训练集、验证集、测试集。类别:Fire yolov5-v10通用

无人机视角下火灾检测数据集 共12736张 标注文件为YOLO适用的txt格式。已划分为训练集、验证集、测试集。类别:Fire yolov5-v10通用 无人机视角下火灾检测数据集 共12736张 标注文件为YOLO适用的txt格式。已划分为训练集、验证集、测试集。类别:Fire yol…

【Vue】Vue3.0(十)toRefs()和toRef()的区别及使用示例

上篇文章:Vue】Vue(九)OptionsAPI与CompositionAPI的区别 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月15日11点13分 文章目录 toRefs()和toRe…

基于朴素贝叶斯的中文垃圾短信分类(含ui界面)

完整代码如下 基于朴素贝叶斯的中文垃圾短信分类、垃圾邮件分类。 可用于机器学习课程设计等。 import warnings warnings.filterwarnings(ignore) import os os.environ["HDF5_USE_FILE_LOCKING"] "FALSE" import pandas as pd import numpy as np fro…