赞
踩
Hive调优:
对分析的数据选择合适的「存储格式」与「压缩方式」能提高hive的分析效率
数据的压缩格式:
数据的存储格式:
创建分区表、桶表、拆分表
Hive参数优化
不执行MR:
Hive.fetch.task.conversion 默认为minimal 修改配置文件hive-site.xml <property> <name>hive.fetch.task.conversion</name> <value>more</value> <description> Some select queries can be converted to single FETCH task minimizing latency.Currently the query should be single sourced not having any subquery and should not have any aggregations or distincts (which incurrs RS), lateral views and joins. 1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only 2. more : SELECT, FILTER, LIMIT only (+TABLESAMPLE, virtual columns) </description> </property> 或者当前session修改 hive> set hive.fetch.task.conversion=more; 执行SELECT id, money FROM m limit 10; 不走mr
并行执行:
// 开启任务并行执行
set hive.exec.parallel=true;
// 同一个sql允许并行任务的最大线程数
set hive.exec.parallel.thread.number=8;
JVM 重用:
set mapred.job.reuse.jvm.num.tasks=10;
设置reduce的数目:
reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定:
调整reduce个数的方法:
set hive.exec.reducers.bytes.per.reducer=500000000; (500M)
set mapred.reduce.tasks = number
reduce个数并不是越多越好; 同map一样,启动和初始化reduce也会消耗时间和资源; 另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题
优化SQL查询
where条件优化:
select m.cid,[u.id](http://u.id/) from order m join customer u on( m.cid =[u.id](http://u.id/) )where m.dt='20180808'
select m.cid,[u.id](http://u.id/) from (select * from order where dt='20180818') m join customer u on( m.cid =[u.id](http://u.id/));
union优化:
count distinct优化:
select count(1) from (select id from tablename group by id) tmp;
用 in 来代替 join:
select id,name from tb1 a join tb2 b on([a.id](http://a.id/) = [b.id](http://b.id/));
select id,name from tb1 where id in(select id from tb2); in 要比join 快
消灭子查询内的 group by 、 COUNT(DISTINCT),MAX,MIN。 可以减少job的数量
join 优化:
数据倾斜:
表现:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大
原因:某个reduce的数据输入量远远大于其他reduce数据的输入量
解决方案:
set hive.map.aggr=true //map端部分聚合,相当于combiner
set hive.groupby.skewindata=true
熟悉数据分布,优化SQL逻辑,找到数据倾斜的原因
合并小文件
小文件的产生有三个地方,map输入,map输出,reduce输出,小文件过多也会影响hive的分析效率:
set mapred.max.split.size=256000000;
//一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
set mapred.min.split.size.per.node=100000000;
//一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)
set mapred.min.split.size.per.rack=100000000;
//执行Map前进行小文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
//设置map端输出进行合并,默认为true
set hive.merge.mapfiles = true
//设置reduce端输出进行合并,默认为false
set hive.merge.mapredfiles = true
//设置合并文件的大小
set hive.merge.size.per.task = 256*1000*1000
//当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
set hive.merge.smallfiles.avgsize=16000000
查看HQL执行计划:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。