0
点赞
收藏
分享

微信扫一扫

Hive数据倾斜

大雁f 2022-01-27 阅读 31

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性能调优实践 》,感谢知识分享

举报

相关推荐

0 条评论