zoukankan      html  css  js  c++  java
  • hive优化

    跑sql的时候会出现的参数:

    In order to change the average load for a reducer (in bytes):
      set hive.exec.reducers.bytes.per.reducer=<number>   #########
      如果大于<number>,就会多生成一个reduce
      <number> =1024    <1k 一个reduce
      1m 10个reduce
     
      set hive.exec.reducers.bytes.per.reducer=20000;
      select user_id,count(1) as order_cnt
      from orders group by user_id limit 10;
    --结果number of mappers: 1; number of reducers: 1009  
     
     
    In order to limit the maximum number of reducers:
      set hive.exec.reducers.max=<number>
      set hive.exec.reducers.max=10;  ############
     -- number of mappers: 1; number of reducers: 10
     
    In order to set a constant number of reducers:
      set mapreduce.job.reduces=<number>
      set mapreduce.job.reduces=5;
      --number of mappers: 1; number of reducers: 5
      set mapreduce.job.reduces=15; ###########
      --number of mappers: 1; number of reducers: 15
      对你当前窗口,或者执行任务(脚本)过程中生效

    上面这几条属性(#标识的),是后面的优先级大于前面的,即范围越小优先级越大。

    ##set 的属性只对你当前的窗口,或者脚本生效。

     2)where条件使得group by冗余 (即有一个mapred)

      map 和 reduce执行过程是一个同步的过程
      同步:打电话
      异步:发短信
      1:map执行完 reduce在执行       1+2=》3:reduce
      2:map reduce
     
      map 60%  reduce=3%   #有的时候会出现这种情况,实际上也是同步的。

    3)只有一个reduce

      a.没有group by
      set mapreduce.job.reduces=5;
      select count(1) from orders where order_dow='0';
      --number of mappers: 1; number of reducers: 1
      b.order by
      set mapreduce.job.reduces=5;
      select user_id,order_dow
      from orders where order_dow='0'
      order by user_id
      limit 10;
      -- number of mappers: 1; number of reducers: 1

    笛卡尔积

    join没有on的条件关联。

    1   1
    2    1
    3    1
    1    2
    2    2
    3    2
    1    3
    2    3
    3    3

    相当于一个对一个全对上,一个不落。

    用途:user product(库中所有商品中调小部分觉得这个用户喜欢 召回(match) 候选集1000)  top10
    users 母婴类 products
    要同时考虑users和products信息来给它们做一个筛选(粗粒度)

    select * from tmp_d
    join (select * from tmp_d)t
    where tmp_d.user_id=t.user_id; --相当于on

    mapjoin

    维度表:product,之类的,一般数据都不会太大。可以认为是小表。

    若所有表中只有一张小表,那可在最大的表通过Mapper的时候将小表完全放到内存中,Hive可以在map端执行连接过程,称为map-side join,这是因为Hive可以和内存的小表逐一匹配,从而省略掉常规连接所需的reduce过程。即使对于很小的数据集,这个优化也明显地要快于常规的连接操作。其不仅减少了reduce过程,而且有时还可以同时减少Map过程的执行步骤。

    select /*+ MAPJOIN(aisles) */ a.aisle as aisle,p.product_id as product_id
    from aisles a join products p
    on a.aisle_id=p.aisle_id limit 10;

    ##aisles为小表,将他放入到内存中。 /*+ MAPJOIN(aisles) */相当于标记下,告诉hive这是小表。

    设置参数:

    开启:

    set hive.auto.convert.join=true;  #hive1.2.2以后默认开启。


    默认值:false。该参数为true时,Hive自动对左边的表统计量,若是小表就加入内存,即对小表使用Map join

    开启
    set hive.mapjoin.smalltable.filesize=25000000;
    默认值:25M

    union all/distinct=union 的优化

    http://www.w3school.com.cn/sql/sql_union.asp

    合并两个表,union all 不去重,union去重。前提列数一致,类型相同。

    例子1

    select count(distinct order_id,user_id,order_week) from (select order_id,user_id,order_week from orders where order_week='0' union all select order_id,user_id,order_week from orders where order_week='1')t;

     select count(*)
    from(
    select order_id,user_id,order_week from orders where order_week='0' union
    select order_id,user_id,order_week from orders where order_week='1')t;

    !!!结论用union all 加distinct 比用union性能高。

    multi insert

    Multi-insert & multi-group by
    从一份基础表中按照不同的维度,一次组合出不同的数据 userid product_num order_num
    FROM table_name
    INSERT OVERWRITE TABLE table_name1 partition (country="US",state='1')  select xxx group by key1

    INSERT OVERWRITE TABLE tablen_ame2 partition (country="US",state='2')select xxx group by key2

    Automatic merge(没发调的时候选择这个)

    -当文件大小比阀值小时,hive会启动一个mr进行合并

    -hive.merge.mapfiles = true 是否合并Map输出文件,默认为True

    -hive.merge.mapredfiles=flase 是否河滨Reduce输出文件,默认为Flase

    -hive.merge.size.per.task=256*1000*1000 合并文件的大小

    Multi-Count Distinct

    数据倾斜

    set hive.groupby.skewindata=true;
    将一个map reduce拆分成两个map reduce
    ‘-’(‘’,-1,0,null)1亿条 到一个reduce上面,

    1个reduce处理6000w ‘-’ 1%     200w求和 =》1条
    29 reduce处理剩余的4000w 99%

    1.随机分发到不同的reduce节点,进行聚合(count)
    2. 最终的一个reduce做最终结果的聚合(200w求和 =》1条)
        
    select add_to_cart_order,count(1) as cnt
    from priors
    group by add_to_cart_order
    limit 10;
        
    -- 没指定set hive.groupby.skewindata=true;
    --Launching Job 1 out of 1
    -- 1m 41s

    --指定了set hive.groupby.skewindata=true;
    --Launching Job 1 out of 2
    -- 2m 50s

    如果在不导致reduce一直失败起不来的时候,就不用这个变量
    如果确实出现了其中一个reduce的处理数据量太多,导致任务一直出问题,运行时间长。这种情况需要设置这个变量。

    凌晨定时任务,近一周报表,跑了3个小时。##数据倾斜的情况,面试的时候可以说
    洗出来的基础表,3点出来,7点出来,后面接了70任务  ###数据倾斜的情况,面试的时候可以说

      join顺序,map的数量

     --Launching Job 1 out of 1
     select
     ord.order_id order_id,
     tra.product_id product_id,
     pri.reordered reordered
    from orders ord
    join trains tra on ord.order_id=tra.order_id
    join priors pri on ord.order_id=pri.order_id
    limit 10;

    --两个MR任务
     select
     ord.order_id,
     tra.product_id,
     pro.aisle_id
    from orders ord
    join trains tra on ord.order_id=tra.order_id
    join products pro on tra.product_id=pro.product_id
    limit 10;

  • 相关阅读:
    httpd配置
    thymeleaf js 方法中参数 如何拼接进json对象,不转换为[object,object]
    mysql 8.0.18.zip安装配置方法图文教程(windows 64位)
    SpringBoot配置devtools实现热部署
    构建工具 Maven 的使用
    Java的 JAVA_HOME、Path、CLASSPATH环境变量小结
    IDEA创建springboot项目,特殊项目目录介绍(.idea、.iml、.gitignore、.mvn、mvnw、mvnw.cmd、.gitimodules、.gitkeep)
    统计代码量——SourceCounter.exe
    yml配置之static-path-pattern 与 static-locations,静态资源的访问
    联合索引
  • 原文地址:https://www.cnblogs.com/taozizainali/p/9010631.html
Copyright © 2011-2022 走看看