【调优】一个 Spark 任务某天突然变慢怎么解决

  今天开始一个新的主题,打算写一下工作中可能会碰到的问题,包括前面文章提到的如何将串行任务改为并行,也打算写在这个系列里面。

  先来看一到面试题:一个任务,平常 10 - 20 分钟就完成了,今天 1 - 2 小时都没完成,我们需要怎么解决?这个面试题在工作中也挺常见的。公司里面每天晚上都会有一个人值班,大数据任务延迟产出就会报警(昨天文章提过,数据质量,很重要的一部分就是最晚产出时间),半夜也要起来排查问题,除了有时候是集群硬件出问题或者大数据组件出问题,很多时候还是得从任务和数据上进行排查。至于处理方法,前面也有几篇文章进行铺垫,那就是看 Spark Web UI。

【Spark】Spark Web UI - Jobs
【Spark】Spark Web UI - Stages
【Spark】Spark Web UI - SQL

处理的两个方向大概就是:

  • 看 Spark Web UI,观察每个 Stage 的执行时间和平常是否有区别,执行时间是否超过以前的平均执行时间。
  • 看 Spark 日志,看是否有 error,网络、磁盘空间等是否存在异常。

第一种主要是看数据倾斜,第二种主要是看硬件是否有问题。我们今天主要讨论数据倾斜。因为磁盘等硬件有问题或者大数据组件有问题可以直接找基础设施团队的人来解决,不用数据开发来解决。

1.数据倾斜发生的现象

可能有以下两种表现:

  • Spark作业的大部分 task 都执行迅速,只有有限的几个 task 执行的非常慢,此时可能出现了数据倾斜,作业可以运行,但是运行得非常慢;
  • Spark 作业的大部分 task 都执行迅速,但是有的 task 在运行过程中会突然报出 OOM,反复执行几次都在某一个 task 报出 OOM 错误,此时可能出现了数据倾斜,作业无法正常运行。

2.数据倾斜发生的原理

在进行 shuffle 的时候,必须将各个节点上相同的 key 拉取到某个节点上的一个 task 来进行处理,比如按照 key 进行聚合或 join 等操作。此时如果某个 key 对应的数据量特别大的话,就会发生数据倾斜。

3.定位数据倾斜发生的代码

学习上面的 Spark Web UI 文章,了解如何使用之后,可以采用下面的排查过程:

  • 看 Spark Web UI 的 Jobs,看程序卡在哪里。
  • 一般会有好几个 job,分位 Completed Jobs 和 Active Jobs,Active Jobs 下面就是执行较慢的 job。
  • 点开正在执行的 job,观察 Stage 下面的 task,有一个 task 执行特别慢。
  • 比较每个 task 的数据量,通过 Spark Web UI,我们可以查询到每个任务处理的数据量大小和需要的执行时间。如果这个任务处理的数据量和需要的执行时间都明显多于其他任务,就说明很可能出现了数据倾斜。

至于 job、stage、task 的关系,可以看之前的文章。

4.数据倾斜的处理

处理方法很多,有从业务上的,有从代码上的,也有从参数设置上的。

感觉这篇文章写的不错:https://www.doc88.com/p-2754837325472.html?r=1

欢迎点击此处关注公众号。

猜你喜欢

转载自blog.csdn.net/weixin_45545090/article/details/125359548