表优化

1.小表、大表join
将key相对分散,并且小表放在join左边,减少内存溢出的几率,也可以用mapjoin让小表先进内存,在map端完成reduce。
新版hive已经对这做了优化,大小表在join左边或者右边差不多

2.大表join大表

  • 空key过滤
    join操作在相同key数据太多时会将数据都发往相同的reducer上,导致内存不足。解析异常key,减少异常数据
  • 空key转换
    如果空key对应的数据不是异常数据,则要为空key的字段赋一个随机的值,使得数据随机均匀地分不到不同的reducer上

3.mapjoin

  • 开启mapjoin
set hive.auto.convert.join=true;
  • 大表小表的阈值设置(默认25m以下认为是小表)
set hive.mapjoin.smalltable.filesize=25000000;

4.Group by

  • 开启Map端聚合
set hive.map.aggr =true;
  • 有数据倾斜的时候进行负载均衡
set ive.groupby.skewindata=true

5.Count(Distinct)去重统计
count distinct操作需要一个reduce task来完成,使得这个reducer需要处理的数据很大,一般count distinct使用先group by 再count的方式替换

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

7.动态分区

  • 开启动态分区
set hive.exec.dynamic.partition=true
  • 设置非严格模式(严格模式下,必须指定至少一个分区为静态分区,非严格模式表示允许所有的分区字段都可以使用动态分区)
set hive.exec.dynamic.partition.mode=nonstrict
  • 在所有执行MR的节点上,最大可以创建多少个动态分区
set hive.exec.max.dynamic.partitions=1000;
  • 在每个MR执行节点上,最大可以创建多少分区
set hive.exec.max.dynamic.partitions.pernode=100;

8.并行优化
hive会将一个查询转化成一个或多个阶段,例如mr阶段、抽样阶段、合并阶段、limit阶段。如果一个job的这些阶段不是完全依赖的,可以并行执行这些阶段。

set hive.exec.parallel=true; //开启并行执行
set hive.exec.parallel.thread.number=16;//同一个sql允许最大并行度,默认为8

9.严格模式
默认是nonstrict模式
打开严格模式

set hive.mapred.mode=strict;
  • 对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。即不允许扫描所有分区
  • 对于使用order by语句的查询,要求必须使用limit语句
  • 限制笛卡尔积查询

10.推测执行
根据一定规则推测拖后腿的任务,启动一个备份任务与原任务同时处理同一份数据,并最终选用最先成功完成任务的计算结果为最终结果
在hadoop的mapred-site.xml中配置

<property>
      <name>mapreduce.map.speculative</name>
      <value>true</value>
</property>

hive也提供了配置来控制reduce-side的推测执行

<property>
      <name>hive.mapred.reduce.tasks.speculative.execution</name>
      <value>true</value>
</property>
posted @ 2020-05-23 21:01  Q1Zhen  阅读(150)  评论(0编辑  收藏  举报