$王大少

导航

hive调优

1、Fetch抓取,尽量避免hive走mapreduce。如何设置:set hive.fetch.task.conversion=more;

    在hive-default.xml.template文件hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,全局查找、

    字段查找limit查找都不走mapreduce

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=51234560;

  //设置local mr的最大输入文件个数当输入文件个数小于这个值采用local mr的方式,默认为4

  set hive.exec.mode.local.auto.input.files.max=10;

    案例实操:

    1)开启本地模式并执行查询语句

    hive (default)> set hive.exec.mode.local.auto=true; 

    hive (default)> select * from score cluster by s_id;

    18 rows selected (1.568 seconds)

    2)关闭本地模式并执行查询语句

    hive (default)> set hive.exec.mode.local.auto=false; 

    hive (default)> select * from score cluster by s_id;

    18 rows selected (11.865 seconds)

3、表的优化

  1)、小表join大表

  尽量用小表join大表,新的版本当中不存在小表join大表,还是大表join小表,因为新的版本当中默认开启了map端的join操作,
  会自动优化,不管是大表join小表,还是小表join大表,都会自动的将小表的数据加载到内存当中来

  2)、多表关联时,拆分成多个小段,避免大SQL

  3)、大表join大表时

    尽量避免无效的on条件,一定要避免笛卡尔积  

    尽量避免空 key  进行空key的过滤或者对空key进行转换

  4)、启动map端的join功能

    set hive.auto.convert.join=true 默认就是启用了
    map端数据join的一个机制:多启动一个mapTask,寻找哪个表当中的数据是小表
    设置表的数据的大小为多大是一个小表
    set hive.mapjoin.smalltable.filesize=25123456;

 4、count(distinct)  尽量转换成group  by

5、一定要避免笛卡尔积,确保我们的后面带的条件一定要生效

6、使用分区裁剪,列裁剪   查询的时候,尽量带上分区号,只取相关的字段,无关的字段不要出现在select后面

7、使用动态分区

  如果要想使用动态分区:

  partition后面的字段不需要自己手动指定了
  select里面必须出现分区字段,并且分区字段只能是最后一个出现的
  动态分区的字段值不支持中文

  INSERT overwrite TABLE ori_partitioned_target PARTITION (p_time)
  SELECT id, time, uid, keyword, url_rank, click_num, click_url, p_time
  FROM ori_partitioned;

第九个调优:控制map和reduce的个数
  控制map的个数减少
  set mapred.max.split.size=112345600;
  set mapred.min.split.size.per.node=112345600;
  set mapred.min.split.size.per.rack=112345600;
  set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

 

  使用CombineHiveInputFormat来对我们的小文件进行合并,小于100M的文件当做小文件,进行合并到一起

 

  如何控制map的个数增加 可以通过distributed by将我们的文件划到多个小文件里面去,就可以增加mapTask的个数
  set mapreduce.job.reduces =10;
  create table a_1 as
  select * from a
  distribute by rand(123);

 

  如何控制reduce的个数
  可以手动指定reduce的个数
  set mapreduce.job.reduces = 15;

第十个调优:explain查看执行计划

第十一个调优:并行执行 资源比较充足的时候,并行执行才会比较好
  select from table
  union all
  select from table

第十二个调优:hive的严格模式
  1:分区表必须带上分区字段
  2:order by 必须使用limit限制
  3: 笛卡尔积不能执行

第十三个调优:JVM的重用
  MapTask执行完成之后,分配的资源不要释放了,留给reduceTask继续使用

  会造成一个副作用,就是就算这个mapTask执行完了,没有其他的reducetask来执行了,资源也不会马上释放,得要等到job完成之后再统一释放资源

第十四个调优:关闭推测执行:
  一般直接关闭map和reduce的推测执行

第十五个:存储格式和压缩
  一般使用 textFile orc
  压缩方式: snappy

 

 

posted on 2020-04-01 17:46  $王大少  阅读(722)  评论(0编辑  收藏  举报