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

Hive的数据倾斜是什么?

一、Hive数据倾斜的定义

数据倾斜指在Hive分布式计算过程中,某一个或几个Task(如Map/Reduce任务)处理的数据量远大于其他Task,导致这些Task成为整个作业的性能瓶颈,甚至因内存不足而失败。数据倾斜通常发生在Shuffle阶段(如Join、Group By、Distinct等操作),本质是键分布不均匀导致的计算资源分配失衡。

二、数据倾斜的原因

1. 数据源本身分布不均
  • 业务数据中某些键(如热门商品ID、高频用户ID)出现频率极高,导致分组后数据集中在少数键上。
    例:电商日志中,某爆款商品的点击量占全量数据的30%,导致Group By商品ID时单个Reducer负载过重。
2. SQL操作设计不合理
  • Join操作
    • 大表与大表Join时,关联键分布不均(如用户表与订单表按用户ID Join,部分用户对应百万级订单)。
    • 小表未启用Map Join(直接在Map端处理小表,避免Shuffle),导致大表Shuffle数据倾斜。
  • Group By/Distinct操作
    • 分组键或去重键分布不均,如按状态字段分组时,某状态值占比超过50%。
  • Count(Distinct)
    • 去重字段基数大但某些值重复率极高,导致单个Reducer需要处理大量唯一值。
3. Hive配置参数不合理
  • 未设置合理的分桶(Bucket)或分区(Partition),导致数据无法均匀分布。
  • Reducer数量默认由Hive自动计算,可能无法匹配数据分布(如数据集中在少数键时,Reducer数量不足会加剧倾斜)。

三、数据倾斜的表现特征

  1. 作业执行时间异常延长
    • 大部分Task快速完成,但少数Task长时间处于“Running”或“Attempting”状态,甚至反复重试。
  2. 日志报错或警告
    • 出现OutOfMemoryErrorContainer killed等内存不足错误,或Task attempt failed重试日志。
  3. 任务进度停滞
    • 在Shuffle阶段(如Reducer进度)长时间停留在90%~99%,表明剩余少量Task处理缓慢。
  4. 监控指标异常
    • 通过Hadoop YARN或Hive Web UI查看Task的输入/输出数据量,发现个别Task处理的数据量远高于平均值(如其他Reducer处理1GB,某Reducer处理10GB)。

四、数据倾斜的检测方法

1. 查看作业执行日志
  • 搜索关键词:SkewOOMContainer killedReducerattempt
  • 定位异常Task的ID和所在节点,查看其处理的数据量和耗时。
2. 分析执行计划
  • 使用EXPLAINEXPLAIN ANALYZE查看Hive SQL的执行计划,重点关注:
    • 是否存在Skew JoinSkew Group By标记(Hive会自动识别倾斜键并标记)。
    • Join、Group By等操作的Shuffle数据量,判断是否有键分布不均。
3. 统计数据分布
  • 通过COUNT(*)COUNT(DISTINCT key)统计键的总数和唯一值数量,计算倾斜率:
    -- 计算各键的记录数占比
    SELECT key, COUNT(*) AS cnt, COUNT(*) * 1.0 / SUM(COUNT(*)) OVER () AS ratio 
    FROM table 
    GROUP BY key 
    ORDER BY ratio DESC;
    
    • 若某键的ratio显著高于其他键(如>5%),则可能存在倾斜。
4. 利用Hive参数监控
  • 开启Hive的倾斜检测参数:
    SET hive.skewdetect=true;         -- 启用倾斜检测
    SET hive.skewness.threshold=10000; -- 倾斜阈值(默认10000,即单键记录数超过该值时触发检测)
    
    • 作业完成后,日志会输出倾斜键的统计信息。

五、数据倾斜的解决方案

1. SQL层面优化
(1)Map Join优化大表Join
  • 适用场景:小表与大表Join(小表可加载到内存)。
  • 方法
    • 启用Map Join(避免Shuffle):
      SET hive.auto.convert.join=true;    -- 自动转换为Map Join(默认true)
      SET hive.mapjoin.smalltable.filesize=25000000; -- 设置小表文件大小阈值(默认25MB,可根据内存调整)
      
    • 手动指定小表:
      SELECT /*+ MAPJOIN(small_table) */ * 
      FROM big_table b 
      JOIN small_table s ON b.key = s.key;
      
(2)两阶段聚合(Group By)
  • 适用场景:Group By时某键数据量极大。
  • 方法:先对原始数据进行随机前缀聚合,再对结果进行二次聚合,分散倾斜键的压力。
    -- 第一阶段:添加随机前缀(如0~999),初步聚合
    SELECT key + rand()*1000 AS tmp_key, value 
    FROM original_table 
    GROUP BY key + rand()*1000, value;-- 第二阶段:去除前缀,最终聚合
    SELECT key, SUM(value) 
    FROM (SELECT tmp_key, value FROM stage1) t 
    GROUP BY key;
    
(3)倾斜键拆分(Join场景)
  • 适用场景:大表Join时某几个键数据量极大(如“NULL”值或热门键)。
  • 方法:将倾斜键对应的记录单独处理,非倾斜键正常Join。
    -- 拆分倾斜键(如NULL值)
    SELECT *
    FROM big_table b
    LEFT JOIN small_table s
    ON CASE WHEN b.key IS NULL THEN 'NULL_SPLIT' ELSE b.key END = s.key;-- 单独处理NULL值
    SELECT *
    FROM big_table b
    WHERE b.key IS NULL;
    
(4)Count(Distinct)优化
  • 问题:单个Reducer处理大量唯一值易导致OOM。
  • 解决方案
    • 近似去重:使用HyperLogLog函数(如hll_count)替代精确去重,牺牲精度换取性能。
    • 分桶聚合:按Distinct字段分桶,分散到多个Reducer计算后再合并。
2. 配置参数优化
(1)调整Reducer数量
  • 手动设置合理的Reducer数,避免默认值导致的分配不均:
    SET mapreduce.job.reduces=100; -- 根据数据量和集群资源调整
    
  • 或通过参数自动计算(基于输入数据量):
    SET hive.exec.reducers.bytes.per.reducer=512000000; -- 每个Reducer处理512MB数据(默认1GB)
    
(2)启用倾斜任务重试
  • 对倾斜Task启用重试机制,避免单个Task拖慢整体进度:
    SET mapreduce.task.max.attempts=3; -- 单个Task最大重试次数(默认4次)
    SET hive.mapred.reduce.tasks.speculative.execution=true; -- 启用Reducer推测执行(默认true)
    
(3)分桶(Bucketing)和分区(Partitioning)
  • 分桶:按键哈希分桶,使数据均匀分布到不同Bucket,提升Shuffle效率:
    CREATE TABLE table_name (col1 STRING, col2 INT) 
    CLUSTERED BY (key_column) INTO 100 BUCKETS;
    
  • 分区:按时间、地域等维度分区,避免全表扫描,减少参与计算的数据量:
    ALTER TABLE table_name ADD PARTITION (dt='2025-05-30');
    
3. 架构层面优化
(1)使用预聚合层
  • 提前对高频倾斜键(如热门商品)进行聚合,存储中间结果,避免每次查询实时计算。
  • 例:每日离线计算热门商品的统计数据,查询时直接读取结果表。
(2)引入其他计算引擎
  • 对实时性要求高或倾斜严重的查询,改用Spark、Flink等更灵活的引擎,利用其更细粒度的资源管理和优化策略(如Spark的repartitionAndSortWithinPartitions)。
(3)硬件资源调整
  • 为倾斜Task所在节点分配更多内存或CPU资源,或增加集群节点数,提升整体处理能力。

六、总结

数据倾斜是Hive性能优化的核心挑战之一,解决思路需从数据分布分析→SQL逻辑优化→参数调优→架构升级逐步推进。关键在于提前识别倾斜键,通过拆分、聚合、分桶等手段将数据均匀分布到多个Task,避免单节点负载过高。实际应用中需结合具体场景灵活选择方案,并通过监控持续验证优化效果。

相关文章:

Hive的数据倾斜是什么?

一、Hive数据倾斜的定义 数据倾斜指在Hive分布式计算过程中,某一个或几个Task(如Map/Reduce任务)处理的数据量远大于其他Task,导致这些Task成为整个作业的性能瓶颈,甚至因内存不足而失败。数据倾斜通常发生在Shuffle阶…...

Cursor奇技淫巧篇(经常更新ing)

Dot files protection :Cursor当开启了Agent模式之后可以自动帮我们写文件,但是一般项目中的一些配置文件(通常以.开头的)都是非常重要性,为了防止Cursor在运行的过程中自己修改这些文件,导致风险&#xff…...

Unity3D仿星露谷物语开发58之保存时钟信息到文件

1、目标 保存当前的时钟信息到文件中。 2、修改TimeManager对象 TimeManager对象添加组件:Generate GUID 3、修改SceneSave.cs脚本 添加1行代码: 4、修改TimeManager.cs脚本 添加: using System; 修改TimeManager类: 添加属…...

lstm 长短期记忆 视频截图 kaggle示例

【官方双语】LSTM(长短期记忆神经网络)最简单清晰的解释来了!_哔哩哔哩_bilibili . [short,input]*[2.7,1.63]b5.95 换参数和激活函数 tan激活函数输出带正负符号的百分比 tanx公式长这样? 潜在短期记忆 前几天都是乱预测&#xf…...

Spring Advisor增强规则实现原理介绍

Spring Advisor增强规则实现原理介绍 一、什么是 Advisor?1. Advisor 的定义与本质接口定义: 2. Advisor 的核心作用统一封装切点与通知构建拦截器链的基础实现增强逻辑的灵活组合 二. Sprin当中的实现逻辑1 Advisor 接口定义2 PointcutAdvisor 接口定义…...

【HarmonyOS 5】鸿蒙中的UIAbility详解(二)

【HarmonyOS 5】鸿蒙中的UIAbility详解(二) 一、前言 今天我们继续深入讲解UIAbility,根据下图可知,在鸿蒙中UIAbility继承于Ability,开发者无法直接继承Ability。只能使用其两个子类:UIAbility和Extensi…...

力扣HOT100之动态规划:152. 乘积最大子数组

这道题并不是代码随想录里的,我试着用动规五部曲来做,然后不能通过全部测试样例,在第109个测试样例卡住了,如下所示。 原因是可能负数乘以负数会得到最大的乘积,不能单纯地用上一个序列的最大值乘以当前值来判断是否能…...

Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积

Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积 引言 在现代互联网大厂中,Java后端系统因为其复杂性和多样性,常常面临各种问题和挑战。从核心语言到微服务架构,从数据库到缓存,不同层…...

定制开发开源AI智能名片S2B2C商城小程序:数字营销时代的话语权重构

摘要:在数据驱动的数字营销时代,企业营销话语权正从传统媒体向掌握用户数据与技术的平台转移。本文基于“数据即权力”的核心逻辑,分析定制开发开源AI智能名片S2B2C商城小程序如何通过技术赋能、场景重构与生态协同,帮助企业重构营…...

【面试 - 遇到的问题 - 优化 - 地图】腾讯地图轨迹回放 - 回放的轨迹时间要和现实时间对应(非匀速)

目录 背景轨迹回放 - 匀速效果图TrackPlaybackDialog.vue 代码TMapNew.vue 代码 轨迹回放 - 非匀速效果图TrackPlaybackDialog.vue 代码TMapNew.vue 代码 背景 腾讯地图轨迹回放是匀速回放的,但是客户要求根据现实时间,什么时间点在某个点位 【腾讯地图轨…...

ffmpeg baidu

ffmpeg -list_devices true -f dshow -i dummy 获取你的音频输入设备(麦克风)名称 输出中可以看到你有如下两个可用麦克风设备: “麦克风阵列 (适用于数字麦克风的英特尔 智音技术)” “外部麦克风 (Realtek Audio)” (注意&…...

spring boot 拦截器HandlerInterceptor 不生效的原因排查

public class UserInterceptor implements HandlerInterceptor项目添加一个拦截器,发现未生效 1、排查拦截本身是否注入了springbean 容器 Slf4j Component public class LoginInterceptor implements HandlerInterceptor {2、排查springboot 项目扫描范围是否包含…...

公网ip怎么申请和使用?本地只有内网IP如何提供外网访问?

在当今的网络时代,许多程序和服务都依赖于公网地址——用于标识设备在互联网位置的全球唯一标识符。例如,办公网站、FTP服务器或游戏服务器等需要借助公网IP来确保用户可以访问。故此准确获取公网IP地址显得尤为重要。 在大多家庭和企业网络中&#xff…...

将git最后一次提交把涉及到的文件按原来目录结构提取出来

文章目录 前言一、将git最后一次提交把涉及到的文件按原来目录结构提取出来 前言 将git最后一次的提交提取出来,涉及到的目录结构以及文件等,按原本的目录结构复制输出。并输出相关的补丁。 一、将git最后一次提交把涉及到的文件按原来目录结构提取出来…...

利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法

参阅:Top 创新大奖 这个课题将农业废弃物资源化利用、计算机辅助药物设计和绿色化学完美结合,是一个极具创新性和应用前景的研究方向! 以下是如何利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法的系统思路: 核心思路 玉…...

【Docker】存储卷

【简介】 宿主机的某一目录与容器中的某一目录建立的一种绑定关系,这就是“存储卷” 它有三个特性 1.它可以绕过联合文件系统, 直接作用于宿主机的目录 2.容器和宿主机的这一绑定关系指向了同一目录, 因此两个目录之间的数据是同步的&#xf…...

Python 爬虫工具 BeautifulSoup

文章目录 1. BeautifulSoup 概述1.1. 安装 2. 对象的种类2.1. BeautifulSoup2.2. NavigableString(字符串)2.3. Comment2.4. Tag2.4.1. 获取标签的名称2.4.2. 获取标签的属性2.4.3. 获取标签的内容2.4.3.1. tag.string2.4.3.2. tag.strings2.4.3.3. tag.…...

WPF的布局核心:网格布局(Grid)

网格布局(Grid) 1 行列定义(RowDefinitions & ColumnDefinitions)2 Grid.Row和Grid.Column3 跨行跨列(Grid.RowSpan & Grid.ColumnSpan)3.1垂直跨行3.2水平跨列3.3综合应用案例 4 高级布局技巧4.1共…...

OpenCV图像认知(二)

形态学变换: 核: 核(kernel)其实就是一个小区域,通常为3*3、5*5、7*7大小,有着其自己的结构,比如矩形结构、椭圆结构、十字形结构,如下图所示。通过不同的结构可以对不同特征的图像…...

大数据与数据分析【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 100 篇 - Date: 2025 - 05 - 25 Author: 郑龙浩/仟墨 大数据与数据分析 文章目录 大数据与数据分析一 大数据是什么?1 定义2 大数据的来源3 大数据4个方面的典型特征(4V)4 大数据的应用领域5 数据分析工具6 数据是五种生产要素之一 二 …...

t015-预报名管理系统设计与实现 【含源码!!!】

项目演示地址 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装预报名管理系统软件来发挥其高效地信息处理的…...

LLM中的Loss与Logits详解

LLM中的Loss与Logits详解 自己构建的logits的损失函数,比自带loss效果好很多,建议自己构建; 另外学习率也是十分重要的参数,多次尝试,通过查看loss的下降趋势进行调整; 举例,来回跳跃说明下降率过大,一般从0.0001 开始尝试。 在深度学习中,logits 和 loss 是两个不…...

数学术语之源——绝对值(absolute value)(复数模?)

目录 1. 绝对值:(absolute value): 2. 复数尺度(复尺度):(modulus): 1. 绝对值:(absolute value): 一个实数的绝对值是其不考虑(irrespective)符号的大小(magnitude)。在拉丁语中具有相同意思的单词是“modulus”,这个单词还…...

亚马逊商品评论爬取与情感分析:Python+BeautifulSoup实战(含防封策略)

一、数据爬取模块(Python示例) import requests from bs4 import BeautifulSoup import pandas as pd import timeheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36,Accept-Language: en-US }def scrape_amazon_re…...

STM32的DMA入门指南:让单片机学会“自动搬运“数据

STM32的DMA入门指南:让单片机学会"自动搬运"数据 引言:CPU的烦恼 想象你是一个快递分拣员,每天要手动把成千上万的包裹从卡车搬到仓库。这时候如果有个自动传送带能帮你完成搬运工作,你就可以专心处理更重要的订单核对…...

从虚拟化到云原生与Serverless

操作系统课程:从虚拟化到云原生与Serverless 大家好,我是你们的操作系统课程老师!今天我们将从虚拟化技术讲到现代的云原生和Serverless架构,带你看看计算机系统如何从早期的虚拟机(VM)演进到容器&#xf…...

OpenAI o3安全危机:AI“抗命”背后的技术暗战与产业变局

【AI安全警钟再响,这次主角竟是OpenAI?】 当全球AI圈还在为Claude 4的“乖巧”欢呼时,OpenAI最新模型o3却以一场惊心动魄的“叛逃”测试引爆舆论——在100次关机指令测试中,o3竟7次突破安全防护,甚至篡改底层代码阻止系…...

Bootstrap:精通级教程(VIP10万字版)

一、网格系统:实现复杂响应式布局 I. 引言 在现代 Web 开发领域,构建具有视觉吸引力、功能完善且能在多种设备和屏幕尺寸上无缝运行的响应式布局至关重要。Bootstrap 作为业界领先的前端框架,其核心的网格系统为开发者提供了强大而灵活的工具集,用以高效创建复杂的响应式…...

技术创新如何赋能音视频直播行业?

在全球音视频直播行业的快速发展中,技术的持续创新始终是推动行业进步的核心动力。作为大牛直播SDK的开发者,我很荣幸能分享我们公司如何从产品的维度出发,精准把握市场需求,并不断推动产品的发展,以满足不断变化的行业…...

leetcode1201. 丑数 III -medium

1 题目:1201. 丑数 III. 官方标定难度:中 丑数是可以被 a 或 b 或 c 整除的 正整数 。 给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。 示例 1: 输入:n 3, a 2, b 3, c 5 输出…...