10)Hive (调优)

  1. Fetch抓取

    • Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台;

    • 在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce;

      <property>
      	<name>hive.fetch.task.conversion</name>
      	<value>more</value>
      </property>
      
  2. 本地模式

    • 大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短;
    • 用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化;
    set hive.exec.mode.local.auto=true;  //开启本地mr
    //设置local mr的最大输入数据量,当输入数据量小于这个值时采用local  mr的方式,默认为 134217728,即128M
    set hive.exec.mode.local.auto.inputbytes.max=50000000;
    //设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为 4
    set hive.exec.mode.local.auto.input.files.max=10;
    
  3. 表的优化

    1. 小表Join大表
      将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率;再进一步,可以使用map join让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce(新版的hive已经对小表JOIN大表和大表JOIN小表进行了优化。小表放在左边和右边已经没有明显区别)

    2. 大表Join大表

      • 空key过滤:
        有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的 reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key 对应的数据是异常数据,我们需要在SQL语句中进行过滤;
      • 空key转换:
        有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join 的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分不到不 同的reducer上;
      insert overwrite table jointable
      select n.* from nullidtable n full join ori o on 
      case when n.id is null then concat('hive', rand()) else n.id  = o.id end
      
    3. MapJoin
      如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理;
      开启MapJoin参数设置:
      1)设置自动选择Mapjoin
      set hive.auto.convert.join = true; 默认为true
      2)大表小表的阈值设置(默认25M以下认为是小表):
      set hive.mapjoin.smalltable.filesize=25000000;

    4. Group By
      默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了;
      并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果;
      开启Map端聚合参数设置:
      ① 是否在Map端进行聚合,默认为True:hive.map.aggr=true
      ② 在Map端进行聚合操作的条数数量:hive.groupby.mapaggr.checkinterval=100000
      ③ 有数据倾斜的时候进行负载均衡(默认是false)
      hive.groupby.skewindata
      当选项设定为 true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

    5. Count(Distinct) 去重统计
      数据量大的情况下,由于COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换;

    6. 笛卡尔积
      尽量避免笛卡尔积,join的时候不加on条件,或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积

    7. 行列过滤
      列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。
      在分区剪裁中,当使用外关联时,先通过子查询后,再关联表

    8. 分桶

    9. 分区

  4. 数据倾斜
    ① 合理设置Map数
    ② 小文件进行合并:在map执行前合并小文件,减少map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式):set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
    ③ 复杂文件增加Map数:当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率;computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M公式,调整maxSize最大值。让maxSize最大值低于blocksize就可以增加map的个数。
    ④ 合理设置Reduce数:
    调整每个Reduce处理的数据量(默认是256MB)
    hive.exec.reducers.bytes.per.reducer=256000000
    调整每个任务最大的reduce数(默认为1009)
    hive.exec.reducers.max=1009
    计算reducer数的公式:N=min(参数2,总输入数据量/参数1)
    在hadoop的mapred-default.xml文件中修改
    设置每个job的Reduce个数
    set mapreduce.job.reduces = 15;

  5. 并行执行
    通过设置参数hive.exec.parallel值为true,就可以开启并发执行。不过,在共享集群中,需要注意下,如果job中并行阶段增多,那么集群利用率就会增加。
    set hive.exec.parallel=true; //打开任务并行执行
    set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8
    注:系统资源比较空闲的时候才有优势

  6. 严格模式
    通过设置属性hive.mapred.mode值为默认是非严格模式nonstrict ;
    开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止3种类型的查询:

<property>
    <name>hive.mapred.mode</name>
    <value>strict</value>
<description>
      The mode in which the Hive operations are being performed. 
      In strict mode, some risky queries are not allowed to run. They include:
        Cartesian Product.
        No partition being picked up for a query.
        Comparing bigints and strings.
        Comparing bigints and doubles.
        Orderby without limit.
</description>
</property>
1)对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。
2)对于使用了order by语句的查询,要求必须使用limit语句。
3)限制笛卡尔积的查询。
  1. JVM重用
    JVM重用是Hadoop调优参数的内容,其对Hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短。
    Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间,具体多少需要根据具体业务场景测试得出
<property>
  <name>mapreduce.job.jvm.numtasks</name>
  <value>10</value>
  <description>How many tasks to run per jvm. If set to -1, there is
  no limit. 
  </description>
</property>

这个功能的缺点是,开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡的”job中有某几个reduce task执行的时间要比其他Reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。
8. 推测执行
在分布式集群环境下,因为程序Bug(包括Hadoop本身的bug),负载不均衡或者资源分布不均等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有50%,而其他所有任务已经运行完毕),则这些任务会拖慢作业的整体执行进度。为了避免这种情况发生,Hadoop采用了推测执行(Speculative Execution)机制,它根据一定的法则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。
设置开启推测执行参数:Hadoop的mapred-site.xml文件中进行配置:

<property>
  <name>mapreduce.map.speculative</name>
  <value>true</value>
  <description>If true, then multiple instances of some map tasks 
               may be executed in parallel.
  </description>
</property>
<property>
  <name>mapreduce.reduce.speculative</name>
  <value>true</value>
  <description>If true, then multiple instances of some reduce tasks 
               may be executed in parallel.
  </description>
</property>

不过hive本身也提供了配置项来控制reduce-side的推测执行:

<property>
    <name>hive.mapred.reduce.tasks.speculative.execution</name>
    <value>true</value>
    <description>
      Whether speculative execution for reducers should be turned on.
    </description>
  </property>

如果用户对于运行时的偏差非常敏感的话,那么可以将这些功能关闭掉。如果用户因为输入数据量很大而需要执行长时间的map或者Reduce task的话,那么启动推测执行造成的浪费是非常巨大大

  1. 压缩
    压缩

  2. 执行计划(Explain)
    基本语法:EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query

    hive (default)> explain select * from emp;
    hive (default)> explain select deptno, avg(sal) avg_sal from emp group by deptno;

    hive (default)> explain extended select * from emp;
    hive(default)> explain extended select deptno, avg(sal) avg_sal from emp group by deptno;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值