hive 数据倾斜问题汇总

阅读: 评论:0

hive 数据倾斜问题汇总

hive 数据倾斜问题汇总

数据倾斜,即单个节点认为所处理的数据量远大于同类型任务所处理的数据量,导致该节点成为整个作业的瓶颈,这是分布式系统不可避免的问题,从本质上说,导致数据倾斜有两种原因

1.任务读取大文件

2.任务需要处理大量相同键的数据

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

1.数据含有大量无意义的数据,例如空值(null),空字符串等

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

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

4.两表进行join,都含有大量相同的倾斜数据键。

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

当集群的数据量增长到一定规模,有些数据需要归档或者转储,这个时候往往需要对数据进行压缩,当文件使用gzip压缩等不支持文件分割操作的压缩方式,在日后有作业涉及读取压缩后的文件时,该压缩文件只会被一个任务所读取,如果该压缩文件很大,则处理该文件的map需要花费的时间会远多于读取普通文件的map时间,该map任务会成为作业的瓶颈,这种情况也就是map读取文件的数据倾斜,例如存在这样一张表 t_des_info

t_des_info 表由3个gzip压缩后的文件组组成

其中large_file 大小为200M左右,在计算引擎运行时候,预先设置每个map处理数据量为128M,但是计算引擎无法切分文件,所有该文件不会交给两个map任务去读取,而是有且仅有一个任务在操作。

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

如果想要了解每个map任务所读取的具体文件,为了避免因不可拆分大文件而引发的数据读取的倾斜,在数据压缩的时候可以采用 bzip2 和 zip等支持文件分隔的压缩算法。

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

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

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

在多维聚合计算时存在这样的场景:

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表好友数据倾斜键,会加剧shfffle过程的数据倾斜。

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

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

select a,b,null,count(*) 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中可以设置参数 uping.set.cardinality 配置的方式自动控制作业的拆解,该参数默认值是30. 该参数表示针对grouping set /rollups/cubes 这类多维聚合的操作,如果是最后拆解的键组合(上面例子的组合是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任务产生内存溢出的异常,针对这种场景,即使开启 upby.skewindata配置参数,也不会起到优化的作业,反而会拖累整个作业的运行。如果应用该参数会将作业拆解成两个作业,第一个作业会尽可能给你的将map数据平均分配到reduce阶段, 并在map整个阶段实现数据预聚合,以减少第二个作业的处理数据量,然后第二个作业在第一个作业预处理数据的基础上进行结果的聚合。

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

两个hive数据连接时引发的数据倾斜

两表进行普通的repartition join时,如果表的连接键存在倾斜,那么shuffle阶段必然会引起数据倾斜。遇到这种情况,hive的通常做法还是启动两个作业,第一个作业处理没有倾斜的数据,第二个作业将倾斜的数据存到分布式缓存中,分发到各个map任务的所在节点。在map阶段完成join操作,即MapJoin,这样避免了shuffle,从而避免了数据倾斜。

比如 a表是维度表,b表是事实表, B表有上亿条记录,而维度表只有几千条记录,我们sql如下

select * from a

inner join b

on a.id=b.id

我们可以强制将a表放入缓存并分发到各个机器上,这里使用mapjoin

select /*+mapjoin(a)*/ * from a join b on a.id=b.id

本电子书为免费下载,共同提高技术,勿做盈利使用

MYSQL系列书籍

高可用mysql: =2651 (访问密码: 2651)

MySQL王者晋级之路.pdf: =2651 (访问密码: 2651)

MySQL技术内幕InnoDB存储引擎第2版.pdf: =2651 (访问密码: 2651)

MySQL技术内幕 第4版.pdf: =2651 (访问密码: 2651)

MySQL管理之道,性能调优,高可用与监控(第二版).pdf: =2651 (访问密码: 2651)

深入浅出MySQL数据库开发、优化与管理维护第2版.pdf: =2651 (访问密码: 2651)

高性能MySQL.第3版.Baron Schwartz.pdf: =2651 (访问密码: 2651)

MYSQL内核:INNODB存储引擎 卷1.pdf: =2651 (访问密码: 2651)

MySQL技术内幕InnoDB存储引擎第2版.pdf: =2651 (访问密码: 2651)

MySQLDBA修炼之道.pdf: =2651 (访问密码: 2651)

MySQL5.7从入门到精通.pdf: =2651 (访问密码: 2651)

高可用mysql.pdf: =2651 (访问密码: 2651)

HIVE电子书

Practical Hive.pdf: =2651 (访问密码: 2651)

Hive-Succinctly.pdf: =2651 (访问密码: 2651)

Apache Hive Essentials.pdf: =2651 (访问密码: 2651)

Apache Hive Cookbook.pdf: =2651 (访问密码: 2651)

hadoop电子书

Practical Hadoop Migration.pdf: =2651 (访问密码: 2651)

Hadoop实战-陆嘉恒(高清完整版).pdf: =2651 (访问密码: 2651)

Hadoop & Spark大数据开发实战.pdf: =2651 (访问密码: 2651)

Expert Hadoop Administration.pdf: =2651 (访问密码: 2651)

Big Data Forensics - Learning Hadoop Investigations.pdf: =2651 (访问密码: 2651)

python电子书

python学习手册.pdf: =2651 (访问密码: 2651)

Python基础教程-第3版.pdf: =2651 (访问密码: 2651)

Python编程:从入门到实践.pdf: =2651 (访问密码: 2651)

Python Projects for Beginners.pdf: =2651 (访问密码: 2651)

kafka电子书

Learning Apache Kafka, 2nd Edition.pdf: =2651 (访问密码: 2651)

Kafka权威指南.pdf: =2651 (访问密码: 2651)

Kafka in Action.pdf: =2651 (访问密码: 2651)

Apache Kafka实战.pdf: =2651 (访问密码: 2651)

Apache Kafka Cookbook.pdf: =2651 (访问密码: 2651)

spark电子书

Spark最佳实践.pdf: =2651 (访问密码: 2651)

数据算法--Hadoop-Spark大数据处理技巧.pdf: =2651 (访问密码: 2651)

Spark大数据分析实战.pdf: =2651 (访问密码: 2651)

Spark 2.0 for Beginners.pdf: =2651 (访问密码: 2651)

Pro Spark Streaming.pdf: =2651 (访问密码: 2651)

Spark in Action.pdf: =2651 (访问密码: 2651)

Learn PySpark.pdf: =2651 (访问密码: 2651)

Fast Data Processing with Spark.pdf: =2651 (访问密码: 2651)

Fast Data Processing with Spark, 2nd Edition.pdf: =2651 (访问密码: 2651)

OReilly.Learning.Spark.2015.1.pdf: =2651 (访问密码: 2651)

High Performance Spark.pdf: =2651 (访问密码: 2651)

Machine Learning with PySpark.pdf: =2651 (访问密码: 2651)

Spark for Python Developers.pdf: =2651 (访问密码: 2651)

Spark Cookbook.pdf: =2651 (访问密码: 2651)

Big Data Analytics with Spark.pdf: =2651 (访问密码: 2651)

PySpark SQL Recipes.pdf: =2651 (访问密码: 2651)

Advanced Analytics with Spark Patterns for Learning from Data at Scale .pdf: =2651 (访问密码: 2651)

OReilly.Advanced.Analytics.with.Spark.Patterns.for.Learning.from.Data.at.Scale.pdf: =2651 (访问密码: 2651)

Big Data Analytics Beyond Hadoop_ Real-Time Applications with Storm, Spark, and More Hadoop Alternatives.pdf: =2651 (访问密码: 2651)


 


 

本文发布于:2024-02-02 15:26:45,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170685880444702.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   hive
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23