hive的调优
1.Fetch 抓取
2.本地模式
3.表的优化
4.数据倾斜(准确来说是处理数据倾斜才是调优)
5.并行执行
6.严格模式
7.jvm重用
8.推测执行
9. 执行计划
10.虚拟列
11.压缩

**
*

1.Fetch 抓取



目的: 设置某些查询,在不用计算的情况下,不去执行MR任务,而是直接抓取数据进行显示
None : 禁用Fetch 如果设置为该参数则所有的查询都会运行MR任务
More : select filter limit 执行这些语句的时候都不会执行MR任务
Minimal : select limit

2.本地模式

在运行计算一些小数据量文件的时候,可以在hive本地的节点进行运算,没有必要把数据提交到集群中运行。这样可以提高小数据量运算的效率
要想使用hive中的本地模式,必须先开启,通过如下参数进行开启
set hive.exec.mode.local.auto=true

Hive判断是否执行本地模式数据默认大小为 128MB
set hive.exec.mode.local.auto.inputbytes.max=500000

可以MR任务输入的最大文件为多少默认4个 设置的参数如下
set hive.exec.mode.local.auto.input.files.max=4;

3.表的优化

在表的优化中第一点:当数据量比较大的时候常用的手段就是为拆分表,大表拆小表,分区表 ,临时表 。外部表小表和大表join ,要把数据量的小的表放在join的左边,先进行缓存 ,这样减少表Join的时候内存的消耗量

4.数据倾斜(准确来说是处理数据倾斜才是调优)

数据倾斜产生的原因为分区之后某一个reduce运算的数量比较小,而某一个reduce运行的数据量比较大,造成两个reduce处理数据不平等
合理设置map数量
总结:可以影响map的数量的因素都有哪些?
1 在input文件夹中 每一个文件就是一个map input文件的数量, input的文件的大小
在MR任务中一个切片就是一个map任务
设置切片大小: 在hadoop中
FileInputFormat.setMaxInputSplitSize(job, size);
FileInputFormat.setMinInputSplitSize(job, size);

设置reduce个数
set mapreduce.job.reduces

根据业务自定分区规则

5.并行执行

并行之情与java多线程的异步和同步概念上差不多,在MR运行任务中,存在很多的MR任务可以进行执行。有些MR任务和下一个MR任务存在依赖关系,但是有些MR任务没有依赖关系,例如: 存在依赖关系的MR 它输出就是下一个MR任务的输入。 对于没有依赖关系的MR任务就可以使用并行执行,在同一时间运行多个MR任务。这样在运行的过程中效率就会得到提升
可以通过以下参数进行设置:
set hive.exec.parallel=true ; // 开启任务并行执行
设置多少个任务可以同时运行
set hive.exec.parallel.thread.number=8; //默认值为8个任务可以同时运行

6.严格模式

开启了严格模式,会对查询语句进行一些限制:
1 对于分区表: 必须存在where语句对分区表中分区字段进行条件过滤,否则,不允许执行该查询
2 对于使用order by的语句必须使用limit 进行限定,由于order by 之后所有的数据都会被分到一个reduce中那这样reduce操作的数据量太多了,可能时间过长卡死。所以为了防止reduce时间过程。在order by的时候必须给定 limit 减少redue处理的数据量
3 限制了笛卡儿积的查询 .主要在多表join中会出现。笛卡儿积的出现会造成性能极大的消耗、

7.jvm重用

在hive执行计算任务的时候,会把的执行计划上传到yarn集群中进行提交,运行MR任务。每次进行任务的运行的时候都会开启一个JVM进程运行的MR任务。如果提交任务频繁过多就会造成JVM频繁的开启和关闭。在JVM开启和关闭的过程中会造成大量的资源浪费
在处理小文件的时候,由于map任务较多。所以JVM会频繁的开启和关闭。所以对于小文件的处理优化,主要减少JVM开启的次数

8.推测执行

由于集群中的资源分配不均等,或者每个集群中节点的硬件性能,会导致某个任务运行的时间快或者某个任务运行的时间慢,或者某个任务在运行的时候直接卡死了
为了防止某些任务,在运行过程中,拖慢了整个MR任务的进度。在运行慢的任务节点上开启相同的任务,如果时间比原来的任务运行的快则直接输出推测运行的任务

9. 执行计划

Hive中提供的可以查看Hql语句的执行计划,在执行计划中会生成抽象语法树,在语法树中会显示HQL语句之间的依赖关系以及执行过程。通过这些执行的过程和依赖可以对HQL语句进行优化

10.虚拟列

虚拟列本身是一个不存在列,在数据查询的时候,可以通过虚拟列去查询数据的的路径,以及数据的偏移量,这两个内容都是hive中为用户提供的虚拟列进行的查询
虚拟列存在两种:
INPUT__FILE__NAME 代表数据的文件保存路径

11.压缩

总结:

Fetch抓取 本地模式 严格模式 推测执行 并行执行 执行计划 数据倾斜 jvm重用 虚拟列 表的优化