Hive企业级调优[5]—— HQL语法优化之数据倾斜
目录
HQL语法优化之数据倾斜
数据倾斜概述
分组聚合导致的数据倾斜
优化说明
优化案例
Join导致的数据倾斜
优化说明
优化案例
HQL语法优化之数据倾斜
数据倾斜概述
数据倾斜问题通常指的是参与计算的数据分布不均,即某个key或某些key的数据量远超其他key,导致在shuffle阶段,大量相同key的数据被发送到同一个Reduce节点,从而使该Reduce节点所需的时间远超其他Reduce节点,成为整个任务的瓶颈。Hive中的数据倾斜常见于分组聚合和join操作的场景中。
分组聚合导致的数据倾斜
优化说明
在Hive中,未经优化的分组聚合是通过一个MapReduce Job来实现的。Map端负责读取数据并按分组字段进行分区,通过shuffle将数据发送到Reduce端,在此完成最终的聚合运算。如果分组字段的值分布不均,则可能导致大量相同key的数据进入同一个Reduce,从而引起数据倾斜。
针对由分组聚合导致的数据倾斜问题,有两种解决思路:
-
Map-Side聚合 开启Map-Side聚合后,数据会在Map端完成部分聚合工作。即使原始数据是倾斜的,经过Map端的初步聚合后,发送给Reduce的数据也会更加均匀,从而减轻数据倾斜的问题。相关参数包括:
set hive.map.aggr=true;(启用map-side聚合)set hive.map.aggr.hash.min.reduction=0.5;(用于检测源表是否适合进行map-side聚合)set hive.groupby.mapaggr.checkinterval=100000;(用于检测源表是否适合map-side聚合的条数)set hive.map.aggr.hash.force.flush.memory.threshold=0.9;(map-side聚合所用的hash table,占用map task堆内存的最大比例)
-
Skew-GroupBy优化 Skew-GroupBy优化的原理是启动两个MR任务,第一个MR任务按照随机数分区,将数据分散发送到Reduce,完成部分聚合;第二个MR任务按照分组字段分区,完成最终的聚合。相关参数包括:
set hive.groupby.skewindata=true;(启用分组聚合数据倾斜优化)
优化案例
示例SQL语句
hive (default)> select province_id, count(*) from order_detail group by province_id;
优化思路
- Map-Side聚合 设置参数:
set hive.map.aggr=true;set hive.groupby.skewindata=false;
- Skew-GroupBy优化 设置参数:
set hive.groupby.skewindata=true;set hive.map.aggr=false;
Join导致的数据倾斜
优化说明
未经优化的join操作,默认使用common join算法,通过一个MapReduce Job完成计算。Map端负责读取join操作所需表的数据,并按照关联字段进行分区,通过shuffle发送到Reduce端,在此完成最终的join操作。如果关联字段的值分布不均,则可能导致大量相同key的数据进入同一个Reduce,从而引起数据倾斜。
对于由join导致的数据倾斜问题,有如下三种解决方案:
-
Map Join 使用map join算法可以在Map端完成join操作,无需shuffle和reduce阶段,适用于大表join小表时发生数据倾斜的情况。相关参数包括:
set hive.auto.convert.join=true;(启动Map Join自动转换)set hive.mapjoin.smalltable.filesize=250000;(Common Join转为Map Join的判断条件)set hive.auto.convert.join.noconditionaltask=true;(开启无条件转Map Join)set hive.auto.convert.join.noconditionaltask.size=10000000;(无条件转Map Join时的小表之和阈值)
-
Skew Join Skew Join的原理是为倾斜的大key单独启动一个map join任务进行计算,其余key进行正常的common join。相关参数包括:
set hive.optimize.skewjoin=true;(启用skew join优化)set hive.skewjoin.key=100000;(触发skew join的阈值)
-
调整SQL语句 若参与join的两表均为大表,其中一张表的数据是倾斜的,可以通过调整SQL语句的方式来进行优化。
优化案例
示例SQL语句
hive (default)> select * from order_detail od join province_info pi on od.province_id=pi.id;
优化思路
-
Map Join 设置参数:
set hive.auto.convert.join=true;set hive.optimize.skewjoin=false;
-
Skew Join 设置参数:
set hive.optimize.skewjoin=true;set hive.auto.convert.join=false;
相关文章:
Hive企业级调优[5]—— HQL语法优化之数据倾斜
目录 HQL语法优化之数据倾斜 数据倾斜概述 分组聚合导致的数据倾斜 优化说明 优化案例 Join导致的数据倾斜 优化说明 优化案例 HQL语法优化之数据倾斜 数据倾斜概述 数据倾斜问题通常指的是参与计算的数据分布不均,即某个key或某些key的数据量远超其他keyÿ…...
表示速度的speed与velocity语义辨析
speed 对应的中文是 速度, 比如 5KM/h, 但是语义中不带方向,所以一般用来表示标量(scalar)。velocity 对应的中文也是 速度, 比如 5KM/h, 语义中蕴含了方向, 常用于表示向量(vector)。 2024年09月22日...
Electron 图标修改
目录 1. 图片基本要求 2. 在main.js中配置icon 位置 3. 在package.json 中配置icon 位置 4. 问题:左上角图片 开发环境下显示,生产环境下不显示 1. 图片基本要求 图片格式为ico,图片像素像素为256*256; 将ico文件放在pub…...
项目扩展二:消息拉取功能的实现
项目扩展二:消息拉取功能的实现 一、回顾一下消息推送功能是如何实现的二、设计消息拉取功能1.服务器如何处理2.定义Request和Response1.定义Request2.proto文件 三、服务器实现消息拉取1.业务模块的实现:信道模块2.消费者管理模块实现O(1)获取消费者1.目…...
C语言6大常用标准库 -- 4.<math.h>
目录 引言 4. C标准库--math.h 4.1 简介 4.2 库变量 4.3 库宏 4.4 库函数 4.5 常用的数学常量 🌈你好呀!我是 程序猿 🌌 2024感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长&…...
【图像匹配】基于SIFT算法的图像匹配,matlab实现
博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于SIFT算法的图像匹配,用matlab实现。 一、案例背景和算法介绍 本…...
C++门迷宫
目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好,我叫这是我58。 程序 #include <iostream> using namespace std; void printmaze(const char strmaze[11][11]) {int i 0;int ia 0;for (; i < 11; i) {for (ia 0; ia <…...
用最通俗易懂的语言和例子讲解三维点云
前言: 我整体的学习顺序是看的按B站那“唯一”的三维点云的视频学习的(翻了好久几乎没有第二个...)对于深度学习部分,由于本人并没有进行学习,所以没有深究。大多数内容都进行了自己的理解并找了很多网络的资源方便理解…...
VM虚拟机下载以及激活
传统的官网已经找不到下载了,这里我将下载好的放在阿里云盘,百度云盘太慢了,懂得都得 阿里云盘分享 下载好了后会是一个exe文件,直接双击运行就可 下载无脑下一步即可,这里不做介绍 下载好了后,需要密钥这里…...
详解Ajax与axios的区别
Ajax与Axios在Web开发中都是用于发送HTTP请求的技术,但它们在多个方面存在显著的差异。以下是对两者区别的详细解析: 1. 技术原理 Ajax:Asynchronous JavaScript and XML(异步JavaScript和XML)的缩写,是一…...
golang学习笔记28——golang中实现多态与面向对象
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
运行 xxxxApplication 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。
一、问题描述 运行 xxxxApplication 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。 二、问题分析 在idea中,运行一个springboot项目,在使用大量的库和依赖的时候,会出现报错“命令行过长”&…...
k8s自动清理pod脚本分享
检查会遇到集群节点内存消耗超过90%,我们可以筛选一些可以进行重启的pods,如脚本中涉及svc-开头的,进行触发即重启的shell编写。此项会涉及metrics组件需要安装。 #!/bin/bash# 设置内存使用率阈值为90% MEMORY_THRESHOLD90# 初始化一个数组…...
Go并发编程的高级技巧——请求复制与限流
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在一些高性能应用场景中,快速响应是非常重要的目标。例如,当一个应用需要快速响应用户的HTTP请求,或从多个副本中检索数据时,如何优化请求处理成为关键。本文将讨论如何在Go语言中,通过并发和限流机制来实现…...
网站建设模板选择哪种
在选择网站建设模板时,需要考虑多个因素,包括网站的目的、受众、内容类型以及个性化需求等。以下是一些常见的网站建设模板类型,以及它们的特点,希望对你的选择有所帮助。 企业/商务模板: 企业和商务网站通常需要专业、…...
【linux】kill命令
kill 命令在 Linux 和类 Unix 系统中用于向进程发送信号,默认情况下是发送 SIGTERM(信号 15),请求程序终止运行。如果程序没有响应 SIGTERM 信号,可以使用 SIGKILL(信号 9)强制终止进程…...
Python基础 | 在虚拟环境中安装并在指定文件夹中打开Jupyter notebook
在虚拟环境中安装并在指定文件夹中打开Jupyter notebook 前言一、在虚拟环境下安装Jupyter notebook二、在指定路径下打开Jupyter notebook 前言 Jupyter Notebook 是一个基于 Web 的交互式计算环境,主要功能是将代码、文本、数学方程式、可视化和其他相关元素组合…...
1.Spring-容器-注册
一、Bean和获取Bean (1)创建IoC容器: SpringApplication.run(类名.class, args); ConfigurableApplicationContext ioc SpringApplication.run(Spring01IocApplication.class, args); (2)将对象注册到IoC容器中&am…...
Mapper.xml SQL大于小于号转义符
Mapper.xml中写的SQL语句,大于小于号字符直接写会报错,需要变成转义字符 对应如下: Mapper.xml SQL大于小于号转义符...
Linux:进程(三)——进程状态
目录 Linux源代码对进程的描述 R S D T t X Z(进程僵尸) 孤儿进程 Linux源代码对进程的描述 理论上把进程状态大致被分为了:运行、阻塞、挂起。那么,在操作系统中具体是如何描述状态的。(有时候Linux内核也把…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
