记录一篇如何查询数据倾斜的文章。

作者:等等在学习
链接:https://www.zhihu.com/question/528641357/answer/2536382193
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

前言

我们在写sql的时候经常发现读取数据不多,但是代码运行时间异常长的情况,这通常是发生了数据倾斜现象。数据倾斜现象本质上是因为数据中的key分布不均匀,大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,从而拉慢了整个计算过程速度。

本文将介绍如何通过日志分析,判断数据中的哪个key分布不均,从而导致了数据倾斜问题。

任务是否发生了倾斜

hive判断

hive运行日志

当我们在hive作业运行日志中,发现reduce任务长时间卡在99%时,即可判断任务发生了数据倾斜。

其原理是这样的:

分布式处理逻辑

分布式处理实际上是按数据中的key将数据分摊到多个机器上运行,假如出现了数据倾斜问题,如上图。可以想象,当1min过去后,我们的任务完成率只有67%,并且在接下来的9min时间内,任务完成率将持续卡在67%上。因此,当我们发现任务完成率长时间卡在99%时,即判断发生了数据倾斜。

spark判断

spark UI界面

我们进入spark UI界面,发现第2个job的运行时间长达1.8h,而其他job运行时间不超过2min,判断该job有可能发生数据倾斜。

进一步分析job,可以看到该job只存在一个stage(9)

stage界面

进一步分析stage,发现不管是duration还是shuffle的数据量,max和median都有明显的差距,可以肯定是job(5)的stage(9)发生倾斜。

寻找倾斜key

当我们发现任务倾斜了,自然而然就希望找到倾斜的key,从而修复数据倾斜的现象。当然,这部分我也会分为hive和spark两个部分进行介绍。

hive识别

step1:确认是哪个Job出现了严重的倾斜问题

hive运行日志

通过搜索tracking的方式,我们发现第3个job的reduce任务一直卡在99%上,判断其发生了倾斜问题。

step2:进入相应的Tracking URL,查看SUCCESSFUL REDUCE

很明显,其他的taske都在2min之内完成,只有000000_1需要耗费1个多小时的时间完成。

另外注意,这里面需要排除一种特殊情况。有时候,某个task执行的节点可能有问题,导致任务跑的特别慢。这个时候,mapreduce的推测执行,会重启一个任务。如果新的任务在很短时间内能完成,通常则是由于task执行节点问题导致的个别task慢。如果推测执行后的task执行任务也特别慢,那更能说明该task可能会有倾斜问题。

step3:进入log日志,查看syslog

hive的syslog日志

可以从log日志中看到,该job仅仅运行了file和group操作后,就将数据写入至hive表中。那么,我们可以确认的是,该job运行的是最后一个group by操作。

step4:对照运行sql

运行sql

我们可以看到,在group by阶段,count(distinct)的出现造成了数据倾斜。

spark识别

step1:找到该任务运行的stage

spark UI界面

我们看到该运行任务,可以发现第2个job运行时间长达1.8h,远大于其他job,可以判定倾斜发生在job(5)。

step2:点击SQL,查看Details for Query

Details for Query

可以从sort time total/peak memory total/spill size total看出来,左表的package_name分布不均匀,此时可以通过查看scan parquet了解具体是哪张表。

step3:对照运行sql

运行sql代码

查询package_name的分布情况

select package_name,count(1) as cnt from test1 where date=20220619 group by package_name order by cnt desc limit 10;

package_name的分布验证了我们的猜想,test1.package_name造成了数据倾斜

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Matplotlib是Python中最流行的数据可视化库之一。它可以绘制各种类型的图表,从简单的线图到复杂的三维图表。与其他绘图库相比,Matplotlib具有许多优点,例如易于学习和使用、广泛的文档和社区支持等等。本篇博客将介绍Matplotlib的基础知识和常用技巧。 Matplotlib基础知识: Matplotlib是一个面向对象的绘图库,它具有许多对象和方法。下面是Matplotlib对象的一些基本概念: 1. Figure:画布,它是最外层的容器。 2. Axes:坐标轴,它是Figure中的一个子对象。 3. Axis:X轴或Y轴,它是Axes对象的一部分。 4. Artist:图表中的所有部分,例如标题、标签、线条等等,都是Artist对象的实例。 要使用Matplotlib绘制图表,首先必须创建一个Figure对象,然后在其中添加一个或多个Axes对象。接下来,使用Axes对象的方法来添加Artist对象。 下面是一个简单的代码示例: ```python import matplotlib.pyplot as plt # 创建Figure和Axes对象 fig, ax = plt.subplots() # 添加Artist对象 ax.plot([1, 2, 3, 4], [1, 4, 2, 3]) # 显示图表 plt.show() ``` 在这个例子中,我们创建了一个Figure对象和一个Axes对象,然后在Axes对象中添加了一条线。最后,我们调用show()函数来显示图表。 常用技巧: 1. 设置图表样式: Matplotlib提供了许多方法来设置图表样式,例如设置标题、标签、颜色、线型、线宽等等。可以通过调用Axes对象的方法来实现。例如: ```python # 设置标题 ax.set_title('My First Matplotlib Chart') # 设置X轴标签 ax.set_xlabel('X Label') # 设置Y轴标签 ax.set_ylabel('Y Label') # 设置线条颜色 ax.plot(x, y, color='r') # 设置线条线型 ax.plot(x, y, linestyle='--') # 设置线条线宽 ax.plot(x, y, linewidth=2) ``` 2. 绘制多个子图: Matplotlib可以在一个Figure对象中绘制多个子图。可以使用subplot()函数来创建子图,该函数将返回一个Axes对象,在其中添加Artist对象。例如: ```python # 创建一个2x2的子图 fig, axs = plt.subplots(2, 2) # 在第一个子图中绘制一条线 axs[0, 0].plot(x, y) # 在第二个子图中绘制散点图 axs[0, 1].scatter(x, y) # 在第三个子图中绘制条形图 axs[1, 0].bar(x, y) # 在第四个子图中绘制饼图 axs[1, 1].pie(y) ``` 3. 保存图表: Matplotlib可以将图表保存为PNG、PDF、SVG等格式。可以使用savefig()函数来保存图表,该函数将文件路径作为参数。例如: ```python # 保存图表为PNG格式 plt.savefig('mychart.png') # 保存图表为PDF格式 plt.savefig('mychart.pdf') # 保存图表为SVG格式 plt.savefig('mychart.svg') ``` 总结: Matplotlib是一个强大的数据可视化库,可以绘制各种类型的图表。本篇博客介绍了Matplotlib的基础知识和常用技巧,希望能够帮助初学者更快地上手Matplotlib。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值