Return to site

Hive下的数据倾斜

大数据技术相关

· 大数据,Hive

倾斜的原因和思路

理想情况下, 我们希望数据是均匀的分配在Maper与Reducer中进行处理。

  因此使map的输出数据更均匀的分布到reduce中去,也是我们的最终目标。由于Hash算法的局限性,按key进行Hash会或多或少的造成数据倾斜。大量经验表明数据倾斜的原因是人为的建表疏忽或业务逻辑可以规避的。

如何处理?

Hive的执行是stage by stage的,下一stage的map处理数据取决于上一个stage的reduce输出,所以如何将数据均匀的分配到各个reduce中,就是解决数据倾斜的根本。

具体解决方法

内存优化和I/O优化:

  驱动表:使用大表做驱动表,以防止内存溢出;Join最右边的表是驱动表;Mapjoin无视join顺序,用大表做驱动表;StreamTable。

  • Mapjoin

Mapjoin是一种避免避免数据倾斜的手段,MapJoin把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map阶段进行了join操作,大大提升了reduce运行的效率 。

  • 多表Join时的顺序问题 

  尽管在高版本Hive下, Join的auto-convert功能可能是默认开启的, 但我个人仍然保持一个习惯:在对多个表join连接操作时,将小表放在join的左边,大表放在Join的右边,在执行这样的join连接时小表中的数据会被缓存到内存当中,这样可以有效减少发生内存溢出错误的几率。

  • 其它设置参数

Hive的配置参数偏保守(也许这是其稳定性得到更多人认可的原因), 但效率不高也变成了Hive 的刻板印象, 修改配置会提升查询效率。因此记住一些常见的参数配置,

  hive.map.aggr = true

  hive.groupby.skewindata=true

…… 【后面想到再添加】

  • SQL语法的特殊处理

  在某些情况下采用sum() group by 替换 count(distinct)

  • StreamTable

  将在reducer中进行join操作时的小table放入内存,而大table通过stream方式读取

All Posts
×

Almost done…

We just sent you an email. Please click the link in the email to confirm your subscription!

OKSubscriptions powered by Strikingly