数据倾斜
简单的讲,数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。
数据倾斜
数据倾斜一般有两种情况:
- 变量值很少: 单个变量值的占比极大,常见的字段如性别、学历、年龄等。
- 变量值很多: 单个变量值的占比极小,常见的字段如收入、订单金额之类的。
常用优化方法
- **增加jvm内存:**这适用于变量值非常少的情况,这种情况下,往往只能通过硬件的手段来进行调优;
- **增加reduce的个数:**这适用于变量值非常多的情况,这种情况下最容易造成的结果就是大量相同key被partition到一个分区,从而一个reduce执行了大量的工作;
- **重新设计key:**在map阶段时给key加上一个随机数,有了随机数的key就不会被大量的分配到同一节点(小几率),待到reduce后再把随机数去掉即可
- **使用combiner合并:**combinner是在map阶段,reduce之前的一个中间阶段,在这个阶段可以选择性的把大量的相同key数据先进行一个合并,可以看做是local reduce,然后再交给reduce来处理,减轻了map端向reduce端发送的数据量(减轻了网络带宽),也减轻了map端和reduce端中间的shuffle阶段的数据拉取数量(本地化磁盘IO速率);(hive.map.aggr=true)