相信很多接触MapReduce的朋友对“数据倾斜”都不陌生。到底什么是数据倾斜怎么解决今天一文讲清。何为数据倾斜先说正常的数据分布通常也符合“二八原理”少数值占据多数记录。具体分两类第一种唯一值很少少于几千极少数值有海量记录。第二种唯一值较多但某些值记录数远超其他值占比仍不足1%或千分之一。而数据倾斜就是大量相同key被分到同一个分区导致“一个节点累死其他节点闲死”。这不仅拖慢整体计算效率也违背了并行计算的初衷。5种解决方案增加JVM内存适用于第一种情况唯一值少、单值记录极多。硬件扩容是最直接的调优手段能显著提升运行效率。增加Reduce个数适用于第二种情况唯一值较多但存在极端值。增加Reduce节点后即便负载仍不均衡每个节点分摊的工作量也会小很多总体时间缩短。自定义分区继承Partition类自己指定分区策略。效果明显但需要根据业务逻辑灵活设计。重新设计Key一种常用技巧是在Map阶段给key加上随机数打散分布避免大量相同key落到同一节点到Reduce阶段再去掉随机数还原原始key。使用Combiner合并Combiner相当于Map端的“本地Reduce”提前对相同key做一次合并既减少Map向Reduce传输的数据量节省网络带宽也减轻Shuffle阶段的磁盘IO压力。推荐优先使用。数据倾斜虽常见但并不可怕。根据业务场景选择合适的方案就能有效化解“一人独扛众人围观”的尴尬局面。