Map数
1 | mapred.map.taskes=10; |
使用complex type array 和 map 类型
创建表时指定类型和分隔符
1 | create table test1 |
文件中按照表定义的分隔符来分割,字段的分隔符默认为^A,可以在建表时通过 FIELDS TERMINATED BY ‘^A’ 指定
1 | cat /home/hadoop/hivetest1.txt |
把文件 load 到表中
load data local inpath '/home/hadoop/hivetest1.txt' into table test1;
在查询中使用array 和 map 类型
select f1[0],f2['aa'] from test1;
select * from test1 where f1[0]=11 and f2['aa']=1;
处理json字符串
create table test(json_str string);
test表的json_str字段的内容为:
1 | {"a":"1","b":"2","c":["aa","11",{"aaa":"111","bbb":"222"}]} |
动态分区
1 | set hive.exec.dynamic.partition=true; |
另外,如果默认值不够大,根据需要调大以下三个参数,否则会报错
1 | set hive.exec.max.dynamic.partitions=2000 |
这样,从另外一个表把数据导入到目标表时,就会自动按照指定字段分区。
例如:
insert overwrite table A partition(reportdate) select * from B;
表A要先创建,并且以reportdate作为分区的字段。在上面sql中不用指定reportdate的值(如果是非动态分区则需要指定)。表B最后一个字段作为分区的字段,会自动根据最后一个字段的值自动分区。
map join 优化
将hive.auto.convert.join设置为true
set hive.auto.convert.join=true;
设置进行mapjoin的小表的阈值(即当小表的大小 少于 一定该阈值时 hive 会做 mapjoin 优化,如果不设置,则采用默认值)
1 | set hive.mapjoin.smalltable.filesize=25000000; |
每一个key有多少个value值缓存在内存中hive.mapjoin.cache.numrows=25000
有多少行cache在内存中
insert into/overwrite多表插入的优化
通过对原表扫描一遍,插入到不同的目的表中
1 | from table |
对limit语句的优化
1 | hive.limit.optimize.enable=false |
对reduce个数的设置
hive默认是根据输入的大小来设置,每个reducer处理的数据量是1G。如果有10G的输入数据,则hive自动生成10个reducer。
默认情况下一个reducer处理1G的数据,这样一个reducer处理的数据量太大,可以改小一些。
1 | hiive.exec.reducers.bytes.per.reducer=1G |
数据倾斜优化
有编译器的优化和运行期的优化
1 | hive.groupby.skewindata=false |
文件压缩
1 | 中间压缩就是处理hive查询的多个job之间的数据,对于中间压缩,最好选择一个节省CPU耗时的压缩方式 |
并行执行
一个hive sql语句编译成多个MR作业,没有依赖关系的作业可以并行执行。
1 | hive.exec.parallel=false |
合并结果的小文件
对于hive的结果中是小文件的,会再起一个MR作业合并小文件。
1 | hive.merge.mapfiles=true |
推断执行
1 | hive.mapred.reduce.tasks.speculative.execution=true |
设置reduce个数
显示设置reduce的个数,或者每个reduce处理的数据的大小(默认1G的值很多时候有些大,可以设置小一些,同时reduce的内存也要相应小一些,提高并行度)。
1 | mapred.reduce.tasks=-1 |
map端聚合
hive.map.aggr=true
group by语句时现在map聚合一次,减少传输到reduce的数据,就是mapreduce的combiner。默认是打开的。
列剪裁
列剪裁优化,只对需要的列进行处理,忽略其他的列,减少数据的处理量。默认是打开的。
hive.optimize.cp=true
本地模式
一些sql处理的数据量比较少,或者计算量比较少,可以在本地运行而不是MR作业运行,这样性能会更好些,也节约hadoop集群的资源。
1 | hive.exec.mode.local.auto=false |
当一个job满足如下条件会使用本地模式:
①job的输入数据大小必须小于:
hive.exec.mode.local.auto.inputbytes.max (默认128)
②job的map数必须小于参数:
hive.exec.mode.local.auto.tasks.max (默认4)
③job的reduce数必须为0或者1
测试模式
1 | hive.test.mode=false |
用于测试,通过采样减少输入的数据,结果表前面加前缀“test_”
严格模式
1 | hive.mapred.mode=nonstrict |
通过严格模式,使一些不严格的用法不通过,防止潜在的错误。
No partition being picked up for a query.
Comparing bigints and strings.
Comparing bigints and doubles.
Orderby without limit.
jvm重用
JVM重用是hadoop调优参数的内容,对hive的性能具有非常大的 影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。hadoop默认配置是使用派生JVM来执行map和 reduce任务的,这是jvm的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况。
JVM重用可以使得JVM实例在同一个JOB中重新使用N次,N的值可以在Hadoop的mapre-site.xml文件中进行设置
1 | mapred.job.reuse.jvm.num.tasks |
也可在hive的执行设置:1
set mapred.job.reuse.jvm.num.tasks=10;
JVM的一个缺点是,开启JVM重用将会一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡“的job中有几个 reduce task 执行的时间要比其他reduce task消耗的时间多得多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。
hive参数优化之默认启用本地模式
启动hive本地模式参数,一般建议将其设置为true,即时刻启用:1
2hive (chavin)> set hive.exec.mode.local.auto;
hive.exec.mode.local.auto=false
推测执行相关配置
1 | hive (default)> set mapred.map.tasks.speculative.execution; |
单个mapreduce中运行多个group by
参数hive.multigroupby.singlemr控制师徒将查询中的多个group by组装到单个mapreduce任务中。如果启用这个优化,那么需要一组常用的group by键:1
2
3
4
5
6
7
8
9
10
11
12
13例子:
select Provice,city,county,count(rainfall) from area where data="2018-09-02" group by provice,city,count
select Provice,count(rainfall) from area where data="2018-09-02" group by provice
#使用multi group by
from area
insert overwrite table temp1
select Provice,city,county,count(rainfall) from area where data="2018-09-02" group by provice,city,count
insert overwrite table temp2
select Provice,count(rainfall) from area where data="2018-09-02" group by provice
聚合优化:
启用参数:hive.map.aggr=true
默认开启
参数hive.fetch.task.conversion的调优:
默认值:hive.fetch.task.conversion=minimal
建议值:set hive.fetch.task.conversion=more;
原理:
对于简单的不需要聚合的类似 SELECT
内表转外表
1 | ALTER TABLE xxx SET TBLPROPERTIES ('EXTERNAL'='TRUE'); |
参考:
https://www.cnblogs.com/duanxingxing/p/4535842.html
https://blog.csdn.net/z_l_l_m/article/details/8773505
http://www.cnblogs.com/yshb/p/3147710.html