0
点赞
收藏
分享

微信扫一扫

1007-Hive性能调优


1、什么时候可以避免执行MapReduce?
select *  or  select field1,field2 
limite 10
where语句中只有分区字段
使用本地set hive.exec.mode.local.auto=true;

1.1 分区表结构


hive (mydb)> desc access_log;
OK
col_name        data_type       comment
uid                     int                     None               
ip                      string                  None               
url                     string                  None               
day                     string                  None               
prov                    string                  None               
                
# Partition Information         
# col_name              data_type               comment            
                
day                     string                  None               
prov                    string                  None




1.2 验证 select *  or  select field1,field2  不走MR



hive (mydb)> select * from access_log where prov="hebei"; 
OK
uid     ip      url     day     prov
700     192.168.2.25    http://www.baidu1.com   20150726        hebei
800     192.168.2.25    http://www.baidu1.com   20150726        hebei
900     192.168.2.26    http://www.baidu1.com   20150726        hebei





hive (mydb)> select *        
OK
uid     ip      url     day     prov
100     192.168.2.20    http://www.baidu1.com   20150726        beijing
200     192.168.2.21    http://www.baidu2.com   20150726        beijing
300     192.168.2.22    http://www.baidu2.com   20150726        beijing
400     192.168.2.23    http://www.baidu3.com   20150726        beijing
500     192.168.2.24    http://www.baidu.com    20150726        beijing
600     192.168.2.24    http://www.baidu.com    20150726        beijing
700     192.168.2.25    http://www.baidu1.com   20150726        hebei
800     192.168.2.25    http://www.baidu1.com   20150726        hebei
900     192.168.2.26    http://www.baidu1.com   20150726        hebei





1.3 验证limit不走MR



 limit 2;
OK
uid     ip      url     day     prov
100     192.168.2.20    http://www.baidu1.com   20150726        beijing
200     192.168.2.21    http://www.baidu2.com   20150726        beijing




2、group by语句:
通常和聚合函数一起使用,按照一个或者多个列对结果进行分组,然后对每组执行聚合操作



3、having语句:
限制结果的输出




4、hive将查询转化为MapReduce执行,hive的优化可以转化为mapreduce的优化!


5、hive是如何将查询转化为MapReduce的?

6、EXPLAIN的使用
hive对sql的查询计划信息解析
EXPLAIN SELECT COUNT(1) FROM T1;
EXPLAIN EXTENDED
显示详细扩展查询计划信息




7、本地mr


使用场景: 一般针对小数据开发测试的时候,我们常常设置本地模式,这样可以提高本地开发的效率。


主要的原因: 主要提高本机的CPU,内存利用率。



本地模式设置方式:
set mapred.job.tracker=local;
set hive.exec.mode.local.auto=true;
测试  select uid,ip,url from access_log;

主要默认情况下max 比较有限,很需要注意设置max=128M
下面两个参数是local mr中常用的控制参数:
1)hive.exec.mode.local.auto.inputbytes.max默认134217728
设置local mr的最大输入数据量,当输入数据量小于这个值的时候会采用local  mr的方式。如果超出改数量就会变成服务端的MR



2)hive.exec.mode.local.auto.input.files.max默认是4
设置local mr的最大输入文件个数,当输入文件个数小于这个值的时候会采用local mr的方式




8、并行计算


当处理文件时候,分成多个阶段执行,那么我们开启并行计算



开启并行计算,增加集群的利用率
set hive.exec.parallel=true

9、设置严格模式
set hive.mapred.mode=strict | nostrict;
strict可以禁止三种类型的查询:
一、强制分区表的where条件过滤: 即对于分区表,必须设置strict,主要目的防止全部查询表数据
二、Order by语句必须使用limit
三、限制笛卡尔积查询



10、调整mapper和reducer的数量


太多map导致启动产生过多开销
按照输入数据量大小确定reducer数目,


set mapred.reduce.tasks=  默认3

dfs -count  /分区目录/*

hive.exec.reducers.max设置阻止资源过度消耗


11、JVM重用
小文件多或task多的业务场景
set mapred.job.reuse.jvm.num.task=10
会一直占用task槽



12、排序语句


order by 语句:     是全局排序


sort by 语句:          是单reduce排序


distribute by语句:     是分区字段排序;



cluster by语句:


可以确保类似的数据的分发到同一个reduce task中,并且保证数据有序防止所有的数据分发到同一个reduce上,导致整体的job时间延长



cluster by语句的等价语句:


distribute by Word sort by Word ASC


order by



select * from access_log sort  by uid desc limit 4;



distribute by prov sort by prov


<=>select * from access_log  cluster by  prov limit 4;




13、Map-side聚合



set hive.map.aggr=true;
这个设置可以将顶层的聚合操作放在Map阶段执行,从而减轻清洗阶段数据传输和Reduce阶段的执行时间,提升总体性能。实际上就是MapReduce中CombinerFileInputFormat ,需要查看MapReduce的源码看



缺点:该设置会消耗更多的内存。
执行select count(1) from wlan;



数据倾斜?


 K值不均分配,会导致数据倾斜,一般会发生在reduce端,可以通过在map端设置就可以防止数据倾斜。


(2)如何导致的数据倾斜


K值出现空值


(3) 如何防止数据倾斜


14、jion优化


1、驱动表最右边
     1.1 查询表表的大小从左边到右边依次增大


2、标志机制


2.1 显示的告知查询优化器哪张表示大表
2.2 /*+streamtable(table_name)*/


15、表连接     (只支持等值连接)


(1) INNER JOIN
     两张表中都有,且两表符合连接条件
     select t1.name,t1.age,t9.age from t9 join t1 on t1.name=t9.name;
(2)LEFT OUTER JOIN
     左表中符合where条件出现,右表可以为空
(3)RIGHT OUTER JOIN
     右表中符合where条件出现,左表可以为空
(4)FULL OUTER JOIN
     返回所有表符合where条件的所有记录,没有NULL替代
(5)LEFT SEMI-JOIN
     左表中符合右表on条件出现,右表不出现
(6)select t1.name,t1.age from t9 LEFT SEMI JOIN t1 on t1.name=t9.name;
(7)笛卡尔积
     是m x n的结果
(8)map-side JOIN
     只有一张小表,在mapper的时候将小表完全放在内存中
     select /*+ mapjoin(t9) */t1.name,t1.age from t9 JOIN t1on t1.name=t9.name;

举报

相关推荐

0 条评论