标签:倾斜 探讨 任务 user key 深度 数据 节点
温馨提示:
(内容较多,为避免读者逻辑混乱,请严格按照大纲目录逻辑浏览)
一、啥是数据倾斜?
数据倾斜是指在分布式数据处理系统(如 Hadoop、Spark)中,数据分布不均衡导致某些节点(或任务)处理的数据量远远大于其他节点(或任务)的现象。这会导致负载不均衡,降低整个系统的性能。具体来说,数据倾斜会引发以下问题:
- 任务执行时间长:由于部分节点处理的数据量过大,这些节点上的任务执行时间会远长于其他节点,导致整体作业时间延长。
- 资源浪费:大部分节点在完成其任务后需要等待少数节点完成任务,造成资源的低效利用。
- 内存溢出:处理数据量过大的节点可能会因为内存不足而导致任务失败或崩溃。
二、数据倾斜的表现
a)hadoop中数据倾斜的表现
(1)有⼀个或多个reduce任务卡住,卡在99.99%, ⼀直不能结束。
(2)各种container报错OOM。
(3)异常的Reducer读写的数据量极⼤,⾄少远远超过其他正常的Reducer。
(4)伴随着数据倾斜,会出现任务被kill 等各种诡异的表现。
b)Hive中的数据倾斜
⼀般都发⽣在 Sql中group by 和 Join on 上,⽽且和数据逻辑绑定⽐较深。
c)Spark 中的数据倾斜
Spark中的数据倾斜,包括Spark Streaming 和SparkSQL,主要表现有以下⼏种:
Executor lost, OOM,Shuffle过程出错;Driver OOM;单个Executor 执⾏时间特别久 ,整体任务卡在某个阶段 不能结束;正常运⾏的任务突然失败。
三、数据倾斜产⽣的原因及解决⽅法
a)key值分布不均
这包括空值以及单⼀key值或⼏个key值过多,这样的情况我们⼀般是打散计算,空值过滤或者将为空 的 key 转变为字符串加随机数或纯随机数,将因空值⽽造成倾斜的数据分不到多个 Reducer。
b)建表时考虑不周
例⼦:⽐如我公司刚开始是就有两张表,⼀张是user⽤户表,⼀张是log⽇志表,为两个不同部⻔创 建的,两表关联字段为user_id,但user表的user_id 为 int类型,log表⾥的user_id 为string类型, 这时候直接关联的话就会产⽣数据倾斜,那我们可以使⽤cast 函数间int类型的字段转为 string类型。
c)业务数据量激增
例⼦
标签:倾斜,
探讨,
任务,
user,
key,
深度,
数据,
节点
From: https://blog.csdn.net/weixin_49811843/article/details/139918487