美文网首页
数据倾斜(一):数据倾斜及具体场景

数据倾斜(一):数据倾斜及具体场景

作者: longLiveData | 来源:发表于2020-05-23 11:00 被阅读0次

    一、什么是数据倾斜

    简单的讲,数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了集群中的一台或者几台机器上计算,而集群中的其他节点空闲。这些倾斜了的数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。

    1.1 数据倾斜

    相信大部分做数据的童鞋们都会遇到数据倾斜,数据倾斜会发生在数据开发的各个环节中,比如:

    1.用Hive算数据的时候reduce阶段卡在99.99%

    2.用SparkStreaming做实时算法时候,一直会有executor出现OOM的错误,但是其余的executor内存使用率却很低。

    3.这些问题经常会困扰我们,辛辛苦苦等了几个小时的数据就是跑不出来,心里多难过啊。

    1.2 千亿级

    为什么要突出这么大数据量?先说一下笔者自己最初对数据量的理解:

    数据量大就了不起了?数据量少,机器也少,计算能力也是有限的,因此难度也是一样的。凭什么数据量大就会有数据倾斜,数据量小就没有?

    这样理解也有道理,但是比较片面,举两个场景来对比:

    公司一:总用户量1000万,5台64G内存的的服务器。
    公司二:总用户量10亿,1000台64G内存的服务器。

    两个公司都部署了Hadoop集群。假设现在遇到了数据倾斜,发生什么?

    1.公司一的数据分析师在做join的时候发生了数据倾斜,会导致有几百万用户的相关数据集中到了一台服务器上,几百万的用户数据,说大也不大,正常字段量的数据的话64G还是能轻松处理掉的。
    2.公司二的数据分析师在做join的时候也发生了数据倾斜,可能会有1个亿的用户相关数据集中到了一台机器上了(相信我,这很常见)。这时候一台机器就很难搞定了,最后会很难算出结果。

    二、数据倾斜长什么样

    下面会分几个场景来描述一下数据倾斜的特征,方便读者辨别。由于Hadoop和Spark是最常见的两个计算平台,下面就以这两个平台说明。

    2.1 Hadoop中的数据倾斜

    Hadoop中直接贴近用户使用使用的时Mapreduce程序和Hive程序,虽说Hive最后也是用MR来执行(至少目前Hive内存计算并不普及),但是毕竟写的内容逻辑区别很大,一个是程序,一个是Sql,因此这里稍作区分。

    具体表现:

    Hadoop中的数据倾斜主要表现在:Reduce阶段卡在99.99%,一直不能结束。

    这里如果详细的看日志或者和监控界面的话会发现:

    • 有一个多几个Reduce卡住
    • 各种container报错OOM
    • 异常的Reducer读写的数据量极大,至少远远超过其它正常的Reducer
    • 伴随着数据倾斜,会出现任务被kill等各种诡异的表现。

    Hive的数据倾斜,一般都发生在Sql中group by和join on上,而且和数据逻辑绑定比较深。

    2.2 Spark中的数据倾斜

    Spark中的数据倾斜也很常见,这里包括Spark Streaming和Spark Sql,表现主要有下面几种:

    • Executor lost,OOM,Shuffle过程出错
    • Driver OOM
    • 单个Executor执行时间特别久,整体任务卡在某个阶段不能结束
    • 正常运行的任务突然失败

    注意,在Spark streaming程序中,数据倾斜更容易出现,特别是在程序中包含一些类似sql的join、group这种操作的时候。 因为Spark Streaming程序在运行的时候,我们一般不会分配特别多的内存,因此一旦在这个过程中出现一些数据倾斜,就十分容易造成OOM。

    相关文章

      网友评论

          本文标题:数据倾斜(一):数据倾斜及具体场景

          本文链接:https://www.haomeiwen.com/subject/solkahtx.html