美文网首页
HIVE SQL 优化

HIVE SQL 优化

作者: 本凡_大数据_机器学习 | 来源:发表于2019-04-15 19:21 被阅读0次

    1、reduce 的个数:先看一下跑hive时出现的参数:

    in order to change the average load for a reducer (in bytes):

      set hive.exec.reducers.bytes.per.reducer=<number>

    (1)、可以设定number的大小来调整reduce个数;每当数据量大于number时就会多产生一个reduce

    (2)、In order to limit the maximum number of reducers:

                  set hive.exec.reducers.max=<number>

    指定reducer的最大个数,如果同时指定了 set hive.exec.reducers.bytes.per.reducer = <number>,

    set hive.exec.reducers.max = <number> 的优先级大,会覆盖上面那个参数

    (3)、In order to set a constant number of reducers:

                  set mapreduce.job.reduces=<number>

    指定 set mapreduce.job.reduces = <number>指定reduce的个数,这个参数的优先级大于以上两个

    2、where 条件使得 group by 冗余

    在写代码时,where已经限定了条件,此时不需要group by ,加上会增加运行的负担(group by 会进行分区,会运行多个reduce,增加不必要的损耗)

    3、只有一个reduce情况

    (1)、没有group by :即使设置了reduce的个数也不会变;

    (2)、order by:全局排序只产生一个reduce

    (3)、笛卡尔积:单纯的两个表join时(没有 on 条件)会发生笛卡尔积,此时只有一个reduce

    4、map join :

    select /*+ MAPJOIN(a) +*/  a.product_id,b.aisle from  a join b on xxx

    map join的使用条件;

    (1)、当发生小表 join 大表时,可以mapjoin(小表)将小表存入内存中,在map端join(0.7之前需要加

    /*+ MAPJOIN(a) +*/ ,0.7之后由参数hive.auto.convert.join=true控制);小表的阈值:

    set hive.mapjoin.smalltable.filesize = 25000000 (25M) 

    设置可以使用多大的内存来存储数据(默认为内存的0.55):

    set hive.mapjoin.followby.gby.localtask.max.memory.usage = 0.55

    (2)、当两个表不等值连接时,也经常使用mapjoin

    5、union all / distinct == union

    union all 与 union 用于将多个select查询语句结果合并到一个结果里(union 将查询到的结果去重)

    union all 不会去重,但在查询时加上distinct有同样的效果。

    因为union要进行重复值扫描,所以效率比 union all/distinct 低。

    6、数据倾斜

    set hive.groupby.skewindata = true

    当出现数据倾斜时,设置hive.groupby.skewindata = true 可将一个mapreduce任务拆分成两个

    使用情景:凌晨定时任务,需要报表;洗出来的基本表

    7、MR 的数量

    1个MR:

    select

    ord.order_id order_id,

    tra.product_id product_id,

    pri.reordered reordered

    from orders ord

    join trains tra on a.xx=b.xx

    join priors pri on a.xx=c.xx

    2个MR

    select

    ord.order_id,

    tra.product_id,

    pro.aisle_id

    from orders ord

    join trains tra on a.xx=b.xx

    join products pro on b.xx=c.xx

    /*+ STREAMTABLE(a) */ 指定一个大表

    8、设置mapreduce是同步执行还是异步执行

    set hive.exec.parallel=true

    (1)、同步执行:map执行完再执行reduce

    (2)、异步执行:map和reduce一起执行

    9、怎么定位哪几个key发生倾斜:

    可以使用分桶:bucket然后sample抽样

    相关文章

      网友评论

          本文标题:HIVE SQL 优化

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