hive的优化方式

一、常见的Hive的优化方式有哪些
开启执行计划
➢explain select …
Fetch模式
➢默认是开启的,开启后在全局查找、字段查找、limit查找等都不走MapReduce
本地模式
➢数据量小的时候通过本地模式在单台机器上处理所有的任务
//开启本地mr
set hive.exec.mode.local.auto=true;
//设置 local mr 的最大输入数据量,当输入数据量小于这个值时采用 local mr 的方式
//默认为 134217728,即 128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;
//设置 local mr 的最大输入文件个数,当输入文件个数小于这个值时采用 local mr 的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=8;

并行执行
➢当某个job包含众多的阶段且这些阶段不是完全互相依赖的,就可以并行执行,以缩短整个job的执行时间
set hive.exec.parallel=true;//打开任务并行执行
set hive.exec.parallel.thread.number=16;//设置最大并行度,默认为8

严格模式
➢默认是严格模式,是为了防止用户执行会产生意外影响的查询。严格模式可以限制以下几点

不允许扫描所有分区,防止全表扫描消耗过大的资源
orderby必须使用limit语句,orderby会将数据分发到同一个Reducer里,强制使用limit可以防止Reducer额外执行很长一段时间
限制笛卡尔积查询。因为Hive不会把where语句转化为on语句
JVM重用
➢默认配置是使用派生的JVM来执行任务,这种方式下JVM的启动过程会造成很大的开销,尤其是task很多的情况。JVM实例的使用次数可以在hadoop的mapred-site.xml文件中进行配置,通常在10-20之间。

推测执行
➢负载不均衡或资源分布不均等原因,任务之间的运行速度不一致。对于明显慢的task,采用推测执行(speculative Execution)机制,推测出拖后腿的任务并启动一个备份任务,和原始任务共同处理同一份数据,最终选用先成功运行完成的计算结果作为最终结果

文件压缩
➢针对IO密集型的job,采取文件压缩的方式增加吞吐量和性能,减少载入内存的数据量;计算密集型的job不适合,因为压缩和解压会消耗CPU的使用
➢常见的文件存储格式有:TextFile、Sequence Files、RCFile、ORCFile、Parquet、Parquet
在这里插入图片描述

表的优化

二、表的优化
大表+小表
➢采用mapjoin,下图为mapjoin的工作机制
在这里插入图片描述

大表+大表
➢空key过滤或空key转换

map端进行部分聚合
➢group by时某一个key的数量过多导致对应的reducer负载过大时,采取map端部分聚合的策略。
➢生成两个MRjob,第一个MRjob中的map结果会随机分不到Reduce中,做部分聚合操作;第二个MRjob根据预处理的数据结果按照key分布到对应的reduce中。最终完成聚合操作

//是否在 Map 端进行聚合,默认为
True set hive.map.aggr = true;
//在 Map 端进行聚合操作的条目数目
set hive.groupby.mapaggr.checkinterval = 100000;
//有数据倾斜的时候进行负载均衡(默认是 false)
set hive.groupby.skewindata = true;

Count(Distinct)去重统计
➢数据量大时,一个Count(Distinct)对应的ReduceTask需要处理的数据量太大,导致job很难完成。因此需要采用先Groupby再count的方式替代
避免笛卡尔积
➢Hive只能使用1个Reducer完成笛卡尔积,会导致计算性能变低
行列过滤
➢在select中只拿需要的列,尽量不用select *;先子查询,将查询后的表再关联主表,提高效率,如果直接join再用where子句过滤,则会先全表关联再过滤,效率较低
动态分区调整
➢不同分区在不同文件夹内,在很多情况下可以避免全表扫描,提高查询效率
在这里插入图片描述
三、如何防止数据倾斜
1、产生数据倾斜的原因

key 分布不均匀
业务数据本身的特性
建表时考虑不周
某些 SQL 语句本身就有
2、数据倾斜通用的处理方法

小文件进行合并,减少map数
复杂文件增加map数
设置适当的reduce个数
3、产生数据倾斜的场景和解决方案

group by 产生数据倾斜
➢开启Map端聚合参数设置
➢根据业务合理调整分组维度
select语句中包含 count(distinct)时
➢使用sum(1)… group by替代
➢把倾斜的数据单独拿出来处理,最后union回去
大表+小表
➢mapjoin
空值产生数据倾斜
➢id为空的不参与关联
➢给空值分配随机的key值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值