hive 优化

hive 已经自动mapjoin优化,将小表载入到内存;不需要再mapjoin 设置。
但是skewjoin 还是得手动设置(你可每次都添加此设置,没看见有副作用)
参考:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

官方参考太长,根据2/8定律,将常用的梳理如下:
参考:http://www.cnblogs.com/xd502djj/p/3799432.html

优化效果举例:

mapjoin的使用方法是在提交hive任务的时候,加上–hiveconf hive.auto.convert.join=true,这个参数会自动识别小表的数据并 在map之前把数据加到hashtable里。
适用场景是:当join的两个表是一个比较小的表和一个特别大的表的时候,可以用mapjoin对hive执行过程进行优化。其思想是把比较小的表直接放到内存中去,然后再对较大的表进行map操作,join就发生在map阶段并不会涉及reduce操作,避免大表的数据有数据倾斜在reduce阶段jion导致内存溢出。
优化前,join在reduce阶段,单个结点数据倾斜内存溢出导致任务失败,跑了15分钟

《hive 优化》 Paste_Image.png

优化后,没有reduce过程,在map已经完成jion,没有数据倾斜的问题,运行时间缩短到了不到2分钟

《hive 优化》 Paste_Image.png

还有其他几种join优化方法我都尝试了下,但都没有解决这个场景下数据倾斜的问题,可能并不适用于这个场景,但在其他场景下可以参考:

  1. 在JOIN操作的时候,分区过滤(如:ds=$yday)需要放到 ON语句 或子查询 里面,不能放到ON后面的WHERE里,这样会全表扫描,最后才判断分区,也就是说程序会先执行JOIN操作,才会执行最后的WHERE操作。
    2.执行join操作的时候,尽量把小表放前面,大表放在后面。大表放前面可能会因为内存溢出而出错;
    3.skew join,其原理把join的key是0的特殊值先不在reduce端计算掉,而是先写入hdfs,然后启动一轮map join专门做这个特殊值的计算,期望能提高计算这部分值的处理速度。当然你要告诉hive这个join是个skew join,即:set hive.optimize.skewjoin = true;还有要告诉hive如何判断特殊值,根据hive.skewjoin.key设置的数量hive可以知道,比如默认值是100000,那么超过100000条记录的值就是特殊值。
    原文作者:活着活法
    原文地址: https://www.jianshu.com/p/378c0cbe554e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞