Apache Spark_解决生产环境数据倾斜问题方案及思路

问题背景

在大数据处理中,数据倾斜是指在分布式计算中,某些节点处理的数据量远大于其他节点,导致计算资源的不均衡使用,从而影响整体的计算性能。本文将介绍如何使用Apache Spark(特别是Scala API)处理数据倾斜问题。

我司在处理超大数据量级别数据时,经常出现数据倾斜的情况,因此基本上都是看yarn的执行情况,本来10分钟能执行完毕的,拖到半小时甚至一个小时的情况,甚至再有的数据两三个小时跑完的,半天都跑不完的情况。看Excutor往往卡在几个节点上的数据超大,比如几十个G,其他节点500多M左右这种。基本上就是数据倾斜了。

针对以上场景,我进行数据倾斜的常用办法及解决办法。

数据倾斜导致的问题

  1. 资源利用不均衡:少数节点负载过高,而其他节点闲置或负载较低。

  2. 任务执行时间变长:负载高的节点需要处理更多数据,导致任务执行时间变长,成为整个作业的瓶颈。

  3. 内存不足或 OOM(Out of Memory):单个节点处理的数据量过大,可能导致内存不足,甚至触发 OOM 错误。

  4. 作业失败:如果倾斜严重,可能导致任务失败,进而导致整个作业失败。

如何判断数据倾斜?

  1. Spark UI 观察

    • 在 Spark UI 的 Stages 页面中,查看每个任务的执行时间。

    • 如果某些任务的执行时间明显比其他任务长,且输入数据量(Input Size)远大于其他任务,则可能存在数据倾斜。

    • Executors 页面中,查看每个 Executor 的数据处理量,如果某些 Executor 处理的数据量远大于其他 Executor,则可能存在数据倾斜。

  2. 日志分析

    • 查看日志中是否有 OOM 错误或任务失败的信息。

    • 如果有大量任务在少数节点上失败或重试,则可能存在数据倾斜。

  3. 数据分布统计

    • 对数据进行统计,查看某些 key 的数据量是否远大于其他 key。

    • 例如,使用 groupByKeycountByKey 统计每个 key 的数据量。

数据倾斜的解决办法(针对我开头说的情况)

1. 数据重分区(Repartition)

1.如果数据倾斜是由于分区不均匀导致的,可以通过增加分区数来使数据分布更均匀。

Scala 复制代码
// 增加分区数,这个你得看情况啊
val repartDataDF = dataDF.repartition(1000)

2. 随机前缀(Salting,也就是我们常说的加盐!!)

1.如果数据倾斜是由于某些 key 的数据量过大导致的,可以为这些 key 添加随机前缀,将数据分散到多个分区。

Scala 复制代码
val saltedData = dataDF.map(row => {
  val key = row.getString(0)
  // 添加随机前缀
  val randomSuffix = scala.util.Random.nextInt(10) 
  (s"$key-$randomSuffix", row)
})

3.广播变量(Broadcast Variables)

1.如果数据倾斜是由于小表连接大表导致的,可以将小表广播到每个节点。

Scala 复制代码
val broadcastSmallDataDF = spark.sparkContext.broadcast(smallDataDF.collect().toMap)

val resultDF = largeDataDF.mapPartitions(partition => {
  val smallDataMap = broadcastSmallData.value
  partition.map(row => (row, smallDataMap.get(row.getString(0))))
})

4.调整并行度

1.如果数据倾斜是由于分区数不足导致的,可以调整并行度。

Scala 复制代码
//我一搬都是这么做的
//注意哈,分区数最好是2~3倍的ecutor个数乘以excuor核数
spark.conf.set("spark.default.parallelism", "1000")

完毕!当然,其他的小表广播也很常见,看生产实际用啥吧,后续再补充

相关推荐
一只栖枝5 小时前
华为 HCIE 大数据认证中 Linux 命令行的运用及价值
大数据·linux·运维·华为·华为认证·hcie·it
喂完待续9 小时前
Apache Hudi:数据湖的实时革命
大数据·数据仓库·分布式·架构·apache·数据库架构
青云交9 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
还是大剑师兰特15 小时前
Flink面试题及详细答案100道(1-20)- 基础概念与架构
大数据·flink·大剑师·flink面试题
yh云想17 小时前
《从入门到精通:Kafka核心原理全解析》
分布式·kafka
1892280486118 小时前
NY243NY253美光固态闪存NY257NY260
大数据·网络·人工智能·缓存
武子康19 小时前
大数据-70 Kafka 日志清理:删除、压缩及混合模式最佳实践
大数据·后端·kafka
CCF_NOI.20 小时前
解锁聚变密码:从微观世界到能源新未来
大数据·人工智能·计算机·聚变
杨荧21 小时前
基于Python的电影评论数据分析系统 Python+Django+Vue.js
大数据·前端·vue.js·python
数据智研1 天前
【数据分享】上市公司创新韧性数据(2007-2023)
大数据·人工智能