前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0829-5.15.1-Hive锁表导致CM无法启动异常分析

0829-5.15.1-Hive锁表导致CM无法启动异常分析

作者头像
Fayson
发布2021-03-11 15:34:25
1.3K0
发布2021-03-11 15:34:25
举报
文章被收录于专栏:Hadoop实操Hadoop实操

作者:周鹏辉

1.文档编写目的

本文描述了一次CDH集群中,Hive锁表导致集群元数据MySQL的Hive MetaStore锁表,从而引起CM服务中断并且无法重启的异常分析。

  • 文档概述

1.问题描述

2.问题分析

3.问题解决

4.总结

  • 测试环境

1.CDH和CM版本:CDH5.15.1和CM5.15.1

2.集群启用Kerbeos+OpenLDAP+Sentry

2.问题描述

1.10月13日18:15分开始CM上监控到Hive出现如下异常:

同时查看“Hive MetaStore Cannary Server持续时间”在对应时间点达到11分钟,这是一个非常大的延迟值。

2.过了大概十多分钟,发现CM上进行操作反应很慢,尝试重启CM Server,发现无法重启。

3.这两个问题接着发生,当时为了尽快恢复业务,先尝试一个个Hive 实例进行重启,过了大概十分钟,再次尝试重启CM Server,发现可以正常启动了。

3.问题分析

3.1 Hive层面分析问题

1.首先查看HiveServer2和Hive MetaStore 的日志,发现10月13日6~7 PM期间的HiveServer2连接很频繁,HiveServer2和Hive MetaStore日志里发现有很多和数据库有关的报错【1】,这些错误会影响到canary test以及DDL操作。

【1】

Hive MetaStore日志:

代码语言:javascript
复制
2020-10-13 18:41:03,561 ERROR org.apache.hadoop.hive.metastore.RetryingHMSHandler: [pool-5-thread-121151]: Retrying HMSHandler after 2000 ms (attempt 7 of 10) with error: javax.jdo.JDOUserException: One or more instances could not be made persistent
        at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistentAll(JDOPersistenceManager.java:787)
        ...

Nested Throwables StackTrace:
java.sql.SQLException: The total number of locks exceeds the lock table size
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)

HiveServer2 日志:

2.通过查找资料,MySQL报“The total number of locks exceeds the lock table size”应该是Hive的锁表或者大量查询导致innodb_buffer_pool_size不够大导致。

3.2 CM层面分析问题

1.查看cloudera-scm-server.log日志,发现从18:06开始一直到CM重启恢复正常,一直有The total number of locks exceeds the lock table size 【2】报错,此报错和我们在HiveServer2和Hive MetaStore 日志看到的是一样的。

【2】

CM Server 日志:

代码语言:javascript
复制
2020-10-13 18:06:43,097 ERROR 1587731234@scm-web-21766:org.hibernate.engine.jdbc.spi.SqlExceptionHelper: The total number of locks exceeds the lock table size
Caused by: java.sql.SQLException: The total number of locks exceeds the lock table size

2020-10-13 18:18:14,418 ERROR 2022524682@scm-web-21780:org.hibernate.engine.jdbc.spi.SqlExceptionHelper: The total number of locks exceeds the lock table size

2020-10-13 18:34:22,883 ERROR MainThread:org.hibernate.engine.jdbc.spi.SqlExceptionHelper: The total number of locks exceeds the lock table size
Caused by: java.sql.BatchUpdateException: The total number of locks exceeds the lock table size

通过查看Cloudera 官网,有一个相关的KB【3】说到这个问题

代码语言:javascript
复制
https://my.cloudera.com/knowledge/Services-Fail-when-Interacting-with-a-MySQL-Database-Error?id=70674

4.问题解决

1. 这个问题的本质应该是短时间内MySQL的某种资源的耗尽,我们可以尝试增加innodb_buffer_pool_size为256MB来解决此问题。

1).临时增大innodb_buffer_pool_size,重启mysql后会失效:

代码语言:javascript
复制
SET GLOBAL innodb_buffer_pool_size = 268435456;
show variables like '%innodb_buffer_pool%';

2).永久增大innodb_buffer_pool_size,在/etc/my.cnf的 [mysqld]下增加innodb_buffer_pool_size=256MB,重启MySQL。此方法会短暂影响集群使用,最好在变更停止集群的时候操作。

代码语言:javascript
复制
innodb_buffer_pool_size=256M
systemctl restart mysqld
show variables like '%innodb_buffer_pool%';

5.总结

1. 这个问题的本质应该是短时间内MySQL的某种资源的耗尽,可以尝试增加innodb_buffer_pool_size来增加这种资源。这个参数的具体值并有特别的说明【4】。这个需要根据集群上的实际运行情况自行调整,建议和DBA团队商量确定此值。

【4】

代码语言:javascript
复制
https://docs.cloudera.com/documentation/enterprise/latest/topics/cm_ig_mysql.html

2.当Hive处于高负载的时候,比较容易出现此问题。这次问题的根本原因就是因为某些大的hive query导致Hive压力增大和异常Hive query导致Hive lock table,而Hive MetaStore是在MySQL上的,从而也会导致大量的读写写入MySQL。而我们的CM 的元数据和Hive的元数据共用一个MySQL,因为Hive MetaStore的繁忙异常把MySQL的某种资源的耗尽,从而也引起CM异常,所以这两个问题是前后对应的关系。

3.我们最开始是通过一个个Hive实例重启,然后过了大概十分钟,再重启CM Server解决了此问题,本质是重启Hive实例的过程中中断了异常的hive query,从而把MySQL的资源释放出来。需要根本解决此问题还是要增加innodb_buffer_pool_size的值。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档