美文网首页
hive 优化

hive 优化

作者: 活着活法 | 来源:发表于2016-12-20 20:28 被阅读0次

    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分钟

    Paste_Image.png

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

    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条记录的值就是特殊值。

    相关文章

      网友评论

          本文标题:hive 优化

          本文链接:https://www.haomeiwen.com/subject/kijfvttx.html