数据倾斜居然真的被我遇上了!

大家好,我是认真工作的俩南。

要问我上周工作上有什么进展和收获,那大概就是我终于遇见了活的数据倾斜,而且搞了两天才解决!严重阻碍了我的工作进度🤢



言归正传,不知道大家是否和我一样,了解到「数据倾斜」只是为了敷衍面试:

面试官:了解或者遇到过数据倾斜的问题吗?

我:嗯,有遇到过,写sql的时候如果一张小表关联一张大表的时候,由于会产生非常多null值,就会比较容易产生数据倾斜。解决办法就是用大表关联小表或者用建临时表的方式先对大表进行筛选blablabla....

但其实我压根没遇见过数据倾斜,以上回答也都是在网上找的答案....

但是!今天!我遇见了活的数据倾斜,也算有了实战经验,于是就有了这篇文章~

更多数据分析干货请关注公众号follow a select

本文结构速览:

1、Hadoop与MapReduce

2、数据倾斜的表现

3、数据倾斜的危害

4、如何解决数据倾斜



# 1 Hadoop与MapReduce #

1.1 Hadoop是什么?

数据分析的朋友包括我大多不是纯计算机出身,所以对底层框架和计算机原理不是特别了解,所以我查阅了很多资料试图直白地理解Hadoop和Map-reduce是什么。

举个例子:

阿金的老板让他计算一个100M的文本文件中每个单词的个数,这个文件有大概1000多行,每行有很多单词,单词和单词之间以空格键分开。

阿金觉得这个任务很简单,只要写一个简单的程序1min之内就能输出老板想要的结果。

第二天,老板又给了阿金一个1G的文本文件让他处理.....

第三天,老板又给了阿金一个1000T的文件.....

面对这样大规模的数据,阿金自己的电脑已经存储不下,也计算不了这样大的数据文件中到底有多少个单词了。

这时,Hadoop--一个存储和计算海量数据的工具就解决了阿金的烦恼。


接受了上面的例子之后,我们来看看官方释义:

  • Hadoop是由java语言编写的,在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架,其核心部件是HDFS与MapReduce。

  • HDFS是一个分布式文件系统:引入存放文件元数据信息的服务器Namenode和实际存放数据的服务器Datanode,对数据进行分布式储存和读取。

  • MapReduce是一个计算框架:MapReduce的核心思想是把计算任务分配给集群内的服务器里执行。通过对计算任务的拆分(Map计算/Reduce计算)再根据任务调度器(JobTracker)对任务进行分布式计算。

简单地说:Hadoop = HDFS + MapReduce,是一个用来存储和计算海量数据的工具。

1.2 MapReduce是如何处理海量数据的

由于本文所讲的数据倾斜问题主要发生在mapreduce过程中,与HDFS关系不是特别大,所以本文就不展开讲解存储过程了,以后有机会可以专门展开讲讲~

MapReduce包括6个过程:Input -- Split -- Map -- Shuffle -- Reduce -- Finalize,仍然以阿金要计算文件中单词的数量为例:



  • Input:读入文本文件中的每一行文件,并分块保存起来;

  • Split:将读入的文件拆分成几个不同的小文件;

  • Map:分别计算各个小文件中不同的单词数量;

  • Shuffle:把相同的单词放在同一个盒子里;

  • Reduce:分别计算每一个盒子中每一个单词的数量;

  • Finalize:计算最终结果;

注:有的资料认为mapreduce过程只包含map-shuffle-reduce过程,这里为了清晰直观展示整个过程,所以拆分地更细一些,理论上是不冲突的~


由于一个文件中单词的分布本身就不可能完全一致,极有可能出现500个Bear和1000个Car的情况,这种情况只能称之为「数据分布不均」,但如果文件中出现了1.2亿个Bear和30个Car,这种情况就是我们所说的「数据倾斜」了。



# 2 数据倾斜表现
 #

如上文所说,在map-shuffle-reduce的过程中,文件中有1.2亿个Bear和30个Car,在这种情况下,装Bear的那个“盒子”累死,而其他的“盒子”都闲死,导致数据处理的速度变得非常非常慢。

在实际场景中也可以通过数据处理的日志判断是否产生了数据倾斜,我遇见的情况主要有两类:

  • 1.前面的job刷刷刷一分钟之内执行完了,但是到了某一个job执行地特别慢,并且卡在某一个reduce过程中;


  • 2.每天都能正常执行的代码,突然有一天运行了2000秒之后报错显示内存溢出(OOM);

    这个没有图,因为我忘了截了图片


# 3 数据倾斜的危害 #

上面一直在强调说:数据倾斜可能会导致执行速度变慢,有朋友可能下意识反应是“慢就慢呗,跑数的时候我刚好摸鱼“,但是数据倾斜带来的危害可能远不止「跑得慢」,可能还会导致其他问题:


1.任务长时间挂起:一个任务跑1万秒你受得了?


亲身经历,说起来都是泪图片


2.导致内存溢出,任务直接失败

如果因为数据量导致的数据倾斜长时间卡在一个task上,你的任务恰好设置的最大内存又不够,这时候这个task就会直接内存溢出,跑了一万秒的数据付之东流,这时候砸电脑都不够解恨!


3.任务执行时间超出预期,导致下游数据全挂掉


有过数据分析实习或工作经验的伙伴应该都知道,工作场景中一个任务可能依赖多个上游任务,这个任务又有多个下游任务依赖,如果你的任务因为时间问题没跑出来,下游可能全挂掉,最终影响到一大片任务的产出(别问我怎么知道的 👇


所以,数据倾斜危害极大,应当谨慎对待!


# 4 如何解决 #

如果真的遇见数据倾斜的问题也不要慌张,可以及时予以处理:

1、增加参数
现在的hive已经非常高级,大多数数据倾斜能够通过调整参数的方式予以解决,相关的参数如下:

--增大Reduce个数

set hive.exec.reducers.max=200;

set mapred.reduce.tasks=200;

--这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置

set hive.groupby.mapaggr.checkinterval=100000;

--如果是group by过程出现倾斜 应该设置为true

set hive.groupby.skewindata=true;

--这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置

set hive.skewjoin.key=100000;

--如果是join 过程出现倾斜 应该设置为true

set hive.optimize.skewjoin=true;


2、数据预处理
如果你在处理这个任务之前,明确知道自己的数据中存在超大表连接小表、有很多冗余信息等情况,那么在建任务之前,应该先对数据进行处理:过滤掉无用的信息、去除重复数据尽可能减少表内容,这样才能在任务执行过程中避免数据倾斜的问题~
3、拆分任务
针对我遇见的这个数据倾斜的问题,我专门咨询了专业的数据开发的同事,了解到他们在建任务的时候极少通过调参的方式解决,更多的是将任务拆分成几个步骤,一个任务可能拆分成多个临时表,再用一张最终表对临时表进行汇总,这样就能极大提升任务的速度,跑起比苏炳添还快!

更多数据分析干货请关注公众号follow a select,一起学习数据分析知识~

全部评论
又是大区又是这熟悉的调度任务界面👀怕不是一个部门
点赞 回复
分享
发布于 2022-09-13 16:48 上海

相关推荐

1 5 评论
分享
牛客网
牛客企业服务