加入收藏 | 设为首页 |

老梁说天下-数据歪斜的处理

海外新闻 时间: 浏览:292 次

一、什么是数据歪斜

分布式数据处理中一份大的数据会依照key分组分红多个小份的数据放到不同的机器上去并行的处理,这儿的大数据分红多份咱们叫做分区

分区最佳的状况便是分出来的数据很均匀,放到各个机器上去,刚好能够并老梁说天下-数据歪斜的处理行的一起跑完。

很差的状况便是分出来不均匀,导致大部分数据跑完了,就留下一两个还在跑。

这样导致一下几个损害:

  1. 终究使命花费的时刻很长,失去了分布式核算的优势
  2. 不均老梁说天下-数据歪斜的处理匀的分配也可能会,让小的数据一下跑完,资源就闲暇了,而大的数据可能会因为资源的缺乏跑挂掉,终究导致整个使命的失利。

在spark中的体现:某个stage的有几个task跑得比大部分task都慢许多,能够在WEB-UI的stage详情页观察到。

首先从Summary Metrics这个块看到duration(持续时刻)的max超出75%百分位许多。

能够看到duration比其他使命要长许多并且还失利了,这时候咱们还观察到这个失利的task的shuffle老梁说天下-数据歪斜的处理 read 比其他task都多,不论从size(占用空间)仍是records(记载数)上。如下图



二、数据歪斜的处理方法

数据歪斜有三种方法得歪斜:

  • 一是分区不均,某几个分区对应的key太多。大都状况都是这种歪斜。
  • 二是单个key对应的数据量太多
  • 三是单条记载数据太大(比方数组中的值太多)

2.1 加并行度

这是一种很简单的处理计划,将分区增多,数据打得更散,充分发挥分布式的优势。

可是分区增量task也会增多,带来的老梁说天下-数据歪斜的处理额定的办理本钱就更多了,分的太多反而跑得更慢,存储成果的本钱也添加了,不是一个很好的处理计划。

能够在以下几个当地添加分区。

1.在歪斜的stage之前运用reparation重分区。

2.设置shuffle的并行度,大部分状况都运用这个。

2.2 处理特别case

这种就比较常见了,常常会发现许多stage跑到剩余一个task死活跑不过或许耗时十分久。歪斜的key咱们能够经过groupby key进老梁说天下-数据歪斜的处理行count来寻觅,一般都是空值、空字符串、还有特别热门的key。怎么处理这就看撸大哥你的事务需求咯。

2.3 使用小trick打散key

针对第二种歪斜的方法,咱们能够在key上加随机前缀或后缀这样加盐的方法来将一个key变成多个key先进行一次shuffle,最终再复原回来。

例如咱们需求进行分组核算,可是数据歪斜了,咱们能够对key加随机前缀,把一个key变成多个进行count,最终sum。

def add_random_prefix(key):
return str(randint[0,3])+key
def remove_random_prefix(key):
return key[1:]
df.selectExpr("add_random_prefix(key) key_with_prefix")\
.groupby("key_with_prefix").count()\
.selectExpr("remove_random_prefix(key_with_prefix) key")\
.groupby("key").sum()

这种方法比较费事特别是在join的状况下,要考虑的东西比较多。

加盐的方法也会数据量不是那么多的key也打的更散了,核算起来老梁说天下-数据歪斜的处理有点浪费资源。

2.4 自定义分区计划

这种就更高端了些,需求自己去完成一个partitioner,不多说,还不如结构key来完成自定义分区。

三、总结

咱们探讨了什么是数据歪斜,怎么判别,怎么处理数据歪斜,是不是又收成了许多呢。

能够重视我其他文章看看spark是怎么分区进行核算的

学习材料