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;