1. 什么是数据倾斜
数据倾斜,即单个节点任务所处理的数据量远大于同类型任务所处理的数据量,导致该节点成为整个作业的瓶颈,这是分布式系统不可能避免的问题。
2. 造成数据倾斜的原因
从本质来说,导致数据倾斜有两种原因:
一是任务读取大文件,二是任 务需要处理大量相同键的数据。
任务需要处理大量相同键的数据,这种情况有以下 4 种表现形式:
(1) 数据含有大量无意义的数据,例如空值( NULL )、空字符串等。
(2)含有倾斜数据在进行聚合计算时无法聚合中间结果,大量数据都需要经过 Shuffle 阶段的处理,引起数据倾斜。
(3)两表进行 Join ,都含有大量相同的倾斜数据键。
(4) 数据在计算时做多维数据集合,导致维度膨胀引起的数据倾斜。
3. 数据倾斜应对办法
根据上面描述的造成数据倾斜的原因,有针对性的应对即可。
(1)不可拆分大文件引发的数据倾斜
归档、不支持文件分割的压缩方式、以后有任务要读取压缩文件、单个map读取瓶颈、map读取倾斜
Map读取文件的数据倾斜:当集群的数据量增长到一定规模,有些数据需要 归档 或者转储,这时候 往往会对数据进行压缩;当对文件使用GZIP 压缩等 不支持文件分割操 作的压缩方式,在日后有作业涉及读取压缩后的文件时, 该压缩文件 只会 被一个 任务 所读取。如果该压缩文件很大,则处理该文件的Map 需要花费的时间会 远多于读取普通文件的Map 时间, 该Map任务会成为作业运行的瓶颈 。这种 情况也就是 Map读取文件 的数据倾斜。
应对办法:可以采用 bzip2 和 Zip 等支持文件分割的压缩算法
(2)无意义的空值数据
这些与业务无关的数据引入导致在进行分组聚合或 者在执行表连接时发生数据倾斜。对于这类问题引发的数据倾斜,在计算过 程中排除含有这类“ 异常 ” 数据即可。
(3) 两个 Hive 数据表连接时引发的数据倾斜
两表进行普通的 repartition join 时,如果表连接的键存在倾斜,那么在 Shuffle阶段必然会引起数据倾斜。
遇到这种情况,Hive 的通常做法还是启用两个作业,第一个作业处理没 有倾斜的数据,第二个作业将倾斜的数据存到分布式缓存中,分发到各个 Map任务所在节点。在 Map 阶段完成 join 操作,即 MapJoin ,这避免了 Shuffle,从而避免了数据倾斜。
4. 参考资料
本文内摘自《hive性能调优实践 》,感谢知识分享