Hive性能优化之计算Job执行优化 1

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: Hive性能优化之计算Job执行优化

1 Explain

1.1 功能

HiveQL是一种类SQL的语言,从编程语言规范来说是一种声明式语言,用户会根据查询需求提

交声明式的HQL查询,而Hive会根据底层计算引擎将其转化成Mapreduce/Tez/Spark的 job。大多

数情况下,用户不需要了解Hive内部是如何工作的,不过,当用户对于Hive具有越来越多的经验后,

尤其是需要在做性能优化的场景下,就要学习下Hive背后的理论知识以及底层的一些实现细节,会

让用户更加高效地使用Hive。explain命令就可以帮助用户了解一条HQL语句在底层的实现过程

explain会解析HQL语句,将整个HQL语句的实现步骤、依赖关系、实现过程都会进行解析返

回,可以帮助更好的了解一条HQL语句在底层是如何实现数据的查询及处理的过程,这样可以辅助

用户对Hive进行优化。

官网:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain


1.2 语法

1d678c3faecc4ac6a916173543ca4222.png

常用语法命令如下:

EXPLAIN [FORMATTED|EXTENDED|DEPENDENCY|AUTHORIZATION|] query

⚫ FORMATTED:对执行计划进行格式化,返回JSON格式的执行计划

⚫ EXTENDED:提供一些额外的信息,比如文件的路径信息

⚫ DEPENDENCY:以JSON格式返回查询所依赖的表和分区的列表

⚫ AUTHORIZATION:列出需要被授权的条目,包括输入与输出


1.3 组成

解析后的执行计划一般由三个部分构成,分别是:

⚫ The Abstract Syntax Tree for the query

◼ 抽象语法树:Hive使用Antlr解析生成器,可以自动地将HQL生成为抽象语法树

⚫ The dependencies between the different stages of the plan

◼ Stage依赖关系:会列出运行查询所有的依赖以及stage的数量

⚫ The description of each of the stages

◼ Stage内容:包含了非常重要的信息,比如运行时的operator和sort orders等具体的信息

4.1.4 示例1:过滤

explain select count ( * ) as cnt from tb_emp where deptno = ‘10’;

⚫ 组成

0aaadc7fe8a84c1e93f68a9527962dad.png

⚫ 解释

3e666d775c26408ebcf38d5c45927700.png

29be3f3f3229485c9901953c23aa1160.png


1.5 示例2:分组排序

explain

select

deptno, count ( * ) as cnt

from tb_emp where salary > 2000

group by deptno order by cnt desc;


c4dd7e8e04b84ea38e029759c186d191.png


4e19ec6f192a42ff95f0fd97541a5828.png

7f91ec6f7f8e4c51a270c3466410e40b.png

2 MapReduce属性优化

2.1 本地模式

使用Hive的过程中,有一些数据量不大的表也会转换为MapReduce处理,提交到集群时,需

要申请资源,等待资源分配,启动JVM进程,再运行Task,一系列的过程比较繁琐,本身数据量并

不大,提交到YARN运行返回会导致性能较差的问题。

Hive为了解决这个问题,延用了MapReduce中的设计,提供本地计算模式,允许程序不提交

给YARN,直接在本地运行,以便于提高小数据量程序的性能。

⚫ 配置

– 开启本地模式

set hive.exec.mode.local.auto = true;

⚫ 限制条件

Hive为了避免大数据量的计算也使用本地模式导致性能差的问题,所以对本地模式做了以

下限制,如果以下任意一个条件不满足,那么即使开启了本地模式,将依旧会提交给YARN集

群运行。

◼ 处理的数据量不超过128M

◼ MapTask的个数不超过4个

◼ ReduceTask的个数不超过1个


2.2 JVM重用

JVM正常指代一个Java进程,Hadoop默认使用派生的JVM来执行map-reducer,如果一个

MapReduce程序中有100个Map,10个Reduce,Hadoop默认会为每个Task启动一个JVM来运行,

那么就会启动100个JVM来运行MapTask,在JVM启动时内存开销大,尤其是Job大数据量情况,如

果单个Task数据量比较小,也会申请JVM资源,这就导致了资源紧张及浪费的情况。

为了解决上述问题,MapReduce中提供了JVM重用机制来解决,JVM重用可以使得JVM实例在

同一个job中重新使用N次,当一个Task运行结束以后,JVM不会进行释放,而是继续供下一个Task

运行,直到运行了N个Task以后,就会释放,N的值可以在Hadoop的mapred-site.xml文件中进行

配置,通常在10-20之间。

⚫ 配置

– Hadoop3 之前的配置,在 mapred-site.xml 中添加以下参数

– Hadoop3 中已不再支持该选项

mapreduce.job.jvm.numtasks=10


2.3 并行执行

Hive在实现HQL计算运行时,会解析为多个Stage,有时候Stage彼此之间有依赖关系,只能挨

个执行,但是在一些别的场景下,很多的Stage之间是没有依赖关系的,例如Union语句,Join语句

等等,这些Stage没有依赖关系,但是Hive依旧默认挨个执行每个Stage,这样会导致性能非常差,

我们可以通过修改参数,开启并行执行,当多个Stage之间没有依赖关系时,允许多个Stage并行执

行,提高性能。

⚫ 配置

– 开启 Stage 并行化,默认为 false

SET hive.exec.parallel= true;

– 指定并行化线程数,默认为 8

.SET hive.exec.parallel.thread.number=16;

⚫ 注意:线程数越多,程序运行速度越快,但同样更消耗CPU资源


3 Join优化

3.1 Hive中的Join方案

表的Join是数据分析处理过程中必不可少的操作,Hive同样支持Join的语法,Hive Join的底层

还是通过MapReduce来实现的,Hive实现Join时,为了提高MapReduce的性能,提供了多种Join

方案来实现,例如适合小表Join大表的Map Join,大表Join大表的Reduce Join,以及大表Join的优

化方案Bucket Join等。


3.2 Map Join

⚫ 应用场景

适合于小表join大表或者小表Join小表

⚫ 原理

7419c048c0db44b39c3ad3850588970a.png

◼ 将小的那份数据给每个MapTask的内存都放一份完整的数据,大的数据每个部分都可以与

小数据的完整数据进行join

◼ 底层不需要经过shuffle,需要占用内存空间存放小的数据文件

⚫ 使用

◼ 尽量使用Map Join来实现Join过程

◼ Hive中默认自动开启了Map Join

– 默认已经开启了 Map Join

hive.auto.convert.join= true

◼ Hive中判断哪张表是小表及限制

LEFT OUTER JOIN的左表必须是大表

RIGHT OUTER JOIN的右表必须是大表

INNER JOIN左表或右表均可以作为大表

FULL OUTER JOIN不能使用MAPJOIN

MAPJOIN支持小表为子查询

使用MAPJOIN时需要引用小表或是子查询时,需要引用别名

在MAPJOIN中,可以使用不等值连接或者使用OR连接多个条件

在MAPJOIN中最多支持指定6张小表,否则报语法错误

◼ Hive中小表的大小限制

– 2.0 版本之前的控制属性

hive.mapjoin.smalltable.filesize=25M

– 2.0 版本开始由以下参数控制

hive.auto.convert.join.noconditionaltask.size=512000000


3.3 Reduce Join

⚫ 应用场景

适合于大表Join大表

⚫ 原理

f2d4b3008d1241fca6ea7f7c531d1ea5.png

◼ 将两张表的数据在shuffle阶段利用shuffle的分组来将数据按照关联字段进行合并

◼ 必须经过shuffle,利用Shuffle过程中的分组来实现关联

⚫ 使用

◼ Hive会自动判断是否满足Map Join,如果不满足Map Join,则自动执行Reduce Join



目录
相关文章
|
6月前
|
SQL 存储 分布式计算
Hive数据仓库设计与优化策略:面试经验与必备知识点解析
本文深入探讨了Hive数据仓库设计原则(分区、分桶、存储格式选择)与优化策略(SQL优化、内置优化器、统计信息、配置参数调整),并分享了面试经验及常见问题,如Hive与RDBMS的区别、实际项目应用和与其他组件的集成。通过代码样例,帮助读者掌握Hive核心技术,为面试做好充分准备。
562 0
|
6月前
|
SQL 分布式计算 资源调度
Hive 优化总结
Hive优化主要涉及HDFS和MapReduce的使用。问题包括数据倾斜、操作过多和不当使用。识别倾斜可通过检查分区文件大小或执行聚合抽样。解决方案包括整体优化模型设计,如星型、雪花模型,合理分区和分桶,以及压缩。内存管理需调整mapred和yarn参数。倾斜数据处理通过选择均衡连接键、使用map join和combiner。控制Mapper和Reducer数量以避免小文件和资源浪费。减少数据规模可调整存储格式和压缩,动态或静态分区管理,以及优化CBO和执行引擎设置。其他策略包括JVM重用、本地化运算和LLAP缓存。
138 4
Hive 优化总结
|
5月前
|
SQL 资源调度 数据库连接
Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南
在Tez上优化Hive查询,包括配置参数调整、理解并行化机制以及容器管理。关键步骤包括YARN调度器配置、安全阀设置、识别性能瓶颈(如mapper/reducer任务和连接操作),理解Tez如何动态调整mapper和reducer数量。例如,`tez.grouping.max-size` 影响mapper数量,`hive.exec.reducers.bytes.per.reducer` 控制reducer数量。调整并发和容器复用参数如`hive.server2.tez.sessions.per.default.queue` 和 `tez.am.container.reuse.enabled`
398 0
|
6月前
|
SQL 存储 大数据
Hive的查询、数据加载和交换、聚合、排序、优化
Hive的查询、数据加载和交换、聚合、排序、优化
131 2
|
6月前
|
SQL 存储 分布式计算
【Hive】Hive优化有哪些?
【4月更文挑战第16天】【Hive】Hive优化有哪些?
|
6月前
|
SQL 分布式计算 资源调度
一文看懂 Hive 优化大全(参数配置、语法优化)
以下是对提供的内容的摘要,总长度为240个字符: 在Hadoop集群中,服务器环境包括3台机器,分别运行不同的服务,如NodeManager、DataNode、NameNode等。集群组件版本包括jdk 1.8、mysql 5.7、hadoop 3.1.3和hive 3.1.2。文章讨论了YARN的配置优化,如`yarn.nodemanager.resource.memory-mb`、`yarn.nodemanager.vmem-check-enabled`和`hive.map.aggr`等参数,以及Map-Side聚合优化、Map Join和Bucket Map Join。
332 0
|
6月前
|
SQL 分布式计算 Hadoop
Hive SQL 优化
Hive SQL 优化
98 1
|
6月前
|
SQL 存储 分布式计算
Hive的性能优化有哪些方法?请举例说明。
Hive的性能优化有哪些方法?请举例说明。
144 0
|
6月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
191 1
|
1月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
34 0

热门文章

最新文章