hvie 优化

配置方面的优化

1.配置方面的优化

hive在解析sql的时候会默认认为最后一张表是大表,会把其他的表尝试缓存起来,然后扫描最后一个表进行计算,但是用户并不会经常性的将大表放到最后,所以我们可以在sql里面加一个配置,自动去检测并告诉查询优化器哪个是大表

如select /*+streamtable(s)*/a.id from log a left join user b on a.uid=b.uid

2.map-side join 

 set hive.auto.convert.join=true;

如果所有的表中有一张表足够的小,完全将小表缓存在内存中,在最大的表进行mapper的时候,可以和内存中的小表进行逐一匹配,从而省略掉常规连接所需要的reduce的过程

用户可以配置和优化小表的大小(单位是字节)

hive.mapjoin.smalltable.filesize=25000000

注意:hive 对于右外连接(right outer join)和全外连接(full outer join)不支持这个优化

3.本地模式

set hive.exec.mode.local.auto=true;(默认为false)

当一个job满足如下条件才能真正使用本地模式:
1.job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
2.job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)

3.job的reduce数必须为0或者1

一般的简单的查询语句比如:
select * from a;这种语句是不会启东mapreduce的。
同样一些简单的查询语句,虽然会启动mr但是也可以使用本地模式

select a.name,a.age from user a where age=12;

也可以在hive_home/conf/hive-site.xml中配置

4.并行执行

set hive.exec.parallel=true;

set hive.exec.parallel.thread.number=10;

hive在执行的时候,会 将一个查询转换成一个或者多个阶段,这样的阶段可以是多个MapReduce阶段、抽样阶段、

合并阶段、limit 阶段或者hive执行过程中的其他阶段。默认情况下,hive一次只会执行一个阶段。不过,有些特定的

job可能包含众多的阶段,而这些阶段可能并非完全互依赖,可以并行执行,这样可以使整个的执行缩短

也可以在hive_home/conf/hive-site.xml中配置

5.严格模式

set hive.mapred.mode=strict;严格模式

set hive.mapred.mode=nonstrict;非严格模式

hive提供的严格模式,可以防止用户执行那些可能产生意想不到的不好的影响的查询。

第一种:对于分区,除非where的语句中含有分区字段的过滤条件来限制数据范围,否则不允许执行。

第二种:对于使用order by语句的查询,要求必须使用limit的语句。因为order by为了执行排序过程会将

          所有的结果数据分发到同一个reduce中进行处理,强制用户增加limit 语句可以防止reducer的额外

          执行时间。

第三种:限制笛卡尔积的查询.必须写 on 语句进行关联

6.设置mapper和reducer的个数

set hive.exec.reducers.max=(集群总reduce的槽位个数*1.5)/(执行中的查询的平均个数)

hive的默认的reducer的个数是3

也可以在hive_home/conf/hive-site.xml中配置

7.JVM重用

set mapred.job.reuse.jvm.num.tasks=10 

也可以在hadoop的mapred-site.xml中配置

Hadoop的默认配置通常是使用派生JVM来执行map和reduce的任务.这时JVM的启动过程可能会

造成相当大的开销,尤其是执行的job包含成百上千的task任务的情况。JVM重用可以使得JVM实例

在同一个job中重复使用N次,有个缺点,开启JVM重用会一直占用task的插槽,直到任务结束才会释放

8.hive动态分区 

参考地址 https://blog.csdn.net/oracle8090/article/details/72627135

9.set hive.map.aggr=true;

相当于 map端的 combiner操作

10.join优化(当操作的时候数据有大部分为null就会出现倾斜)

set hive.optimize.skewjoin=true;

如果是join过程中出现数据倾斜应该设置为true,变成自动优化

set hive.skewjoin,key=10000;

当join的建对应的记录条数超过这个值则会进行优化

11. group by 优化

hive.optimize.skewjoin.compiletime=true; 如果是join过程出现倾斜应该设置为true
此时会将join语句转化为两个mapreduce任务,第一个会给jion字段加随机散列
set hive.skewjoin.key=100000; 这个是join的键对应的记录条数超过这个值则会进行优化。

12.合并小文件

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 

13. 数据量太大分开处理

set mapred.reduce.tasks=10; 
select * from a 
distribute by rand(123);

存储方面的优化

合理使用存储格式 比如 orc 和 parquet

https://blog.csdn.net/oracle8090/article/details/112605354

倾斜优化 

https://blog.csdn.net/oracle8090/article/details/112003247

hive 配置信息 https://blog.csdn.net/chaoping315/article/details/8500407

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值