hive解决数据倾斜问题_数据倾斜原因和解决方法

数据分布

正常的数据分布理论上都是倾斜的,就是我们所说的20-80原理:80%的财富集中在20%的人手中, 80%的用户只使用20%的功能 , 20%的用户贡献了80%的访问量 , 不同的数据字段可能的数据倾斜一般有两种情况:

一种是唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)

一种是唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一

数据倾斜

数据倾斜在MapReduce编程模型中十分常见,大量的相同key被partition分配到一个分区里,造成了'一个人累死,其他人闲死'的情况一个节点要承受着巨大的压力,而其他节点计算完毕后要一直等待这个忙碌的节点,拖累了整体的计算时间,。

数据倾斜发生时的现象:

  • 绝大多数task执行得都非常快,但个别task执行的极慢。
  • 原本能正常执行的Spark作业,某天突然爆出OOM(内存溢出)异常。观察异常栈,是我们写的业务代码造成的

数据倾斜发生的原理 :

在进行shuffle的时候,必须将各个节点上相同的Key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或者join操作。如果某个key对应的数据量特别大的话,会发生数据倾斜。比如大部分key对应的10条数据,但个别key却对应了100万条数据,那么大部分task会只分配到10条数据,而个别task可能会分配了100万数据。整个spark作业的运行进度是由运行时间最长的那个task决定的。

因此出现数据倾斜的时候,spark作业看起来会运行得非

你可能感兴趣的:(hive解决数据倾斜问题)