ranger admin报错:Caused by: java.lang.IllegalArgumentException: HOUR_OF_DAY: 2 -> 3
·
Ranger Admin 报错 HOUR_OF_DAY: 2 -> 3 通常是由于 Java 时区配置与 MySQL 数据库时区不一致,导致时间戳转换异常。这种问题常见于涉及夏令时(DST)切换的时区(如欧洲、北美),在时钟调整时(如从 2:59 直接跳到 3:00),Java 的 LocalDateTime 无法处理这种“跳跃”,从而抛出异常。
解决方案
1. 统一 Java 和 MySQL 的时区配置
确保 Java 应用和 MySQL 服务器使用相同的固定时区(推荐 UTC),避免使用系统默认时区或依赖自动转换。
修改 Ranger Admin 启动配置(推荐):
sudo vi /etc/init.d/ranger-admin
添加 JVM 参数:
JAVA_OPTS="${JAVA_OPTS} -Duser.timezone=UTC"
修改 MySQL 时区:
-- 临时修改(会话级别)
SET GLOBAL time_zone = 'UTC';
SET SESSION time_zone = 'UTC';
-- 永久修改(需重启 MySQL)
sudo vi /etc/mysql/my.cnf
[mysqld]
default-time-zone = 'UTC'
2. 修改 JDBC 连接参数
确保 Ranger Admin 连接 MySQL 时明确指定时区:
sudo vi /etc/ranger/admin/conf/ranger-admin-site.xml
添加或修改以下配置:
<property>
<name>ranger.jpa.jdbc.params</name>
<value>useUnicode=true;characterEncoding=UTF-8;serverTimezone=UTC</value>
</property>
3. 验证时区配置
# 检查 Java 时区
echo $JAVA_OPTS # 应包含 -Duser.timezone=UTC
# 检查 MySQL 时区
mysql -u root -p -e "SELECT @@global.time_zone, @@session.time_zone;"
4. 升级依赖库版本
确保使用兼容的 MySQL Connector/J 驱动(如 8.0.26+)和 Hive Ranger 插件版本:
# 检查 MySQL 驱动版本
ls /usr/hdp/current/ranger-admin/ews/webapp/WEB-INF/lib/mysql-connector-java-*.jar
若版本过旧,下载最新驱动并替换:
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.32/mysql-connector-java-8.0.32.jar
sudo cp mysql-connector-java-8.0.32.jar /usr/hdp/current/ranger-admin/ews/webapp/WEB-INF/lib/
5. 重启服务
sudo service ranger-admin restart
错误原因分析
- 夏令时切换:某些时区(如欧洲/北美)在夏令时调整时会跳过 2:00-3:00 之间的时间,导致时间转换异常。
- 时区不匹配:Java 应用、MySQL 服务器和 JDBC 连接参数使用了不同的时区配置。
- 旧版驱动问题:MySQL Connector/J 旧版本可能存在时区解析漏洞。
其他可能的修复方法
- 使用带时区的时间类型:修改 Ranger 源码,将
LocalDateTime替换为ZonedDateTime或OffsetDateTime。 - 禁用夏令时:在 JVM 参数中添加
--disable-dst-check(部分 JDK 支持)。 - 临时规避:将系统时区设置为不使用夏令时的区域(如
Asia/Shanghai)。
通过以上步骤,应能解决 Ranger Admin 的时区转换错误。
更多推荐


所有评论(0)