• hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)


    与hbase外部表(wizad_mdm_main)进行join出现问题:
    CREATE TABLE wizad_mdm_dev_lmj_edition_result as
    select * 
    from  wizad_mdm_dev_lmj_20141120 as w 
    JOIN wizad_mdm_main as a ON (a.rowkey = w.guid);

    程序启动后,死循环,无反应。最后在进行到0.83时,内存溢出失败。
    原因:
    默认情况下,Hive会自动将小表加到DistributeCache中,然后在Map扫描大表的时候,去和DistributeCache中的小表做join,这称为Mapjoin。
    这里wizad_mdm_main是基于HBase的外部表,而这张表在HDFS上的源路径为 /hivedata/warehouse/wizad.db/wizad_mdm_main,实际这个目录为空,
    因此,Hive优化器认为它是小表,所以,会将这张表数据加到DistributeCache中,造成内存溢出。



    解决办法:
    SET hive.auto.convert.join=false; 关闭自动转化MapJoin,默认为true;
    SET hive.ignore.mapjoin.hint=false; 关闭忽略mapjoin的hints(不忽略,hints有效),默认为true(忽略hints)。
    然后在查询时候使用hints,/*+ mapjoin(w) */ 将小表w (wizad_mdm_dev_lmj_edition_20141120) 加入到DistributeCache,
    Map task在扫描HBase中的大表阶段,就可以完成join操作:
    SET mapred.job.queue.name=queue3;
    SET hbase.client.scanner.caching=5000;
    SET hbase.zookeeper.quorum=datanode06,datanode07,datanode08;
    SET zookeeper.znode.parent=/hbase;
    set hbase.regionserver.lease.period=180000;
    SET hive.auto.convert.join=false;
    SET hive.ignore.mapjoin.hint=false;
     
    INSERT OVERWRITE LOCAL DIRECTORY '/home/wizad/lmj/'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    select /*+ mapjoin(w) */ cookie_id,rowkey,fixeddim_map
    from wizad_mdm_dev_lmj_edition_20141120 as w JOIN wizad_mdm_main as a

    ON (w.guid = a.rowkey);




    hive大表与大表join:
    1.确保没有笛卡尔积;
    2.确保没有数据倾斜;
    3.增加reduce数;
    4.不行再试试分桶join;

     
  • 相关阅读:
    Js实现页面处理器
    自定类型转换
    为什么PHP5中保存cookie以后,要刷新一次才能读取cookie的内容?
    PHP不不支持函数重载
    JS 省市区三级联动
    我喜欢的酷站
    网站宽度设置多少
    Windows环境下Node.js 以及NPM和CoffeeScript的安装配置
    HTML中Meta详解
    搭建SVN
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205402.html
Copyright © 2020-2023  润新知