什么是数据倾斜
简单的讲,数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。
相信大部分做数据的童鞋们都会遇到数据倾斜,数据倾斜会发生在数据开发的各个环节中,比如:
- 用Hive算数据的时候reduce阶段卡在99.99%
用SparkStreaming做实时算法时候,一直会有executor出现OOM的错误,但是其余的executor内存使用率却很低。
数据倾斜有一个关键因素是数据量大,可以达到千亿级。数据倾斜长的表现
以Hadoop和Spark是最常见的两个计算平台,下面就以这两个平台说明:
1、Hadoop中的数据倾斜
Hadoop中直接贴近用户使用使用的时Mapreduce程序和Hive程序,虽说Hive最后也是用MR来执行(至少目前Hive内存计算并不普及),但是毕竟写的内容逻辑区别很大,一个是程序,一个是Sql,因此这里稍作区分。
Hadoop中的数据倾斜主要表现在ruduce阶段卡在99.99%,一直99.99%不能结束。
这里如果详细的看日志或者和监控界面的话会发现:
- 有一个多几个reduce卡住
- 各种container报错OOM
- 读写的数据量极大,至少远远超过其它正常的reduce
伴随着数据倾斜,会出现任务被kill等各种诡异的表现。
经验: Hive的数据倾斜,一般都发生在Sql中Group和On上,而且和数据逻辑绑定比较深。
2、Spark中的数据倾斜
&nbs