访问 Hive Server 运行 SQL 慢排查手册
1. 访问 Hive Server 运行 SQL 慢排查手册
对于分布式系统, 任何地方出问题都有可能导致任务运行慢。 本手册仅排查通过 Hive Server 执行 SQL 任务。
2. 通过 Hive Server 运行 SQL 的整体架构
通过 Hive Server 运行 SQL 主要设计 4 个部分,分别是 MYSQL 数据库、 Hive Metastore、Hive Server 和客户端。每个部分都可能对性能造成影响。
MYSQL 数据库: 存储 Hive 的元信息,如表有哪些字段,只有一个 MYSQL 数据库。 Hive Metastore:通过 api 接口对 Hive Server 提供元信息服务。多个 Hive Metastore 访问同一个 MYSQL 数据库,提供高可用。后面简称为 Metastore。 Hive Server:通过 JDBC 和 ODBC 对外提供 SQL 执行服务。可以配置多个 Hive Server,提供高可用。 客户端:用户使用的连接 Hive Server 的程序。如 Hive 自带的 Beeline、EDAP 等对 Hive Server 来说都是客户端。
SQL 运行分为两大部分:第 1 部分是在 Hive Server 解析,优化,最终生成执行计划。第 2 部分是在集群上分布式运行执行计划。本文仅分析第 1 部分,即从 Hive Server 接收到客户端请求,到生成执行计划。第 2 部分的执行速度和 Hive 没有关系。如不同的用户执行同样一个 SQL,由于集群繁忙程度,运行在不同的队列的资源,权重,调度系统的调度算法,任务的排队情况,能获取的容器数量等相关。
所以排查 Hive Server 运行慢的问题,执行 desc ${TABLE_NAME} 或者 explain select xxx 语句就可以,不用执行提交到集群上的任务。
3. 分析 Hive Server 运行 SQL 慢的排查原则
发现 SQL 运行速度慢,MYSQL 数据库、Metastore、Hive Server、和客户端都有可能造成 SQL 运行速度慢。具体分析是否由某个组件造成的问题时,要保证其他组件工作正常。一个组件通过部署在多台服务器上提供 HA 的,要一个一个进行分析,找到具体哪台服务器上的组件慢。如任务 Hive Server 是造成 SQL 运行慢的原因,要保证 MYSQL 数据库、Metastore 和客户端正常。需要一台一台的连接测试,找到慢的那一台。
排查各个组件时,先判断运行组件的服务器的内存、CPU、IO 负载是正常的。如果服务器负载高,服务器上的所有程序运行都会慢。
然后再排查,组件自身运行是否正常。如内存是否达到设定的最高值,是否不断执行 full gc 而导致没有足够的 cpu 资源执行业务代码。
4. MYSQL 数据库
Hive 的元信息存储在 MYSQL 数据库里,如表有哪些字段。执行 SQL 解析时,Hive Server 需要访问 Hive Metastore。Hive Metastore 再访问 MYSQL 数据库。如果 MYSQL 数据库慢,那么所有的 SQL 运行都会慢。
判断 MYSQL 数据库是否慢的方法。在一台负载正常的服务器。通过 hive cli,不访问集群的 Metastore,而是在 hive cli JVM 内启动一个 Metastore 直接访问 MYSQL 数据库,然后执行 SQL 语句。如果速度慢,则说明 MYSQL 数据库慢。
测试命令:
hive -hiveconf hive.metastore.uris=''
此命令设置 hive.metastore.uris 为空,则会在 hive cli 这个 JVM 里启动一个内置的 Metastore。然后执行 SQL 语句,如 desc xxx , 如果速度正常,说明 MYSQL 数据库没有问题;否则说明 MYSQL 数据库有问题。
MYSQL 数据库有问题,联系 DBA 进行解决。
5. Metastore
例如系统有两个 Metastore,hive-site.xml 配置如下:
<property>
<name>hive.metastore.uris</name>
<value>thrift://master-bf7a6b6-2:9083,thrift://master-bf7a6b6-1:9083</value>
</property>
需要找出哪个 Metastore 有问题,需要连接特定的 Metastore 进行测试。
- 指定其中一个 Metastore
如指定第 1 个 Metastore 的方法如下:
hive -hiveconf hive.metastore.uris='thrift://master-bf7a6b6-2:9083'
如果连接某个 Metastore 时运行速度慢,说明这个 Metastore 有问题。先排查 Metastore 的堆内存是否设置过小。 还可以看 Metastore 的日志 /mnt/bmr/log/hive/hivemetastore.log 。同时该目录下有 metastore 的历史日志,文件名后缀为 ‘gz’, 使用 gunzip 进行解压。
6. Hive Server
假定 Hive Server 部署在 master-bf7a6b6-1 和 master-bf7a6b6-2 这两台服务器上。
- 没有用 kerberos
使用下面的语句连接 master-bf7a6b6-1 服务器上的 Hive Server。
beeline -u "jdbc:hive2://master-bf7a6b6-1:10000/default"
当前用户为 hive
[hive@master-bf7a6b6-2 ~]$ klist -kt /etc/security/keytabs/hive.service.keytab
Keytab name: FILE:/etc/security/keytabs/hive.service.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
2 06/06/2022 17:34:26 hive/master-bf7a6b6-2@BAIDU.COM
2 06/06/2022 17:34:26 hive/master-bf7a6b6-2@BAIDU.COM
2 06/06/2022 17:34:26 hive/master-bf7a6b6-2@BAIDU.COM
2 06/06/2022 17:34:26 hive/master-bf7a6b6-2@BAIDU.COM
2 06/06/2022 17:34:26 hive/master-bf7a6b6-2@BAIDU.COM
kinit -kt /etc/security/keytabs/hive.service.keytab hive/master-bf7a6b6-2@BAIDU.COM
连接 master-bf7a6b6-1
beeline -u "jdbc:hive2://master-bf7a6b6-1:10000/default;principal=hive/_HOST@BAIDU.COM"
连接 master-bf7a6b6-2
beeline -u "jdbc:hive2://master-bf7a6b6-2:10000/default;principal=hive/_HOST@BAIDU.COM"
如果 Hive Server有问题,可以从以下几个方面排查。
- Hive Server 的堆内存是否充足。
jmap -heap ${HIVE_SERVER_PID}
- Hive Server 的连接数是否很多。
netstat -tunp | grep 10000
还可以看 Hive Server 的日志 /mnt/bmr/log/hive/hiveserver2.log 。同时该目录下有 hiveserver 的历史日志,文件名后缀为 ‘gz’, 使用 gunzip 进行解压。
7. 客户端
要确保客户端的正常运行,如数据平台对外提供 web 访问接口,用户的请求通过 jdbc 访问 Hive Server。那么数据平台如果负载很高,也有可能导致请求没能及时发往 Hive Server,Hive Server 的响应不能及时处理。
|