Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >漫谈千亿级数据优化实践:数据倾斜

漫谈千亿级数据优化实践:数据倾斜

作者头像
肉眼品世界
发布于 2021-01-06 05:00:51
发布于 2021-01-06 05:00:51
7050
举报
文章被收录于专栏:肉眼品世界肉眼品世界

0x00 前言

数据倾斜是大数据领域绕不开的拦路虎,当你所需处理的数据量到达了上亿甚至是千亿条的时候,数据倾斜将是横在你面前一道巨大的坎。 迈的过去,将会海阔天空!迈不过去,就要做好准备:很可能有几周甚至几月都要头疼于数据倾斜导致的各类诡异的问题。

郑重声明:

  • 话题比较大,技术要求也比较高,笔者尽最大的能力来写出自己的理解,写的不对和不好的地方大家一起交流。
  • 有些例子不是特别严谨,一些小细节对文章理解没有影响,不要太在意。(比如我在算机器内存的时候,就不把Hadoop自身的进程算到使用内存中)

文章结构

  1. 先大致解释一下什么是数据倾斜
  2. 再根据几个场景来描述一下数据倾斜产生的情况
  3. 详细分析一下在Hadoop和Spark中产生数据倾斜的原因
  4. 如何解决(优化)数据倾斜问题?

0x01 什么是数据倾斜

简单的讲,数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。

一、关键字:数据倾斜

相信大部分做数据的童鞋们都会遇到数据倾斜,数据倾斜会发生在数据开发的各个环节中,比如:

  • Hive算数据的时候reduce阶段卡在99.99%
  • 用SparkStreaming做实时算法时候,一直会有executor出现OOM的错误,但是其余的executor内存使用率却很低。

这些问题经常会困扰我们,辛辛苦苦等了几个小时的数据就是跑不出来,心里多难过啊。

例子很多,这里先随便举两个,后文会详细的说明。

二、关键字:千亿级

为什么要突出这么大数据量?先说一下笔者自己最初对数据量的理解:

数据量大就了不起了?数据量少,机器也少,计算能力也是有限的,因此难度也是一样的。凭什么数据量大就会有数据倾斜,数据量小就没有?

这样理解也有道理,但是比较片面,举两个场景来对比:

  • 公司一:总用户量1000万,5台64G内存的的服务器
  • 公司二:总用户量10亿,1000台64G内存的服务器。

两个公司都部署了Hadoop集群。假设现在遇到了数据倾斜,发生什么?

公司一的数据分时童鞋在做join的时候发生了数据倾斜,会导致有几百万用户的相关数据集中到了一台服务器上,几百万的用户数据,说大也不大,正常字段量的数据的话64G还是能轻松处理掉的。

公司二的数据分时童鞋在做join的时候也发生了数据倾斜,可能会有1个亿的用户相关数据集中到了一台机器上了(相信我,这很常见),这时候一台机器就很难搞定了,最后会很难算出结果。

0x02 数据倾斜长什么样

笔者大部分的数据倾斜问题都解决了,而且也不想重新运行任务来截图,下面会分几个场景来描述一下数据倾斜的特征,方便读者辨别。

由于Hadoop和Spark是最常见的两个计算平台,下面就以这两个平台说明:

一、Hadoop中的数据倾斜

Hadoop中直接贴近用户使用使用的时Mapreduce程序和Hive程序,虽说Hive最后也是用MR来执行(至少目前Hive内存计算并不普及),但是毕竟写的内容逻辑区别很大,一个是程序,一个是Sql,因此这里稍作区分。

Hadoop中的数据倾斜主要表现在、ruduce阶段卡在99.99%,一直99.99%不能结束。

这里如果详细的看日志或者和监控界面的话会发现:

  • 有一个多几个reduce卡住
  • 各种container报错OOM
  • 读写的数据量极大,至少远远超过其它正常的reduce

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

经验:Hive的数据倾斜,一般都发生在Sql中Group和On上,而且和数据逻辑绑定比较深。

二、Spark中的数据倾斜

Spark中的数据倾斜也很常见,这里包括Spark Streaming和Spark Sql,表现主要有下面几种:

  • Executor lost,OOM,Shuffle过程出错
  • Driver OOM
  • 单个Executor执行时间特别久,整体任务卡在某个阶段不能结束
  • 正常运行的任务突然失败

补充一下,在Spark streaming程序中,数据倾斜更容易出现,特别是在程序中包含一些类似sql的join、group这种操作的时候。因为Spark Streaming程序在运行的时候,我们一般不会分配特别多的内存,因此一旦在这个过程中出现一些数据倾斜,就十分容易造成OOM。

0x03 数据倾斜的原理

一、数据倾斜产生的原因

我们以Spark和Hive的使用场景为例。他们在做数据运算的时候会设计到,countdistinct、group by、join等操作,这些都会触发Shuffle动作,一旦触发,所有相同key的值就会拉到一个或几个节点上,就容易发生单点问题。

二、万恶的shuffle

Shuffle是一个能产生奇迹的地方,不管是在Spark还是Hadoop中,它们的作用都是至关重要的。关于Shuffle的原理,这里不再讲述,看看Hadoop相关的论文或者文章理解一下就ok。这里主要针对,在Shuffle如何产生了数据倾斜。

Hadoop和Spark在Shuffle过程中产生数据倾斜的原理基本类似。如下图。

大部分数据倾斜的原理就类似于下图,很明了,因为数据分布不均匀,导致大量的数据分配到了一个节点。

三、从数据角度来理解数据倾斜

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

  • user(用户信息表):userid,register_ip
  • ip(IP表):ip,register_user_cnt

这可能是两个不同的人开发的数据表,如果我们的数据规范不太完善的话,会出现一种情况,user表中的register_ip字段,如果获取不到这个信息,我们默认为null,但是在ip表中,我们在统计这个值的时候,为了方便,我们把获取不到ip的用户,统一认为他们的ip为0。

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

四、从业务计角度来理解数据倾斜

数据往往和业务是强相关的,业务的场景直接影响到了数据的分布。

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

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

0x04 如何解决

数据倾斜的产生是有一些讨论的,解决它们也是有一些讨论的,本章会先给出几个解决数据倾斜的思路,然后对Hadoop和Spark分别给出一些解决数据倾斜的方案。

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

一、几个思路

解决数据倾斜有这几个思路:

  1. 业务逻辑,我们从业务逻辑的层面上来优化数据倾斜,比如上面的例子,我们单独对这两个城市来做count,最后和其它城市做整合。
  2. 程序层面,比如说在Hive中,经常遇到count(distinct)操作,这样会导致最终只有一个reduce,我们可以先group 再在外面包一层count,就可以了。
  3. 调参方面,Hadoop和Spark都自带了很多的参数和机制来调节数据倾斜,合理利用它们就能解决大部分问题。

二、从业务和数据上解决数据倾斜

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

数据分布不均匀:

前面提到的“从数据角度来理解数据倾斜”和“从业务计角度来理解数据倾斜”中的例子,其实都是数据分布不均匀的类型,这种情况和计算平台无关,我们能通过设计的角度尝试解决它。

  • 有损的方法:
    • 找到异常数据,比如ip为0的数据,过滤掉
  • 无损的方法:
    • 对分布不均匀的数据,单独计算
    • 先对key做一层hash,先将数据打散让它的并行度变大,再汇集
  • 数据预处理

三、Hadoop平台的优化方法

列出来一些方法和思路,具体的参数和用法在官网看就行了。

  1. mapjoin方式
  2. count distinct的操作,先转成group,再count
  3. 万能膏药:hive.groupby.skewindata=true
  4. left semi jioin的使用
  5. 设置map端输出、中间结果压缩。(不完全是解决数据倾斜的问题,但是减少了IO读写和网络传输,能提高很多效率)

四、Spark平台的优化方法

列出来一些方法和思路,具体的参数和用法在官网看就行了。

  1. mapjoin方式
  2. 设置rdd压缩
  3. 合理设置driver的内存
  4. Spark Sql中的优化和Hive类似,可以参考Hive

0xFF 总结

数据倾斜的坑还是很大的,如何处理数据倾斜是一个长期的过程,希望本文的一些思路能提供帮助。

文中一些内容没有细讲,比如Hive Sql的优化,数据清洗中的各种坑,这些留待后面单独的分享,会有很多的内容。

另外千亿级别的数据还会有更多的难点,不仅仅是数据倾斜的问题,这一点在后面也会有专门的分享。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 肉眼品世界 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据倾斜?几招把你安排的板板正正的!
一般都发生在Sql中group by和join on上,而且和数据逻辑绑定比较深。
不吃西红柿
2022/09/19
2840
数据倾斜?几招把你安排的板板正正的!
大数据常见问题:数据倾斜
一般都发生在Sql中group by和join on上,而且和数据逻辑绑定比较深。
不吃西红柿
2022/07/29
8330
大数据常见问题:数据倾斜
Spark 数据倾斜及其解决方案
本文从数据倾斜的危害、现象、原因等方面,由浅入深阐述Spark数据倾斜及其解决方案。
2020labs小助手
2019/12/30
1.1K0
这个面试问题很难么 | 如何处理大数据中的数据倾斜
数据倾斜是我们在处理大数据量问题时绕不过去的问题,也是在面试中几乎必问的考点。 正常的数据分布理论上都是倾斜的,就是我们所说的'二八原理':80%的财富集中在20%的人手中, 80%的用户只使用20%的功能 , 20%的用户贡献了80%的访问量。 简单来说数据倾斜就是数据的key 的分化严重不均,造成一部分数据很多,一部分数据很少的局面。
王知无-import_bigdata
2019/11/18
1.2K0
【专题】spark/MR 数据倾斜优化
原理:在进行shuffle的时候,须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条数据,但是个别key却对应了100万条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整个Spark作业的运行进度是由运行时间最长的那个task决定的。
艾利
2022/08/30
2.1K0
【rainbowzhou 面试5/101】技术提问--大数据测试中遇到的问题?举例说明一下
上篇【rainbowzhou 面试4/101】技术提问中,我着重说明了ETL测试中常见的两种测试场景,以及相应地测试方法。那么在实际大数据项目过程中,会遇到哪些问题呢?本篇就带你了解大数据测试过程中遇到的一些经典测试问题,并针对问题如何解决及经验教训进行相应说明,希望对大家有所帮助。
rainbowzhouj
2023/03/16
3980
浅谈离线数据倾斜
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了
京东技术
2023/08/22
6000
浅谈离线数据倾斜
Spark之数据倾斜调优
有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能。
王知无-import_bigdata
2019/06/03
6200
Hive数据倾斜问题总结
本文介绍了Hive数据倾斜问题及其解决方案,包括使用Combine、Map端Join、自定义Partitioner等方法。同时,还介绍了如何诊断数据倾斜以及Hive数据倾斜的解决方案。通过合理的设计和优化,可以有效地解决Hive数据倾斜问题,提高数据处理的效率。
程裕强
2018/01/02
5K0
一文教你快速解决Spark数据倾斜!
Spark 中的数据倾斜问题主要指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题。
不温卜火
2020/10/28
6490
一文教你快速解决Spark数据倾斜!
2020年最新Spark企业级面试题【下】
上篇文章给大家分享了前10个spark的企业面试题2020年最新Spark企业级面试题【上】,今天后续来了,来分享剩下的那个几个面试题。也祝大家找到自己喜欢的工作,一起加油,编写不易 请给老哥一个一键三连吧。
大数据老哥
2021/02/04
4830
2020年最新Spark企业级面试题【下】
Spark性能调优04-数据倾斜调优
数据倾斜的原理很简单:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条数据,但是个别key却对应了100万条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整个Spark作业的运行进度是由运行时间最长的那个task决定的。
CoderJed
2018/09/13
1.5K0
Spark性能调优04-数据倾斜调优
【Spark篇】---Spark解决数据倾斜问题
数据倾斜问题是大数据中的头号问题,所以解决数据清洗尤为重要,本文只针对几个常见的应用场景做些分析 。
LhWorld哥陪你聊算法
2018/09/13
9150
【Spark篇】---Spark解决数据倾斜问题
Spark如何定位数据倾斜
在大数据处理过程中常常出现数据倾斜(Data Skew)。那么,数据倾斜会造成什么问题呢?为什么要处理数据倾斜?
木野归郎
2020/06/12
3.1K0
BigData | 一文带你搞清楚"数据倾斜"(上)
我们在用hive取数的时候,有的时候只是跑一个简单的join语句,但是却跑了很长的时间,有的时候我们会觉得是集群资源不够导致的,但是很大情况下就是出现了"数据倾斜"的情况。
Sam Gor
2019/08/21
9670
基于MapReduce的Hive数据倾斜场景以及调优方案
通常认为当所有的map task全部完成,并且99%的reduce task完成,只剩下一个或者少数几个reduce task一直在执行,这种情况下一般都是发生了数据倾斜。
火之高兴
2024/07/25
3310
Hive千亿级数据倾斜解决方案(好文收藏)
数据倾斜是分布式系统不可避免的问题,任何分布式系统都有几率发生数据倾斜,但有些小伙伴在平时工作中感知不是很明显。这里要注意本篇文章的标题—“千亿级数据”,为什么说千亿级,因为如果一个任务的数据量只有几百万,它即使发生了数据倾斜,所有数据都跑到一台机器去执行,对于几百万的数据量,一台机器执行起来还是毫无压力的,这时数据倾斜对我们感知不大,只有数据达到一个量级时,一台机器应付不了这么多数据,这时如果发生数据倾斜,最后就很难算出结果。
五分钟学大数据
2021/04/29
1K0
Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势
原创文章,转载请务必将下面这段话置于文章开头处。 本文转发自技术世界,原文链接 http://www.jasongj.com/spark/skew/ 摘要 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitioner,使用Map侧Join代替Reduce侧Join,给倾斜Key加上随机前缀等。 为何要处理数据倾斜(Data Skew) 什么是数据倾斜 对Spark/Hadoop这样的大数据系统来讲,数据量大并不可怕,可怕的是数据
Jason Guo
2018/06/11
2.2K0
BigData | 一文带你搞清楚"数据倾斜"
我们在用hive取数的时候,有的时候只是跑一个简单的join语句,但是却跑了很长的时间,有的时候我们会觉得是集群资源不够导致的,但是很大情况下就是出现了"数据倾斜"的情况。
Sam Gor
2019/07/08
7390
好文分享|一文带你搞清楚什么是“数据倾斜”
我们在用hive取数的时候,有的时候只是跑一个简单的join语句,但是却跑了很长的时间,有的时候我们会觉得是集群资源不够导致的,但是很大情况下就是出现了"数据倾斜"的情况。
石晓文
2019/12/04
1K0
推荐阅读
相关推荐
数据倾斜?几招把你安排的板板正正的!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档