大数据面试题 —— Spark数据倾斜及其解决方案

news/2024/9/23 7:21:22/

目录

  • 1 调优概述
  • 2 数据倾斜发生时的现象
  • 3 数据倾斜发生的原理
  • 4 如何定位导致数据倾斜的代码
    • 4.1 某个 task 执行特别慢的情况
    • 4.2 某个 task 莫名其妙内存溢出的情况
  • 5 查看导致数据倾斜的 key 的数据分布情况
  • 6 数据倾斜的解决方案
    • 6.1 使用 Hive ETL 预处理数据
    • 6.2 过滤少数导致倾斜的 key
    • 6.3 提高 shuffle 操作的并行度
    • 6.4 两阶段聚合(局部聚合+全局聚合)
    • 6.5 将 reduce join 转为 map join
    • 6.6 采样倾斜 key 并分拆 join 操作
    • 6.7 使用随机前缀和扩容 RDD 进行 join

1 调优概述


有的时候,我们可能会遇到大数据计算中一个最棘手的问题 —— 数据倾斜,此时 Spark 作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决
不同类型的数据倾斜问题,以保证 Spark 作业的性能。

2 数据倾斜发生时的现象


绝大多数 task 执行得都非常快,但个别 task 执行极慢。比如,总共有 1000 个
task,997 个 task 都在 1 分钟之内执行完了,但是剩余两三个 task 却要一两个
小时。这种情况很常见。原本能够正常执行的 Spark 作业,某天突然报出 OOM(内存溢出)异常,观察异常栈,是我们写的业务代码造成的。这种情况比较少见。

3 数据倾斜发生的原理


数据倾斜的原理很简单:在进行 shuffle 的时候,必须将各个节点上相同的 key
拉取到某个节点上的一个 task 来进行处理,比如按照 key 进行聚合或 join 等操
作。此时如果某个 key 对应的数据量特别大的话,就会发生数据倾斜。比如大部分 key 对应 10 条数据,但是个别 key 却对应了 100 万条数据,那么大部分 task
可能就只会分配到 10 条数据,然后 1 秒钟就运行完了;但是个别 task 可能分配
到了 100 万数据,要运行一两个小时。因此,整个 Spark 作业的运行进度是由运
行时间最长的那个 task 决定的。

因此出现数据倾斜的时候,Spark 作业看起来会运行得非常缓慢,甚至可能因为
某个 task 处理的数据量过大导致内存溢出。

下图就是一个很清晰的例子:hello 这个 key,在三个节点上对应了总共 7 条数
据,这些数据都会被拉取到同一个 task 中进行处理;而 world 和 you 这两个 key
分别才对应 1 条数据,所以另外两个 task 只要分别处理 1 条数据即可。此时第
一个 task 的运行时间可能是另外两个 task 的 7 倍,而整个 stage 的运行速度也
由运行最慢的那个 task 所决定。

在这里插入图片描述

4 如何定位导致数据倾斜的代码


数据倾斜只会发生在 shuffle 过程中。常用的并且可能会触
发 shuffle 操作的算子:distinct、groupByKey、reduceByKey、aggregateByKey、
join、cogroup、repartition 等。出现数据倾斜时,可能就是你的代码中使用
了这些算子中的某一个所导致的。

4.1 某个 task 执行特别慢的情况


首先要看的,就是数据倾斜发生在第几个 stage 中

  • 如果是用 yarn-client 模式提交,那么本地是直接可以看到 log 的,可以在 log 中找到当前运行到了第几个stage;
  • 如果是用 yarn-cluster 模式提交,则可以通过 Spark Web UI 来查看当前运行到了第几个 stage。

补充知识:driver 主要负责管理整个集群的作业任务调度,executor 是一个JVM进程,专门用于计算的节点。在 yarn-client 模式下,driver运行在客户端,在 yarn-cluster 模式下,driver运行在yarn集群。

此外,无论是使用 yarn-client 模式还是 yarn-cluster 模式,我们都可以在
Spark Web UI 上深入看一下当前这个 stage 各个 task 分配的数据量,从而进一
步确定是不是 task 分配的数据不均匀导致了数据倾斜。

比如下图中,倒数第三列显示了每个 task 的运行时间。明显可以看到,有的 task
运行特别快,只需要几秒钟就可以运行完;而有的 task 运行特别慢,需要几分
钟才能运行完,此时单从运行时间上看就已经能够确定发生数据倾斜了。此外,
倒数第一列显示了每个 task 处理的数据量,明显可以看到,运行时间特别短的
task 只需要处理几百 KB 的数据即可,而运行时间特别长的 task 需要处理几千
KB 的数据&


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

相关文章

【AIGC调研系列】大型语言模型如何减少幻觉生成

在解读大型语言模型(LLMs)中的长格式事实性问题时,我们首先需要认识到这些模型在生成内容时可能会产生与既定事实不一致的情况,这种情况通常被称为“幻觉”[2][3]。这种现象不仅可能导致信息的误传,还可能对社会造成误…

【OpenCV】(一)wechat_qrcode检测二维码

一、注意: opencv-4.8.0之前的版本wechat_qrcode检测二维码是矩形检测; opencv-4.8.0的版本wechat_qrcode检测二维码是关键点检测; 二、C代码 代码目前是通用的(仅在opencv-4.5.5、opencv-4.8.1上测试过)&#xff1…

Qt tcp通信(客户端+服务器一对一)

学习自《Qt5.9 C开发指南》 服务器端: QTcpServer *tcpServer; //TCP服务器 tcpServernew QTcpServer(this); connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection())); 当有新的客户端接入时,QTcpServer内部的incomingConnectio…

Linux 根据提交记录生成补丁及新旧文件对比

#!/bin/bash#解决/bin/bash^M: bad interpreter: Text file busy #sed -i s/\r$// test1.shCMD1$1 CMD2$2 CMD3$3 echo "CMD1 > $CMD1" echo "CMD2 > $CMD2" echo "CMD3 > $CMD3" # 运行时的入参 CMD1提交记录1 CMD2提交记录2 CMD3输出…

代码随想录算法训练营第五十六天|583.两个字符串的删除操作、72.编辑距离

文档链接:https://programmercarl.com/ LeetCode583.两个字符串的删除操作 题目链接:https://leetcode.cn/problems/delete-operation-for-two-strings/ 思路:dp[i][j]:使以i-1为尾的word1和以j-1为尾的word2相同的最小步数 当…

StarRocks x Paimon 构建极速实时湖仓分析架构实践

Paimon 介绍 Apache Paimon 是新一代的湖格式,可以使用 Flink 和 Spark 构建实时 Lakehouse 架构,以进行流式处理和批处理操作。Paimon 创新性地使用 LSM(日志结构合并树)结构,将实时流式更新引入 Lakehouse 架构中。 …

Django-admin组件

Django-admin组件 admin是django中提供的一套可视化工具:用于对ORM中定义的表进行增删改查。 1 概览 在django项目启动时,自动找到注册到admin中的所有model中定义的类,然后为这些类生成一系列的URL和视图函数,实现基本增删改查…

FR-TSN4206获得“时间敏感网络产业链名录计划”测试认证证书,TSN交换机助力智能工业发展

TSN技术,即时间敏感网络技术,已成为智能工业、自动驾驶等领域的核心。它通过时钟同步、数据调度等功能,确保低延迟、高可靠性的数据传输。 为推动TSN技术在我国的发展,工业互联网产业联盟联合多家单位启动了“时间敏感网络产业链名…