• Hive 企业调优


    9.企业级调优

    9.1 Fetch 抓取

    • Fetch 抓取:Hive 中对某些情况的查询可以不必使用 MapReduce 计算;
      • hive.fetch.task.conversion:more

    9.2 本地模式

    • 大多数的 Hadoop Job 是需要 Hadoop 提供完整的可扩展性来处理大数据集的。不过,有时 Hive 的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive 可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
      • hive.exec.mode.local.auto:true

    9.3 表的优化

    9.3.1 小表Join大表

    • 实际测试发现:新版的 hive 已经对小表JOIN大表和大表JOIN小表进行了优化,小表放在左边和右边已经没有明显区别;

    9.3.2 大表Join大表

    • 第一种方式:查询之前,过滤Null
      • select n.* from (select * from nullidtable where id is not null) n left join bigtable o on n.id = o.id;
    • 第二种方式:给Null的赋值
      • 需要避免数据倾斜,所以使用rand()
      • select n.* from nullidtable n full join bigtable o on case when n.id is null then concat('hive', rand()) else n.id end = o.id;

    9.3.3 MapJoin

    • 如果不指定 MapJoin 或者不符合 MapJoin 的条件,那么 Hive 解析器会将 Join 操作转换成 Common Join,即:在Reduce阶段完成join,容易发生数据倾斜。可以用 MapJoin 把小表全部加载到内存,在 map 端进行 join,避免 reducer 处理。
    • 开启MapJoin参数设置:
      • 开启自动选择 MapJoin:set hive.auto.convert.join=true;,默认为true;
      • 设置大表小表的阈值(默认25M 以下就是小表): set hive.mapjoin.smalltable.filesize=25000000;
    • MapJoin 工作机制:

    9.3.4 Group By

    • 默认情况下,Map 阶段同一 Key 数据分发给一个 reduce,当一个 key 数据过大时,就可能发生数据倾斜;
    • 并不是所有的聚合操作都需要在 Reduce 端完成,很多聚合操作都可以现在 Map 端进行部分聚合,最后在 Reduce 端得出最终结果。
    • 开启 Map 端聚合参数设置:
      • 是否在 Map 端进行聚合,默认为true:hive.map.aggr=true;
      • 在 Map 端进行聚合操作的条目数目:hive.groupby.mapaggr.checkinterval=100000;
      • 有数据倾斜的时候,进行负载均衡:hive.groupby.skewindata=true;

    9.3.5 Count(Distinct)去重统计

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

    9.3.6 动态分区调整

    • 关系型数据库中,对分区表Insert数据的时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive 中也提供了类似的机制,即动态分区(Dynamic Partition);
    • 开启动态分区参数设置:
      • 开启动态分区功能,默认为true:hive.exec.dynamic.partition=true;
      • 设置为非严格模式(默认为strict,即必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区): hive.exec.dynamic.partition.mode=nonstrict;
      • 在所有执行 MR 的节点上,最大一共可以创建多少个动态分区:hive.exec.max.dynamic.partitions=1000;
      • 在每个执行 MR 的节点上,最大可以创建多少个动态分区:hive.exec.max.dynamic.partitions.pernode=100;
      • 整个 MR Job中,最大可以创建多少个HDFS文件:hive.exec.max.created.files=100000;
      • 当有空分区生成时,是否抛出异常:hive.error.on.empty.partition=false;
  • 相关阅读:
    cmd net use
    Linux虚拟机安装VMware Tools
    转:完成端口(Completion Port)详解
    很幽默的讲解六种Socket IO模型
    重新学习二叉树作的几道习题
    RuntimeException和Exception区别
    不同概率的抽奖
    SpringMVC的几种返回方式
    mybatis动态sql trim
    Tomcat 7最大并发连接数的正确修改方法
  • 原文地址:https://www.cnblogs.com/linkworld/p/11066416.html
走看看 - 开发者的网上家园