欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

hvie教程hvie的优化

程序员文章站 2022-09-28 18:34:21
1.配置方面的优化 hive在解析sql的时候会默认认为最后一张表是大表,会把其他的表尝试缓存起来,然后扫描最后一个表进行计算,但是用户并不会经常性的将大表放到最后,所以我们可以在sql里面...
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;

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

4.并行执行

set hive.exec.parallel=true;

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.groupy.skewindata=true;
如果是group by 过程中出现出具倾斜应该设置为true
set hive.groupby.mapaggr.checkinterval=100000;
当group的键对应的记录条数超过这个值则会进行优化

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