Hive 数据倾斜

news2024/11/24 19:25:17

        数据倾斜,即单个节点任务所处理的数据量远大于同类型任务所处理的数据量,导致该节点成为整个作业的瓶颈,这是分布式系统不可能避免的问题。从本质来说,导致数据倾斜有两种原因,一是任务读取大文件,二是任务需要处理大量相同键的数据 。

        任务读取大文件,最常见的就是读取压缩的不可分割的大文件。任务需要处理大量相同键的数据,这种情况有以下4种表现形式:

  • 数据含有大量无意义的数据,例如空值(NULL)、空字符串等

  • 含有倾斜数据在进行聚合计算时无法聚合中间结果,大量数据都需要 经过Shuffle阶段的处理,引起数据倾斜

  • 数据在计算时做多维数据集合,导致维度膨胀引起的数据倾斜

  • 两表进行Join,都含有大量相同的倾斜数据键

1、不可拆分大文件引发的数据倾斜

        当集群的数据量增长到一定规模,有些数据需要归档或者转储,这时候往往会对数据进行压缩;当对文件使用GZIP压缩等不支持文件分割操作的压缩方式,在日后有作业涉及读取压缩后的文件时,该压缩文件只会被一个任务所读取。如果该压缩文件很大,则处理该文件的Map需要花费的时间会 远多于读取普通文件的Map时间,该Map任务会成为作业运行的瓶颈。这种情况也就是Map读取文件的数据倾斜。例如存在这样一张表t_des_info 。61c36235c3bfbeb98deb773be160aa2d.png        t_des_info表由3个GZIP压缩后的文件组成 。ead91517b20c87341b7c10024891e9ba.png        其中,large_file.gz文件约200MB,在计算引擎在运行时,预先设置每 个Map处理的数据量为128MB,但是计算引擎无法切分large_file.gz文件,所 以该文件不会交给两个Map任务去读取,而是有且仅有一个任务在操作 。

        t_des_info表有3个gz文件,任何涉及处理该表的数据都只会使用3个 Map。

33eb63e884ce9788c27c6d596cd561cb.png        为避免因不可拆分大文件而引发数据读取的倾斜,在数据压缩的时 候可以采用bzip2Zip等支持文件分割的压缩算法。

2、业务无关的数据引发的数据倾斜

        实际业务中有些大量的NULL值或者一些无意义的数据参与到计算作业 中,这些数据可能来自业务未上报或因数据规范将某类数据进行归一化变成空值或空字符串等形式。这些与业务无关的数据引入导致在进行分组聚合或者在执行表连接时发生数据倾斜。对于这类问题引发的数据倾斜,在计算过 程中排除含有这类“异常”数据即可 。

3、 多维聚合计算数据膨胀引起的数据倾斜

        在多维聚合计算时存在这样的场景:select a,b,c,count(1)from T group by a,b,c with rollup。对于上述的SQL,可以拆解成4种类型的键进行分组聚合,它们分别是(a,b,c)(a,b,null)(a,null,null) 和(null,null,null)

        如果T表的数据量很大,并且Map端的聚合不能很好地起到数据压缩的 情况下,会导致Map端产出的数据急速膨胀,这种情况容易导致作业内存溢 出的异常。如果T表含有数据倾斜键,会加剧Shuffle过程的数据倾斜 。

        对上述的情况我们会很自然地想到拆解上面的SQL语句,将rollup拆解成如下多个普通类型分组聚合的组合。

select a, b, c, count(1) from T group by a, b, c; 
 
select a, b, null, count(1) from T group by a, b; 
 
select a, null, null, count(1) from T group by a; 
 
select null, null, null, count(1) from T;

        这是很笨拙的方法,如果分组聚合的列远不止3个列,那么需要拆解的 SQL语句会更多。在Hive中可以通过参数 (hive.new.job.grouping.set.cardinality)配置的方式自动控制作业的拆解,该 参数默认值是30。该参数表示针对grouping sets/rollups/cubes这类多维聚合的 操作,如果最后拆解的键组合(上面例子的组合是4)大于该值,会启用新的任务去处理大于该值之外的组合。如果在处理数据时,某个分组聚合的列 有较大的倾斜,可以适当调小该值 。

4、无法削减中间结果的数据量引发的数据倾斜

        在一些操作中无法削减中间结果,例如使用collect_list聚合函数,存在如下SQL:

SELECT
    s_age,
    collect_list(s_score) list_score
FROM
    student_tb_txt
GROUP BY
    s_age

        在student_tb_txt表中,s_age有数据倾斜,但如果数据量大到一定的数 量,会导致处理倾斜的Reduce任务产生内存溢出的异常。针对这种场景,即 使开启hive.groupby.skewindata配置参数,也不会起到优化的作业,反而会拖累整个作业的运行。

        启用该配置参数会将作业拆解成两个作业,第一个作业会尽可能将 Map 的数据平均分配到Reduce阶段,并在这个阶段实现数据的预聚合,以减少第二个作业处理的数据量;第二个作业在第一个作业处理的数据基础上进行结果的聚合。

        hive.groupby.skewindata的核心作用在于生成的第一个作业能够有效减少数量。但是对于collect_list这类要求全量操作所有数据的中间结果的函数来说,明显起不到作用,反而因为引入新的作业增加了磁盘和网络I/O的负担,而导致性能变得更为低下 。

        解决这类问题,最直接的方式就是调整Reduce所执行的内存大小,使用 mapreduce.reduce.memory.mb这个参数(如果是Map任务内存瓶颈可以调整 mapreduce.map.memory.mb)。但还存在一个问题,如果Hive的客户端连接 的HIveServer2一次性需要返回处理的数据很大,超过了启动HiveServer2设置的Java堆(Xmx),也会导致HiveServer2服务内存溢出。

5、两个Hive数据表连接时引发的数据倾斜

        两表进行普通的repartition join时,如果表连接的键存在倾斜,那么在 Shuffle阶段必然会引起数据倾斜 。

        遇到这种情况,Hive的通常做法还是启用两个作业,第一个作业处理没有倾斜的数据,第二个作业将倾斜的数据存到分布式缓存中,分发到各个 Map任务所在节点。在Map阶段完成join操作,即MapJoin,这避免了 Shuffle,从而避免了数据倾斜。

 

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

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

相关文章

Centos7 服务器基线检查处理汇总

1、服务器超时设置 问题描叙 TMOUT的值大于key2且小于等于{key2}且小于等于key2且小于等于{key1}视为合规 查看命令:export检测结果 超时时间:0处理方式 备份/etc/profile文件 cp /etc/profile /etc/profile_bak编辑profile文件 vim /etc/profile修改/新增 TMO…

Spring Cloud(微服务)学习篇(三)

Spring Cloud(微服务)学习篇(三) 1 nacos中使用openFeign(调用方式)实现短信发送 1.1 在shop-sms-api中创建com.zlz.shop.sms.api.service/vo/dto/util,目录结构如下所示 1.2 在pom.xml(shop-sms-api)中加入如下依赖 <dependencies><dependency><groupId>…

西电算法分析与设计核心考点汇总(期末真题,教材算法导论)

文章目录前言一、历年考题1.1 判断题1.2 单选题1.3 复杂度计算1.4 分治1.5 算法设计&#xff08;01背包&#xff0c;最短路径&#xff09;1.6 最大子数组问题1.7 算法设计&#xff08;最长回文串&#xff09;二、核心考点2.1 概述部分考点2.1.1 循环不变式loop-invariants2.1.2…

绪论 基本概念

数据结构 第一章 绪论 概念 数据data&#xff1a;是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素(data element:是数据的基本单位&#xff0c;在计算机程序中通常作为一个整体进行考虑和处理。 数据对象(data …

软件测试面试题和简历模板(面试前准备篇)

一、问题预测 1、让简单介绍下自己&#xff08;这个不用说了每次面试开场&#xff09; 面试官&#xff0c;你好&#xff0c;我叫xxx&#xff0c;xx年本科毕业&#xff0c;从事软件测试将近3年的时间。在此期间做过一些项目也积累过一些经验&#xff0c;能够独立地完成软件测试…

经典的卷积神经网络(VGG,GoogLeNet等)

LeNet LeNet原文地址&#xff1a;https://ieeexplore.ieee.org/abstract/document/726791 Lenet是一个 7 层的神经网络&#xff08;不包含输入层&#xff09;&#xff0c;包含 3 个卷积层&#xff0c;2 个池化层&#xff0c;2 个全连接层。它的网络结构图如下所示&#xff1a…

广州华锐互动:VR虚拟课件互动教学平台在学校教育中的影响和作用

VR虚拟课件互动教学平台是广州华锐互动为各大高校开发的一款基于VR虚拟现实技术的教学工具&#xff0c;VR虚拟课件互动教学平台中包含了各类VR互动课件以及相关教学资源&#xff0c;学生可以自主进入平台汇总进行沉浸式的学习体验&#xff0c;帮助学生更好地理解学习相关教学内…

自动化实战-对个人博客系统实现web自动化测试

基于selenium和JUnit5实现的自动化测试用例 一、使用脑图编写web自动化测试用例 下图就是根据博客系统创建的自动化测试用例脑图 二、创建自动化项目&#xff0c;根据用例来实现脚本 Common包底下放着的是所有测试用例共用的方法&#xff0c;公共类&#xff1b; Test包底下就是…

BERT学习

非精读BERT-b站有讲解视频&#xff08;跟着李沐学AI&#xff09; &#xff08;大佬好厉害&#xff0c;讲的比直接看论文容易懂得多&#xff09; 写在前面 在计算MLM预训练任务的损失函数的时候&#xff0c;参与计算的Tokens有哪些&#xff1f;是全部的15%的词汇还是15%词汇中真…

浅谈babel原理

1. babel简介 Babel 的前身是 6to5&#xff0c;6to5 是 2014 年 发布的&#xff0c;主要功能是 就是 ES6 转成 ES5。后改名babel。 2. Babel用途 转译 esnext、typescript 等到目标环境支持的 js 高级语言到到低级语言叫编译&#xff0c;高级语言到高级语言叫转译代码转换 tar…

MySQL 上亿大表如何优化?

背景XX 实例&#xff08;一主一从&#xff09;xxx 告警中每天凌晨在报 SLA 报警&#xff0c;该报警的意思是存在一定的主从延迟。&#xff08;若在此时发生主从切换&#xff0c;需要长时间才可以完成切换&#xff0c;要追延迟来保证主从数据的一致性&#xff09;XX 实例的慢查询…

李群李代数求导-常用求导公式

参考 A micro Lie theory for state estimation in robotics manif issues 116 常用求导公式 Operation左雅克比右雅克比X−1\mathcal{X}^{-1}X−1JXX−1−I\mathbf{J}_{\mathcal{X}}^{\mathcal{X}^{-1}}\mathbf{-I}JXX−1​−IJXX−1−AdX\mathbf{J}_{\mathcal{X}}^{\mathc…

Go中sync 包的 Cond 使用

文章目录背景Cond 简介使用示例Signal的使用场景Broadcast的使用场景注意事项背景 编写代码过程中&#xff0c; 通常有多个主协程和多个子协程进行协作的过程&#xff0c;比如通过 WaitGroup 可以实现当所有子协程完成之后&#xff0c; 主协程再继续执行&#xff0c; 具体可参…

【ns-3】VS Code开发环境配置

文章目录前言1. 安装VS Code2. 安装CMake和C插件3. 配置环境3.1 配置代码智能提示3.2 配置build3.3 配置gdb调试后记参考文献前言 正所谓“工欲善其事必先利其器”&#xff0c;本篇总结一下ns-3在VS Code开发环境下的配置。 版本信息如下&#xff1a; Ubuntu 22.10ns-3.37VS…

用户难增,广告营收下跌,微博还能“高飞”吗?

微博2022年的业绩再次“变脸”。 图源&#xff1a;微博 2023年3月1日&#xff0c;微博公布了2022年Q4及全年财报。2022年营收18.4亿美元&#xff0c;剔除汇率因素同比下跌15%&#xff1b;2022年Q2以来&#xff0c;微博坚持降本增效策略&#xff0c;提升了运营效率&#xff0c;…

Jquery实现增删改除

文章目录一.关于增加部分区别&#xff1a;二.关于删除部分关于在表格中实现增删改1.首先我们需要创建基本的HTML项目2.相关的css和js的引用3.呈上源代码&#xff08;1&#xff09;.HTML源代码&#xff08;2&#xff09;.js源代码&#xff08;自己创建的&#xff09;3.效果图&am…

大数据技术——Scala语言基础

Scala基础知识控制结构if条件表达式有一点与Java不同的是&#xff0c;Scala中的if表达式的值可以赋值给变量while循环for循环基本语法其中,“变量<-表达式”被称为“生成器(generator).”“守卫(guard)"的表达式:过滤出一些满足条件的结果。基本语法:for (变量<-表达…

Sandstorm 建设者亮点——2023 年 2 月

隆重推出 Sandstorm 建设者亮点——2023 年 2 月版&#xff0c;这是由最厉害的 Sandstorm 社区制作的独一无二的 NFT 系列。 从突破性的兔子机器人到神奇的蒸汽朋克海盗船&#xff0c;Sandstorm 建设者亮点 NFT 系列展示了一系列独一无二的创作。 19 项新资产将添加至 Sandstor…

提升内部客户服务的 13 个最佳实践攻略!

客户服务包含两个方面的内容&#xff1a;一个是内部服务&#xff1b;一个是外部服务。每一个企业在发展过程中都有内部客户和外部客户&#xff0c;内部服务是针对内部客户的&#xff0c;自己公司的部门与部门之间互为内部客户&#xff1b;外部服务是针对公司之外的外部客户的。…

MySQL数据库存储引擎【InnoDB/MyISAM/MEMORY 】

1.InnoDB存储引擎InnoDB给MySQL的表提供了事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全。在MySQL从3.23.34a开始包含InnnoDB。它是MySQL上第一个提供外键约束的表引擎。而且InnoDB对事务处理的能力&#xff0c;也是其他存储引擎不能比拟的。靠后版本的MySQL的默认存…