hive调优
explain select count(*) from table_name;
explain extended select count(*) from table_name;
核心思想
-
把hive sql当作mapreduce程序去优化
-
以下sql 不会转为Mapreduce来执行 select 及查询本表字段,where仅对本表字段条件过滤
hive对某些情况的查询不需要使用map reduce
1.抓取策略 set hive.fetch.task.conversion=none/more;
默认值为more;设为none后,单表查询时mapreduce任务;
本地模式快的原因
2. 本地执行
- set hive.exec.mode.local.auto=true;
- hive.exec.mode.local.auto.inputbytes.max=128m;
- 超过最大值,依然时集群模式;
3. 并行执行
- set hive.exec.parrallel=true
- hive.exec.parallel.thread.number
4. 严格模式
- 严格模式下,指定了分区表,查询必须使用分区
- 严格模式的order by 必须使用limit,会导致数据倾斜
- 限制笛卡尔积的查询
5. 排序
- order by 对于查询结果进行全排序,只允许一个reduce处理,数据量大时,慎用,必须结果limit使用
- sort by 对于单个reduce的数据进行排序;
- distribute by 分区排序,经常和sort by结合使用
- cluster by 相当于 distribute by +sort by
- 不能通过asc ,desc的方式指定排序规则
6. Join优化
-
Map join 在map端完成join;
-
sql方式 select /*+ MAPJOIN(small table)*/,bigtable.value from smalltable join bigtable on smalltable.v = bigtable.v;
-
开启自动mapjoin
-
set hive.auto.convert.join=true;
- 自动对左边的表进行统计,如果是小表就加入内存,即对小表使用map join;
-
hive.mapjoin.smalltable.filesize
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9AULnLI6-1616810889480)(C:\Users\xiaoq\AppData\Roaming\Typora\typora-user-images\1616505290563.png)]
-
hive.ignore.mapjoin.hint (默认true) 默认听自动的话
-
-
-
大表join大表
- 空key过滤,分析异常key,减少key-v的数量,sql过滤异常key
- 空key转换,某个key为空对应的数据很多,相应的数据非异常数据,必须包含在join的结果中,key为空的字段随机赋值随机值,使数据随机均匀分配到不同reduce上
-
Map-site聚合–Map–combine类–map端的reduce
- set hive.map.aggr=true;
- hive.groupby.mapaggr.checkinterval
- map端group by执行聚合时处理的多少行数据(默认100000)
- hive.map.aggr.hash.min.reduction
- 进行聚合的最小比例,预先对10w条数据做聚合,若聚合之后的 数据量/10w>该配置(默认值0.5),则不会聚合(默认值0.5)
- hive.map.aggr.hash.percentmemory
- map端聚合使用的内存最大值
- hive.groupby.skewindata
- 是否对groupby产生的数据倾斜做优化,默认false;
9. 合并小文件
-
文件数目小,文件存储造成压力,给hdfs造成压力,影响效率
-
设置合并属性
- 合并map输出文件:hive.merge.mapfiles=true ( 默认true)
- 合并reduce输出文件:hive.merge.mapredfiles=true (默认false)
- 合并文件大小:hive.merge.size.per.task=256*1000*1000 (超过就不merge)
-
去重统计
- 数据量小的时候无所谓,数据量大的情况下,由于count distinct操作需要用一个reduce task来完成,这一个reduce需要处理的数据量太大,就会导致job很难完成,一般count distinct 使用先group by 在count的方式替换
-
控制hive中map以及reduce的数量
task -->node–>rack
- Map数量相关的参数
- mapred.max.split.size —split的最大值,及每个map处理文件的最大值
- mapred.min.split.size.per.node —一个节点上split的最小值
- mapred.min.split.size.per.rack —一个机架上split的最小值
- Reduce数量相关的参数
- mapred,reduce.tasks —强制reduce任务的数量
- hive.exec.reducers.bytes.reducer —每个reduce任务处理的数据量
- hive.exec.reducers.max —每个任务最大的reduce数
- Map数量相关的参数
-
JVM重用
- 适用场景
- 小文件个数过多
- task个数过多
- set mapred.job.reuse.jvm.num.task=n
- 缺点:设置开启后,task插槽会一直占用资源,不论是否有task运行,直到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源;
- 适用场景