1.fetch抓取
某些情况查询不必使用mapreduce
# 执行mr
set hive.fectch.task.conversion=none;
# 不执行mr
set hive.fectch.task.conversion=more;
2. 本地查询
小数据集不惜要启动集群,在单台机器上处理任务:
set hive.exex.mode.local.auto=true;
3.mapjoin
如果不指定map端join或者不符合map端join条件,hive解析器在reduce阶段完成join,容易数据倾斜,可以使用map端join将小表全部加载到内存在map端join避免reduce。
# 设置map join(高版本默认是true)
set hive.auto.convert.join=true;
# 大表小表阈值设置
set hive.mapjoin.smalltable.filesize=25123456;
4.group by
默认情况,map阶段同一个key数据发给一个reduce,如果一个Key数据过大就会数据倾斜,并不是所有聚合操作在reduce端完成,在map端也可以。类似规约
# map端聚合,默认true
set hive.map.aggr=true;
# map端聚合操作的条目数量
set hive.groupby.mapaggr.checkinterval=100000;
# 数据倾斜时候负载均衡,默认false
set hive.groupby.skewindata=true;
5.COUNT(DISTINCT)
count distinct 需要用一个reduce task完成,
一般先用group by再用count
6.尽量避免笛卡尔积
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.并行执行
set hive.exec.parallel =true;