1)Fetch 抓取是指:Hive 中对某些情况的查询可以不必使用 MapReduce 计算。
hive.fetch.task.conversion 默认是 more,老版本 hive 默认是 minimal,该属性修改为 more 以后,在全局查找、字段查找、limit 查找等都不走 mapreduce。
2)本地模式:设置hive.exec.mode.local.auto 的值为 true
3)开启MapJoin:set hive.auto.convert.join = true默认为true
大表小表的阈值设置(默认 25M 一下认为是小表)
set hive.mapjoin.smalltable.filesize=25000000;
4)开启 Map 端聚合参数设置
是否在 Map 端进行聚合,默认为 True :hive.map.aggr = true
在 Map 端进行聚合操作的条目数目hive.groupby.mapaggr.checkinterval = 100000
有数据倾斜的时候进行负载均衡(默认是 false) hive.groupby.skewindata = true
5)count(Distinct) 去重统计在数据量大的情况下用group by 再用count 替换。
6)迪卡尔积,默认是关闭的。
7)行列过滤
列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。
行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。
8)采用分桶技术
分区针对的是数据的存储路径;分桶针对的是数据文件。
创建:clustered by(id) into 4 buckets 分桶字段必须是创建表中的字段
开启分桶设置:set hive.enforce.bucketing=true;
设置reducetask个数:set mapreduce.job.reduces=-1;与分桶数一致
9)采用分区技术
创建:partitioned by (month string) 分区字段不能是创建表中的字段
partitioned by (month string, day string)二级分区
开启动态分区参数设置
(1)开启动态分区功能(默认 true,开启) hive.exec.dynamic.partition=true
(2)设置为非严格模式(动态分区的模式,默认 strict,表示必须指定至少一个分区为
静态分区,nonstrict 模式表示允许所有的分区字段都可以使用动态分区。)
hive.exec.dynamic.partition.mode=nonstrict
(3)在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。
hive.exec.max.dynamic.partitions=1000
(4)在每个执行 MR 的节点上,最大可以创建多少个动态分区。该参数需要根据实际
的数据来设定。比如:源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就 需要设置成大于 365,如果使用默认值 100,则会报错。
hive.exec.max.dynamic.partitions.pernode=100
(5)整个 MR Job 中,最大可以创建多少个 HDFS 文件。
hive.exec.max.created.files=100000
(6)当有空分区生成时,是否抛出异常。一般不需要设置。
hive.error.on.empty.partition=false
10)合理设置Map数
Maptask个数:input的文件总个数,input的文件大小,集群设置的文件块大小。
computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M 公式通过调整三个值的大小调整map数。
11)小文件进行合并
在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。
12)合理设置Reduce数
(1)每个 Reduce 处理的数据量默认是 256MB
hive.exec.reducers.bytes.per.reducer=256000000
(2)每个任务最大的 reduce 数,默认为 1009
hive.exec.reducers.max=1009
(3)计算 reducer 数的公式
N=min(参数 2,总输入数据量/参数 1)
在 hadoop 的 mapred-default.xml 文件中修改,设置每个 job 的 Reduce 个数
set mapreduce.job.reduces = 15;
13)开启sql并行执行:
set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16; //同一个 sql 允许最大并行度,
默认为 8。
14)开启严格模式:
设置hive.mapred.mode 值为 strict,默认为nonstrict非严格模式。
严格模式下的禁止查询:笛卡尔积、order by 后必须使用limit、分区表查询条件必须包含分区字段来限定分区。
15)JVM重用:
mapred-site.xml 文件中进行配置mapreduce.job.jvm.numtasks=10
16)开启推测执行
Hadoop 的 mapred-site.xml 文件中进行配置
mapreduce.map.speculative=true
mapreduce.reduce.speculative=true
hive 本身也提供了配置项来控制 reduce-side 的推测执行:
hive.mapred.reduce.tasks.speculative.execution=true
17)执行计划(Explain)
查看详细执行计划:explain extended select * from emp;
18)常用参数
// 输出合并小文件
SET hive.merge.mapfiles = true; -- 默认true,在map-only任务结束时合并小文件
SET hive.merge.mapredfiles = true; -- 默认false,在map-reduce任务结束时合并小文件
SET hive.merge.size.per.task = 268435456; -- 默认256M
SET hive.merge.smallfiles.avgsize = 16777216; -- 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
19)使用tez引擎
tez是基于内存进行计算的