关于数据倾斜的深度探讨?

温馨提示:

(内容较多,为避免读者逻辑混乱,请严格按照大纲目录逻辑浏览)

一、啥是数据倾斜?

        数据倾斜是指在分布式数据处理系统(如 Hadoop、Spark)中,数据分布不均衡导致某些节点(或任务)处理的数据量远远大于其他节点(或任务)的现象。这会导致负载不均衡,降低整个系统的性能。具体来说,数据倾斜会引发以下问题:

  1. 任务执行时间长:由于部分节点处理的数据量过大,这些节点上的任务执行时间会远长于其他节点,导致整体作业时间延长。
  2. 资源浪费:大部分节点在完成其任务后需要等待少数节点完成任务,造成资源的低效利用。
  3. 内存溢出:处理数据量过大的节点可能会因为内存不足而导致任务失败或崩溃。

二、数据倾斜的表现

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)业务数据量激增
  • 44
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值