【Hive】Hive 本地启动时报错 Persistence Manager has been closed

Hive 本地启动时报错 Persistence Manager has been closed

2024-09-07 17:21:45 ERROR RetryingHMSHandler:215 - Retrying HMSHandler after 2000 ms (attempt 2 of 10) with error: javax.jdo.JDOFatalUserException: Persistence Manager has been closed
	at org.datanucleus.api.jdo.JDOPersistenceManager.assertIsOpen(JDOPersistenceManager.java:2212)
	at org.datanucleus.api.jdo.JDOPersistenceManager.evictAll(JDOPersistenceManager.java:494)
	at org.apache.hadoop.hive.metastore.ObjectStore.rollbackTransaction(ObjectStore.java:804)
	at org.apache.hadoop.hive.metastore.ObjectStore$GetHelper.close(ObjectStore.java:3740)
	at org.apache.hadoop.hive.metastore.ObjectStore$GetHelper.run(ObjectStore.java:3633)
	at org.apache.hadoop.hive.metastore.ObjectStore.getDatabaseInternal(ObjectStore.java:1019)
	at org.apache.hadoop.hive.metastore.ObjectStore.getDatabase(ObjectStore.java:991)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.hive.metastore.RawStoreProxy.invoke(RawStoreProxy.java:97)
	at com.sun.proxy.$Proxy118.getDatabase(Unknown Source)
	at org.apache
### ### 排查 Hive 启动时报 `cannot create directory` 错误的方法 在 Hive 启动过程中,若出现 `cannot create directory` 错误,通常与 HDFS 的状态或权限配置有关。以下是详细的排查方法: #### 检查 HDFS 是否处于安全模式(SafeMode) Hive启动时会尝试创建临时目录,例如 `/user/hive/tmp` 和 `${hive.exec.scratchdir}`。如果 HDFS NameNode 处于安全模式,则无法进行写操作,导致 Hive 无法创建这些目录[^1]。可以通过以下命令检查当前 HDFS 的安全模式状态: ```bash hdfs dfsadmin -report | grep "Safe mode is ON" ``` 如果确认处于安全模式,可以使用以下命令手动退出: ```bash hdfs dfsadmin -safemode leave ``` 建议在集群完全启动并稳定后,再运行 Hive 服务。 #### 验证 Hive 配置的临时目录是否存在且具有写权限 Hive 的关键配置项如 `hive.exec.scratchdir` 和 `hive.querylog.location` 应指向 HDFS 上的可写路径,并确保这些目录存在且权限正确。例如: ```xml <property> <name>hive.exec.scratchdir</name> <value>/user/hive/scratch</value> <description>Scratch space for Hive jobs</description> </property> <property> <name>hive.querylog.location</name> <value>/user/hive/logs</value> </property> ``` 执行以下命令确保这些目录存在并设置适当的权限: ```bash hadoop fs -mkdir -p /user/hive/scratch /user/hive/logs hadoop fs -chmod -R 777 /user/hive/scratch hadoop fs -chmod -R 777 /user/hive/logs ``` #### 检查 Hive 临时目录是否被占用或损坏 有时,Hive 创建的临时目录可能因任务异常中断而残留,或者目录结构损坏。可以手动删除这些目录并重新创建: ```bash hadoop fs -rm -r /user/hive/scratch hadoop fs -rm -r /user/hive/logs hadoop fs -mkdir -p /user/hive/scratch /user/hive/logs hadoop fs -chmod -R 777 /user/hive/scratch hadoop fs -chmod -R 777 /user/hive/logs ``` #### 查看 Hive 日志文件以获取更详细的错误信息 Hive 的日志文件通常包含更具体的错误信息,可以帮助定位问题。可以在 `hive.log` 文件中查找相关的异常堆栈信息,尤其是涉及文件系统操作的部分。日志路径通常由 `hive.log.dir` 配置决定。 #### 使用本地临时目录(适用于测试环境) 对于非生产环境,可以将 Hive 的临时目录设置为本地文件系统路径,以绕过 HDFS 依赖。此方法不适用于分布式环境: ```xml <property> <name>hive.exec.scratchdir</name> <value>/tmp/hive/scratch</value> </property> <property> <name>hive.querylog.location</name> <value>/tmp/hive/logs</value> </property> ``` 注意:该方式可能影响性能和任务调度,不适合长期使用。 #### 自动等待 HDFS 安全模式退出后再启动 Hive 可以在 Hive 服务启动脚本中加入对 HDFS 状态的检测逻辑,自动等待直到 HDFS 退出安全模式: ```bash #!/bin/bash until hdfs dfsadmin -report 2>&1 | grep -q "Safe mode is OFF"; do echo "Waiting for HDFS to exit Safe Mode..." sleep 10 done # 继续执行Hive服务启动命令 hive --service metastore & ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值