zoukankan      html  css  js  c++  java
  • Hive性能优化【严格模式、join优化、Map-Side聚合、JVM重用】

    一.严格模式

      通过设置以下参数开启严格模式:

      >set hive.mapred.mode=strict;【默认为nonstrict非严格模式】

      查询限制:

        1.对于分区表,必须添加where查询条件来对分区字段进行条件过滤。

        2.order by语句必须包含limit输出限制。

        3.限制执行笛卡尔积的查询。

    二.Hive排序

      1.order by:对于查询结果做全排序只允许有一个reduce处理,当数据量较大时,应慎用。严格模式下必须结合limit来使用。

      2.sort by:对于单个reduce的数据进行排序。

      3.distribute by:分区排序,经常和sort by结合使用。

      4.cluster by:相当于sort by + distribute by【cluster by不能通过asc,desc的方法指定排序规则,可通过distribute by column sort by column asc|desc的方式】

    三.Hive Join

      1.join计算时,将小表放在join的左边。

      2.map join,在Map端完成join,实现方式:

        2.1sql方式,在sql语句中添加mapjoin标记【mapjoin hint】

          语法:select /*+MAPJOIN(smallTable) */ smallTable.key,bigTable.value from smallTable JOIN btTable ON smallTable.key = bigTable.key;

        2.2开启自动mapjoin,通过设置一下配置启动自动的mapjoin

          set hive.auto.convert.join = true;【该参数为ture时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表用mapjoin】

        相关参数配置:

        >hive.mapjoin.smalltable.filesize;【大小表判断阈值,表的大小小于该值则为小表,加载到内存中】

        >hive.ignore.mapjoin.hint;【默认值为true,是否忽略mapjoin hint即mapjoin标记】

        >hive.auto.convert.join.noconditionaltask;【默认值为true,将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin】

        >hive.auto.convert.join.noconditionaltask.size;【将多个mapjoin转化为一个mapjoin时,列表的最大值】

     四.Map-Side聚合

      通过设置以下参数开启在map端的聚合:set hive.map.aggr=true;

      相关参数配置:

        >hive.groupby.mapaggr.checkinterval:map端group by执行聚合时处理的数据条数【默认100000】

        >hive.map.aggr.hash.min.reduction:进行聚合的最小比例【预先对100000条数据做聚合,若聚合之后的数据量/100000的值大于该配置【默认0.5】则不聚合】

        >hive.map.aggr.hash.percentmemeory:map端聚合使用的内存的最大值

        >hive.map.aggr.hash.force.flush.memory.threshold:map端做聚合操作时hash表的最大可以容量,大于该值则会触发flush

        >hive.groupby.skewindata:是否对groupby产生的数据倾斜做优化,默认为false

     五.控制hive中map和reduce的数量

      map数量相关参数:

        >mapred.max.split.size:一个split的最大值,即每个map处理文件的最大值

        >maprd.min.split.size.per.node:一个节点上split的最小值

        >mapred.min.split.size.per.rack:一个机架上split的最小值

      reduce数量相关参数:

        >mapred.reduce.tasks:强制指定reduce任务的数量

        >hive.exec.reducers.bytes.per.reducer:每个reduce任务处理的数据量

        >hive.exec.reducers.max:每个任务最大的reduce数

    六.JVM重用

      适用场景:

        1.小文件个数过多

        2.task个数过多

      通过执行:set mapred.job.reuse.jvm.num.tasks=n;来设置task插槽个数

      缺点:

        设置开启后,task插槽会一直占用资源,不论是否有task,直到所有的task即整个job执行完成后才会释放所有的task插槽资源!

  • 相关阅读:
    IDEA 运行junit单元测试方法
    IDEA 修改编码
    接口文档word版
    java 上传文件到七牛云中
    单例模式
    洛谷P3092 [USACO13NOV]没有找零No Change
    Codevs 1159 最大全0子矩阵
    洛谷P2733 家的范围 Home on the Range
    洛谷P2280 [HNOI2003]激光炸弹
    洛谷P2023 [AHOI2009]维护序列
  • 原文地址:https://www.cnblogs.com/yszd/p/11124459.html
Copyright © 2011-2022 走看看