Sentry(1.5.1+CDH5.15.2+470)扩容后每日21点宕机求助
解决Sentry每日21点定时宕机(sentry-1.5.1+cdh5.15.2+470)的问题
我来分享下针对这个问题的分析和可行解决方案,之前也碰到过类似的定时宕机+SQL参数绑定异常的情况:
问题背景
我们的Sentry服务每天固定21点就会宕机,最初以为是资源不足,扩容后问题依旧存在,当前使用的版本是sentry-1.5.1+cdh5.15.2+470,报错核心指向SQL参数未正确赋值的异常。
核心报错信息
Caused by: javax.jdo.JDODataStoreException: 迭代请求失败: SELECT 'org.apache.sentry.provider.db.service.model.MPath' AS NUCLEUS_TYPE,`A0`.`PATH_NAME`,`A0`.`PATH_ID`,`A0`.`AUTHZ_OBJ_ID` FROM `AUTHZ_PATH` `A0` WHERE EXISTS ( SELECT 'org.apache.sentry.provider.db.service.model.MAuthzPathsMapping' AS NUCLEUS_TYPE,`A0_SUB`.`AUTHZ_OBJ_ID` AS `DN_DATASTOREID` FROM `AUTHZ_PATHS_MAPPING` `A0_SUB` WHERE `A0_SUB`.`AUTHZ_SNAPSHOT_ID` = ? AND `A0`.`AUTHZ_OBJ_ID` = `A0_SUB`.`AUTHZ_OBJ_ID` ) NestedThrowables: java.sql.SQLException: 未为参数1指定值 at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:451) at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:252) at org.apache.sentry.provider.db.service.persistent.SentryStore.retrieveFullPathsImageCore(SentryStore.java:2542) at org.apache.sentry.provider.db.service.persistent.SentryStore.access$2800(SentryStore.java:131) at org.apache.sentry.provider.db.service.persistent.SentryStore$39.execute(SentryStore.java:2518) at org.apache.sentry.provider.db.service.persistent.SentryStore$39.execute(SentryStore.java:2509) at org.apache.sentry.provider.db.service.persistent.TransactionManager.executeTransaction(TransactionManager.java:123) at org.apache.sentry.provider.db.service.persistent.SentryStore.retrieveFullPathsImageUpdate(SentryStore.java:2508) at org.apache.sentry.hdfs.PathImageRetriever.retrieveFullImage(PathImageRetriever.java:52) at org.apache.sentry.hdfs.PathImageRetriever.retrieveFullImage(PathImageRetriever.java:32) at org.apache.sentry.hdfs.DBUpdateForwarder.retrieveFullImage(DBUpdateForwarder.java:141) at org.apache.sentry.hdfs.DBUpdateForwarder.getAllUpdatesFrom(DBUpdateForwarder.java:92) at org.apache.sentry.hdfs.SentryPlugin.getAllPathsUpdatesFrom(SentryPlugin.java:163) at org.apache.sentry.hdfs.SentryHDFSServiceProcessor.getPathsUpdatesFrom(SentryHDFSServiceProcessor.java:130) at org.apache.sentry.hdfs.SentryHDFSServiceProcessor.get_authz_updates(SentryHDFSServiceProcessor.java:68) ... 10 more Caused by: java.sql.SQLException: 未为参数1指定值 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861) at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2211)
问题分析
从报错堆栈可以定位到,问题出现在Sentry的路径全量镜像检索逻辑中:SentryStore.retrieveFullPathsImageCore方法执行JDO查询时,子查询里的AUTHZ_SNAPSHOT_ID参数没有被正确绑定到SQL语句中,导致MySQL抛出参数未设置的异常,最终引发Sentry服务宕机。
由于宕机是每日21点定时触发,说明这个查询是被某个定时任务触发的,大概率是Sentry的全量权限快照同步任务(比如hdfs.sentry.path.image.refresh.interval配置的定时任务)。
可行解决方案
- 调整定时任务执行时间:如果暂时无法修复代码问题,可以先修改Sentry的定时任务配置,把全量快照同步时间调整到业务低峰期,避开21点,同时监控任务执行时的数据库资源占用情况。
- 升级Sentry/CDH版本:这个问题是旧版本Sentry(1.5.1)结合Nucleus JDO的子查询参数绑定bug导致的,升级到CDH 5.16及以上版本对应的Sentry版本(比如sentry-1.7.x+)可以修复这个已知的参数绑定问题。
- 检查MySQL驱动兼容性:确认当前使用的MySQL驱动版本是否与CDH5.15及Sentry1.5.1兼容,建议使用
mysql-connector-java-5.1.47版本,避免因驱动版本不匹配导致的PreparedStatement参数绑定异常。 - 补丁修复(针对源码):如果无法升级版本,可以针对
SentryStore.retrieveFullPathsImageCore方法的JDO查询逻辑打补丁,确保子查询的参数被正确传递到SQL语句中。
内容的提问来源于stack exchange,提问作者ZH-hua
相关产品推荐
相关产品推荐

