大数据常见问题:数据倾斜

简介: 大数据常见问题:数据倾斜

前言


offer收割系列介绍:


1、分享桥哥本人或小伙伴在面试大厂时遇到的真题,并给出参考答案!!


2、涉及岗位:主要为大数据开发、数据仓库(桥哥干过的),其它岗位也可参考


3、涵盖技术:mysql、hadoop、hive、Spark、Flink、Kudu、Impala等...


正文


一、数据倾斜表现


1)hadoop中的数据倾斜表现:


有一个多几个Reduce卡住,卡在99.99%,一直不能结束。

各种container报错OOM

异常的Reducer读写的数据量极大,至少远远超过其它正常的Reducer

伴随着数据倾斜,会出现任务被kill等各种诡异的表现。


2)hive中数据倾斜


一般都发生在Sql中group by和join on上,而且和数据逻辑绑定比较深。


3)Spark中的数据倾斜


Spark中的数据倾斜,包括Spark Streaming和Spark Sql,表现主要有下面几种:


Executor lost,OOM,Shuffle过程出错;

Driver OOM;

单个Executor执行时间特别久,整体任务卡在某个阶段不能结束;

正常运行的任务突然失败;


二、数据倾斜产生原因


我们以Spark和Hive的使用场景为例。


他们在做数据运算的时候会涉及到,count distinct、group by、join on等操作,这些都会触发Shuffle动作。一旦触发Shuffle,所有相同key的值就会被拉到一个或几个Reducer节点上,容易发生单点计算问题,导致数据倾斜。


一般来说,数据倾斜原因有以下几方面:


1)key分布不均匀


000000000000000.png


2)建表时考虑不周


我们举一个例子,就说数据默认值的设计吧,假设我们有两张表:


user(用户信息表):userid,register_ip


ip(IP表):ip,register_user_cnt


这可能是两个不同的人开发的数据表。如果我们的数据规范不太完善的话,会出现一种情况:


user表中的register_ip字段,如果获取不到这个信息,我们默认为null;


但是在ip表中,我们在统计这个值的时候,为了方便,我们把获取不到ip的用户,统一认为他们的ip为0。


两边其实都没有错的,但是一旦我们做关联了,这个任务会在做关联的阶段,也就是sql的on的阶段卡死。


3)业务数据激增


比如订单场景,我们在某一天在北京和上海两个城市多了强力的推广,结果可能是这两个城市的订单量增长了10000%,其余城市的数据量不变。


然后我们要统计不同城市的订单情况,这样,一做group操作,可能直接就数据倾斜了。


三、解决数据倾斜思路


很多数据倾斜的问题,都可以用和平台无关的方式解决,比如更好的数据预处理,异常值的过滤等。因此,解决数据倾斜的重点在于对数据设计和业务的理解,这两个搞清楚了,数据倾斜就解决了大部分了。


1)业务逻辑


我们从业务逻辑的层面上来优化数据倾斜,比如上面的两个城市做推广活动导致那两个城市数据量激增的例子,我们可以单独对这两个城市来做count,单独做时可用两次MR,第一次打散计算,第二次再最终聚合计算。完成后和其它城市做整合。


2)程序层面


比如说在Hive中,经常遇到count(distinct)操作,这样会导致最终只有一个Reduce任务。


我们可以先group by,再在外面包一层count,就可以了。比如计算按用户名去重后的总用户量:


(1)优化前


只有一个reduce,先去重再count负担比较大: select name,count(distinct name)from user;


(2)优化后


// 设置该任务的每个job的reducer个数为3个。Hive默认-1,自动推断。


set mapred.reduce.tasks=3;


// 启动两个job,一个负责子查询(可以有多个reduce),另一个负责count(1):


select count(1) from (select name from user group by name) tmp;


3)调参方面


Hadoop和Spark都自带了很多的参数和机制来调节数据倾斜,合理利用它们就能解决大部分问题。


4)从业务和数据上解决数据倾斜


很多数据倾斜都是在数据的使用上造成的。我们举几个场景,并分别给出它们的解决方案。


数据有损的方法:找到异常数据,比如ip为0的数据,过滤掉

数据无损的方法:对分布不均匀的数据,单独计算

hash法:先对key做一层hash,先将数据随机打散让它的并行度变大,再汇聚

数据预处理:就是先做一层数据质量处理,类似于数据仓库维度建模时,底层先处理数据质量


相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
1月前
|
SQL 分布式计算 DataWorks
DataWorks常见问题之maxcompute资源打开失败如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
存储 SQL 缓存
使用实践:Hologres对接MaxCompute常见问题排查
本文总结了Hologres对接MaxCompute时的常见问题与处理方法。
3018 3
使用实践:Hologres对接MaxCompute常见问题排查
|
1月前
|
数据采集 分布式计算 DataWorks
DataWorks常见问题之dataworks引用maxcompute资源失败如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
4月前
|
SQL 分布式计算 大数据
大数据开发岗面试复习30天冲刺 - 日积月累,每日五题【Day29】——数据倾斜2
大数据开发岗面试复习30天冲刺 - 日积月累,每日五题【Day29】——数据倾斜2
42 0
|
4月前
|
存储 消息中间件 分布式计算
大数据开发岗面试复习30天冲刺 - 日积月累,每日五题【Day28】——Spark15+数据倾斜1
大数据开发岗面试复习30天冲刺 - 日积月累,每日五题【Day28】——Spark15+数据倾斜1
36 0
|
7月前
|
分布式计算 资源调度 大数据
大数据数据倾斜问题与企业级解决方案
大数据数据倾斜问题与企业级解决方案
43 0
|
9月前
|
SQL 分布式计算 Hadoop
【大数据】Sqoop使用常见问题
【大数据】Sqoop使用常见问题
294 0
|
10月前
|
SQL 分布式计算 大数据
大数据SQL数据倾斜与数据膨胀的优化与经验总结
目前市面上大数据查询分析引擎层出不穷,但在业务使用过程中,大多含有性能瓶颈的SQL,主要集中在数据倾斜与数据膨胀问题中。本文结合业界对大数据SQL的使用与优化,尝试给出相对系统性的解决方案。
13155 5
|
SQL 编解码 分布式计算
【MaxCompute 常见问题】 UDF
查看资源信息 假设资源名称为 pyudf_test.py,在 odpscmd 客户端执行 desc resource pyudf_test.py;,或在 datastudio 中新建 SQL 节点后输入 desc resource pyudf_test.py;执行。
【MaxCompute 常见问题】 UDF
|
数据采集 存储 消息中间件
谈谈大数据采集和常见问题
谈谈大数据采集和常见问题
384 0

热门文章

最新文章