day19hive

本文详细介绍了Hive的调优策略,包括开启本地模式以优化小数据集处理,处理空key问题,调整reducer数量以平衡负载,以及SQL层面的优化如开启map端聚合和处理数据倾斜。此外,还提到了并行执行和严格模式的设置,以及存储方式如ORC和压缩方式SNAPPY的选择,以提高查询效率。
摘要由CSDN通过智能技术生成

一.hive的调优

1.本地模式:在单台机器上处理所有的任务,对于小数据集,执行时间明显缩短

set hive.exec.mode.local.auto=true;//开启本地mr
--设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,默认为128m
set hive.exec.mode.local.auto.inputbytes.max=51234560;
--设置local mr 最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式默认为4
set hive.exec.mode.local.auto.input.files.max=10;

空key的处理
1.1空key过滤(有时join超时是因为某些key对应的数据太多,相同的key会发送到相同的reducer上,从而导致内存不够)

在这里插入图片描述

利用子查询把非空的id跳出来 select * from 表名 where id is not null
1.2空key 的转换

set hive.exec.reducers.bytes.per.reducer=3123456每个reducer处理的数据量
不随机分配:
set hive.exec.reducers.bytes.per.reducer=32123456;
set mapreduce.job.reduces=7;
INSERT OVERWRITE TABLE jointable
SELECT a.*
FROM nullidtable a
LEFT JOIN ori b ON CASE WHEN a.id IS NULL THEN 'hive' ELSE a.id END = b.id;

随机分配:减轻reducer的压力

set hive.exec.reducers.bytes.per.reducer=32123456;
set mapreduce.job.reduces=7;
INSERT OVERWRITE TABLE jointable
SELECT a.*
FROM nullidtable a
LEFT JOIN ori b ON CASE WHEN a.id IS NULL THEN concat('hive', rand()) ELSE a.id END = b.id;
  1. sql优化
    2.1group by 默认情况下map阶段同一个key数据分发给一个reduce,当一个key数据过大时就倾斜了,并不是所有的聚合操作都需要在reduce端完成,很多聚合都可以在map端进行部分聚合,最后在reduce端得出最终结果。
    开启map端聚合:set hive.map.aggr=true;默认为true;
    在map端进行聚合操作的条目数目:set hive.groupby.mapaggr.checkinterval=100000;
    有数据倾斜的时候进行负载均衡默认是false:set hive.groupby.skewindata=true;
    2.2count (distinct):数量小时无所谓,数量大的情况下count distinct 操作需要一个reduce task来完成,这一个reduce需要处理的数据量太大,就会导致整个job很难完成,一般使用count distinct 先 group by 在count
    2.3笛卡尔积:尽量避免笛卡尔积,既避免join的时候不加on条件或者无效的on条件,hive只能使用一个reducer来完成笛卡尔积

  2. 并行执行: hive会将一个查询转化成多个阶段,阶段可以是mapreduce阶段,抽样阶段,合并阶段、limit阶段,默认情况下hive一次回执行一个阶段。有些阶段可以并行执行;通过set hive.exec.parallel=true;set hive.exec.parallel.thread.number=16;同一个sql允许最大并行度,默认为8;

  3. 严格模式:set hive.mapred.mode=strict(nostrict);严格模式(非严格)严格模式下不能全表扫描 必须含有where字段;order by排序完必须加limit;动态分区必须非严格模式;

  4. 存储方式orc和压缩方式snappy

  5. map的个数(hive):map的数量不是越多越好(许多小文件)可以通过设置参数设置

set mapred.max.split.size=112345600;--split最大值100m
set mapred.min.split.size.per.node=112345600;--一个节点上最小的split大小
set mapred.min.split.size.per.rack=112345600;--一个机架上最小的split大小
set hive.input.format=org.aparche.hadoop.hive.ql.io.CombineHiveInputFormat--自动合并小文件

文件大,但列少,文件拆分distribute by rand();

set mapred.reduce.tasks=10;

create table a_1 as 
select * from tab_info  distribute by rand();
/*
这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。
每个map任务处理大于12M(几百万记录)的数据,效率肯定会好很多。
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值