数据倾斜

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

数据倾斜

数据倾斜一般有两种情况:

  • 变量值很少: 单个变量值的占比极大,常见的字段如性别、学历、年龄等。
  • 变量值很多: 单个变量值的占比极小,常见的字段如收入、订单金额之类的。

常用优化方法

  1. **增加jvm内存:**这适用于变量值非常少的情况,这种情况下,往往只能通过硬件的手段来进行调优;
  2. **增加reduce的个数:**这适用于变量值非常多的情况,这种情况下最容易造成的结果就是大量相同key被partition到一个分区,从而一个reduce执行了大量的工作;
  3. **重新设计key:**在map阶段时给key加上一个随机数,有了随机数的key就不会被大量的分配到同一节点(小几率),待到reduce后再把随机数去掉即可
  4. **使用combiner合并:**combinner是在map阶段,reduce之前的一个中间阶段,在这个阶段可以选择性的把大量的相同key数据先进行一个合并,可以看做是local reduce,然后再交给reduce来处理,减轻了map端向reduce端发送的数据量(减轻了网络带宽),也减轻了map端和reduce端中间的shuffle阶段的数据拉取数量(本地化磁盘IO速率);(hive.map.aggr=true)

参考文献

  1. 一文带你搞清楚什么是“数据倾斜”