关于数据倾斜

news/2024/12/29 12:34:08/

1、数据倾斜表现

1.1 hadoop中的数据倾斜表现

  • 有一个多几个Reduce卡住,卡在99.99%,一直不能结束。
  • 各种container报错OOM
  • 异常的Reducer读写的数据量极大,至少远远超过其它正常的Reducer
  • 伴随着数据倾斜,会出现任务被kill等各种诡异的表现。

1.2 hive中数据倾斜

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

1.3 Spark中的数据倾斜

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

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

2、数据倾斜产生原因

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

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

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

1)key分布不均匀;

2)建表时考虑不周

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

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

    ip(IP表):ip,register_user_cnt

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

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

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

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

3)业务数据激增

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

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

3、解决数据倾斜思路

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

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)从业务和数据上解决数据倾斜

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

一个原则:尽早过滤每个阶段的数据量。

  1. 数据有损的方法:找到异常数据,比如ip为0的数据,过滤掉。
  2. 数据无损的方法:对分布不均匀的数据,单独计算。
  3. hash:先对key做一层hash,先将数据随机打散让它的并行度变大,再汇聚。
  4. 数据预处理:就是先做一层数据质量处理,类似于数据仓库维度建模时,底层先处理数据质量。

http://www.ppmy.cn/news/60310.html

相关文章

视觉震撼的数据可视化示例

众所周知,数据可以非常强大——当你真正理解它告诉你什么时。 数据和信息可视化(数据可视化或信息可视化)是对大量复杂的定量、定性数据、信息进行设计和创建易于沟通、易于理解的图形或视觉表示的实践,在静态、动态或交互式视觉项目的帮助下&#xff0…

UE动画状态机的事件触发顺序测试

正常A状态过渡到B状态的事件顺序: 整个流程为: 调用B状态的On Become Relevant事件调用B状态的On Update事件调用A状态的Left State Event事件调用B状态的Entered State Event事件调用B状态的Start Transition Event事件调用B状态的End Transition Even…

git代码管理操作全流程之一: 提交、更新、解决冲突、合并等操作

使用 Git 提交代码步骤 Step 1,检查自己的代码改动。执行 git commit -am"" 提交到本地仓库。注意写好准确的描述信息。 Step 2,执行 git pull --rebase,将当前分支的代码更新到远程仓库的最新版本。如果有冲突解决冲突。解决git…

几种常见时间复杂度实例分析

多项式量级 常量阶 O(1) 对数阶 O(logn) 线性阶 O(n) 线性对数阶 O(nlogn) 平方阶O(n2 ),立方阶O(n3 )...k次方阶O(nk) 非多项式量级(NP(Non-Deterministic Polynomial,非确定多项式)问题) 指数阶O(2n) 阶乘阶…

“裸奔”时代下,我们该如何保护网络隐私?

当我们在互联网上进行各种活动时,我们的个人信息和数据可能会被攻击者窃取或盗用。为了保护我们的隐私和数据安全,以下是一些实用的技巧和工具,可以帮助您应对网络攻击、数据泄露和隐私侵犯的问题: 使用强密码:使用独特…

基于jeecgboot的OA日程安排开发(一)

日程安排也是OA里的一项重要功能,所以基于jeecgboot开发这个日程安排。 日程安排主要涉及以下几个方面: 1、数据库方面,主要是分日历与日程 日历可以分个人日历与工作日历,一般情况下,个人日历只给自己查看&#xff0…

Nacos原理(注册中心和配置中心)

服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化…

从零开始带你开发橙光游戏AVG框架(仿 葬花 )

来源 从零开始带你开发橙光游戏AVG框架【55课数 收费】 从零开始带你开发橙光游戏AVG框架 unity教程【16课数 免费】 介绍 QuickSheet使用 bug 包报错 可能是我换了untiy版本的原因 Manual sovle bug ICSharpCode.SharpZipLib重复 导了一个文件夹,有自己的库…