大数据复习-hive

一、hive建表优化
分区表:将表中的数据按照指定的规则份文件夹管理。
分桶表:对hive表分桶可以将表中记录按分桶键(字段)的哈希值分散进多个文件中,这些小文件称为桶。桶以文件为单位管理数据。分区针对的是数据的存储路径,分桶针对的是数据文件。如果查询的维度是分桶字段,查询的时候先确定数据所在的桶,提升查询效率。
进行join的时候,关联字段就是分桶字段,只有相同的桶之间的数据进行关联,从而提升关联效率。
设置下set hive.enforce.bucketing=true
set mapreduce.job.reduces=-1;
注意:hive.enforce.bucketing为true时,reduce要设为-1;
hive.enforce.bucketing为false时,reduce要设为和分桶数一致
如果是用spark引擎,预估一下,单个桶的数据存储空间不要导致executor内存溢出就行,一般一个桶几百兆比较合理,因为插入分桶表的reducer个数和分桶个数是相等的
二、hive存储优化
hive支持的存储格式主要有textfile,sequencefile(行存储,适合select ),orc,parquet(列存储,适合count(),sum()等)。
压缩格式:deflate,gzio,bzip2,lzo,snappy
三、语法优化
1.列裁剪与分区裁剪
列裁剪就是查询时只读取需要的列,分区裁剪就是只读取需要的分区。
2.group by
默认情况下,map阶段同一key分发给一个reduce,当一个key数据过大时就倾斜了。
优化:
并不是所有的聚合操作都需要在reduce端完成,很多聚合操作都可以在map端进行部分聚合,最后在reduce端得出最终结果。
(1)开启map端聚合参数设置
set hive.map.aggr=true;
(2)在map端进行聚合操作的条目数目。
set hive.groupby.mapaggr.checkinterval=100000
(3)有数据倾斜的时候进行负载均衡(默认是false)
set hive.groupby.skewindata=true
当选项为true时,生成的查询计划会有两个mr job
第一个mr job 中,map的输出结果会随机分布到reduce中,每个reduce做部分聚合操作,并输出结果,这样处理的结果是相同的group by key 有可能被分发到不同的reduce中,从而达到负载均衡的目的。
第二个mr job再根据预处理的数据结果按照group by key 分布到reduce中(这个过程可以保证相同的group by key 被分布到同一个reduce中),最终完成最终的聚合操作(虽然可以解决数据倾斜,但是不能让运行速度更快)
(4)矢量计算技术
vectorization技术以设置批处理的增量大小为1024行单词来达到比单条记录单词获得更高的效率
set hive.vectorized.execution.enabled = true;
(5)多重模式
from student
insert int t_ptn partition(city=a) select id,name,sex,age where city = a
insert int t_ptn partition(city=a) select id,name,sex,age where city = b
(6)in/exists语句
select a.id,a.name from a where a.id in (select b.id from b)
select a.id,a.name from a where exists(select id from b where a.id=b.id)
利用left semi join 优化
select a.id,a.name from a left semi join b on a.id = b.id
(7)cbo优化
(8)谓词下推
先执行where
set hive.optimize.ppd =true
(9)mapjoin
map join是将join双方比较小的表直接分发到各个map进程的内存中,在map进程中进行join 操作,这样就不用进行reduce操作,从而提高了速度。如果不指定mapjoin或者不符合mapjoin的条件,那么hive解析器会将join操作转换成common join,即在reduce阶段完成join,容易发生数据倾斜。可以用mapjoin把小表全部加载到内存,在map端进行join,避免reducer处理。
set hive.auto.convert.join = true
set hive.mapjoin.snakktable.filesize =2500000
(10)smb join大表join大表
set hive.optimize.bucketmapjoin=true
set hive.optimize.buckmapjoin.sortedmerge=true
set hive.input.format=org.apache.hadoop.hive.ql.io.bucketizehiveinputformat;
(11)笛卡尔积
join 不加on条件,或者on条件无效会产生笛卡尔积,严格模式可以避免
四、数据倾斜
巨大多数任务很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败,这样的现象称为数据倾斜。导致数据倾斜的原因在于按照key分组以后,少量的任务负责绝大部分数据的计算,也就是说产生数据倾斜的hql中一定存在分组操作,那么从HQL的角度,我们可以把数据倾斜分为单表携带了groupby字段的查询和两表或者多表join的查询。
(1)单表数据倾斜使用参数
当任务中存在group by操作同时聚合函数为count或者sum可以设置参数来处理数据倾斜问题。

    ①开启map端聚合参数设置
    set hive.map.aggr=true;
    ②在map端进行聚合操作的条目数目。
    set hive.groupby.mapaggr.checkinterval=100000
    ③有数据倾斜的时候进行负载均衡(默认是false)
    set hive.groupby.skewindata=true
    当选项为true时,生成的查询计划会有两个mr job

调整reduce个数方法一
set hive.exec.reducers.bytes.per.reducer=256000000
set hive.exec.reducers.max = 1009
N=min(参数2,总输入数据量/参数1)(参数2 指的是上面的1009,参数1值得是256M)
调整reduce个数方法二
set mapreduce.jon.reduces=15
(2)多表产生数据倾斜
在编写join查询语句时,如果确定是由于join出现的数据倾斜

# join的键对应的记录条数超过这个值会进行分拆,根据具体数据设置
 set hive.skewjoin.key=100000
 #如果是join过程中出现倾斜应该设置为true
 set hive.optimize.skewjoin=false

如果开启了,在join过程中hive会将计数超过阈值hive,skewjoin.key(默认100000)的倾斜key对应的行临时写进文件中,然后再启动另一个job做map join生成结果。通过hive.skewjoin.mapjoin.map.tasks参数还可以控制第二个job的mapper数量,默认10000

set hive.skewjoin.mapjoin.map.tasks=10000

如果是大表join小表,用mapjoin

五、hive job优化
hive map优化
(1)复杂文件增加map数
当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。
computeslitesize(math.max(minsize,math.min(maxsize,blocksize)))=blocksize=128m公式,调整maxsize最大值。让maxsize最大值低于blocksize就可以增加map的个数。
set mapreduce.input.fileinputformat.split.maxsize=100
(2)小文件合并
①在map执行前合并小文件,减少map数。combinehiveinputformat具有对小文件进行合并的功能(系统默认的格式)。hiveinputformat没有对小文件合并功能。
②在map-reduce的任务结束时合并小文件的设置:
在map-only任务结束时合并小文件,默认true
set hive.merge.mapfiles=true
在map-reduce任务结束时合并小文件,默认false
set hive.merge。mapredfiles =true
合并文件的大小,默认256M
set hive.merge.size.per.task =268435456
当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
set hive.merge.smallfiles.avgsize=16777216
(3)map端聚合
set hive.map.aggr=true,相当于map端执行combiner
(4)推测执行
set mapred.map.tasks.speculative.execution=true
hive reduce优化
(1)合理设置reduce数
reduce数并不是越多越好,过多的启动和初始化reduce也会消耗时间和资源,另外有多少个reduce就会有多少个输出文件,如果生成了很多个小文件,纳闷如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题
在设置reduce个数的时候也需要考虑这两个原则,处理大数据量利用合适的reduce数,使得单个reduce任务处理数据量大小要合适。
(2)推测执行
hive整体优化
(1)fetch抓取
fetch是指HIVE中对某些情况的查询可以不必使用mapreduce计算,例如select * from emp ,在这种情况下,hive可以简单的读取emp对应的存储目录下的文件,然后输出查询结果到控制台。比如全局查找,字段查找,limit查找等。
(2)本地模式大多数的hadoop job 是需要hadoop提供完整的可拓展性来处理大数据集的。不过,有时hive的输入数据量是非常小。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行之间要多得多。对于大多数这种情况,hive可以通过本地模式在单台机器上处理所有的任务,对于小数据集,执行时间可以被明显的缩短。
(3)并行执行
数据量大,sql长的时候使用。默认情况下,HIVE一次只会执行一个阶段,不过,某个特定的job可能包含众多的阶段,而这些阶段可能并非完全互相依赖,也就是说有些阶段是可以并行执行的,这样可能使得整个job的执行时间缩短。不过,如果有更多的阶段可以并行执行,那么job可能就越快完成。
(4)严格模式
①分区表不使用分区过滤
除非where语句中含有分区字段来过滤条件来限制范围,否则不允许执行。不允许用户扫描所有分区。
②使用order by 没有limit过滤
使用order by,必须使用limit语句
③限制笛卡尔积
④jvm重用
小文件过多的时候使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值