CDH HIVE报错引发的一系列血案

修复Hive元数据库异常

今天偶尔发现一个CDH集群中的Hive MetaStore Server发生了异常,于是检查相关日志,具体日志为Hive MetaStore Server所在节点的/var/log/hive/hadoop-cmf-hive-HIVEMETASTORE-sbh01.esgyn.cn.log.out,日志报错如下,

2019-10-31 06:22:51,467 INFO  org.apache.hadoop.hive.metastore.HiveMetaStore: [pool-5-thread-199]: 199: source:172.31.232.22 get_table : db=cloudera_manager_metastore_canary_test_db_hive_HIVEME
TASTORE_89c6545c32a1b6da390011bba5c4799a tbl=CM_TEST_TABLE
2019-10-31 06:22:51,467 INFO  org.apache.hadoop.hive.metastore.HiveMetaStore.audit: [pool-5-thread-199]: ugi=hue        ip=172.31.232.22        cmd=source:172.31.232.22 get_table : db=cloudera_
manager_metastore_canary_test_db_hive_HIVEMETASTORE_89c6545c32a1b6da390011bba5c4799a tbl=CM_TEST_TABLE
2019-10-31 06:22:51,470 ERROR org.apache.hadoop.hive.metastore.RetryingHMSHandler: [pool-5-thread-199]: Retrying HMSHandler after 2000 ms (attempt 4 of 10) with error: javax.jdo.JDOException: E
xception thrown when executing query
        at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:596)
        at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:275)
        at org.apache.hadoop.hive.metastore.ObjectStore.getMTable(ObjectStore.java:1217)
        at org.apache.hadoop.hive.metastore.ObjectStore.getTable(ObjectStore.java:1024)
        at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
        at sun.reflect.DelegatingMet
<think> 我们正在解决Hive报错:'unknown method mergeDir call on' 根据引用内容,我们注意到引用[2]中提到CDH版本中的Spark SQL/Hive Thrift Server模块存在编译错误,这可能与Hive的某些错误相关。但是用户的具体错误是“unknown method mergeDir call on”,这通常与文件系统操作相关,尤其是在使用Hadoop分布式文件系统(HDFS)时。 经过分析,这个错误通常发生在Hive尝试合并小文件时,而底层的Hadoop版本不支持`mergeDir`方法。这个错误可能是因为Hive调用的Hadoop API版本不兼容导致的。 可能的解决方案: 1. 升级Hadoop版本:确保使用的Hadoop版本与Hive版本兼容,并且支持`mergeDir`方法。 2. 禁用小文件合并:在Hive中禁用合并操作,通过设置参数`hive.merge.mapfiles`和`hive.merge.mapredfiles`为false。 但是,根据引用[2]中提到的CDH版本问题,如果用户正在使用CDH5.4.0,那么可能需要考虑升级CDH版本或者等待官方修复。 具体步骤: 1. 检查Hadoop版本和Hive版本是否兼容。可以查阅Hive官方文档的版本兼容性说明。 2. 如果是因为CDH5.4.0的已知问题,考虑升级到更高版本的CDH。 3. 临时解决方案:在Hive会话中设置合并参数为false: ```sql set hive.merge.mapfiles=false; set hive.merge.mapredfiles=false; ``` 或者在hive-site.xml中永久设置: ```xml <property> <name>hive.merge.mapfiles</name> <value>false</value> </property> <property> <name>hive.merge.mapredfiles</name> <value>false</value> </property> ``` 4. 另外,这个错误也可能出现在使用Tez执行引擎时,可以尝试切换到MapReduce引擎: ```sql set hive.execution.engine=mr; ``` 注意:禁用合并可能会导致生成大量小文件,从而影响HDFS的性能。因此,长期解决方案应该是升级到兼容的版本。 如果上述方法不能解决问题,可能需要检查Hadoop的JAR包是否完整,或者是否存在类冲突。 由于用户引用中提到了CDH5.4.0的编译问题,因此用户可能使用的是CDH5.4.0,建议优先考虑升级CDH版本。 相关问题: 1. 如何检查HiveHadoop的版本兼容性? 2. 如何升级CDH集群? 3. 除了禁用合并,还有哪些处理小文件的方法? 4. 如何在Hive中永久设置配置参数? </think> ### Hive报错 "unknown method mergeDir call on" 的解决方案 该错误通常发生在Hive执行文件操作(如`LOAD DATA`或插入数据)时,底层Hadoop文件系统接口不兼容导致。以下是完整的解决步骤: #### 1. **检查Hadoop版本兼容性(最常见原因)** - 确认Hive版本与Hadoop版本匹配 - 使用命令检查版本: ```bash hadoop version hive --version ``` - **不兼容场景**:Hive 3.x+ 需要 Hadoop 3.x(尤其注意`mergeDir`是Hadoop 3.x新增API) - **解决方案**: - 升级Hadoop到3.x以上版本(推荐) - 或降级Hive到2.x版本(兼容Hadoop 2.x) #### 2. **临时绕过方案(测试环境适用)** 在Hive会话中禁用文件合并操作(影响性能): ```sql SET hive.merge.mapfiles=false; -- 关闭Map任务输出合并 SET hive.merge.mapredfiles=false; -- 关闭Reduce任务输出合并 SET hive.merge.tezfiles=false; -- 关闭Tez引擎输出合并 ``` > 注意:这可能导致小文件增多,仅作临时测试用[^1]。 #### 3. **验证HDFS权限配置** 1. 检查HDFS目录权限: ```bash hdfs dfs -ls /user/hive/warehouse ``` 2. 确保Hive用户有读写权限: ```bash hdfs dfs -chown -R hive:hive /user/hive/warehouse hdfs dfs -chmod -R 775 /user/hive/warehouse ``` #### 4. **检查JAR包冲突** 排查Hadoop/Hive的JAR包版本冲突: ```bash ls $HADOOP_HOME/share/hadoop/common/*.jar ls $HIVE_HOME/lib/*.jar ``` > 若存在多个版本`hadoop-common.jar`,删除旧版本[^2]。 #### 5. **CDH环境的特殊处理** 若使用CDH(如引用[2]提到的5.4.0版本): 1. 检查Cloudera官方补丁: ```bash yum list | grep hive # RPM环境 apt-cache show hive # Debian环境 ``` 2. 等待官方修复(引用[2]确认该版本存在编译问题) 3. 临时降级Spark: ```bash sudo yum downgrade spark-core-1.3.0 ``` #### 6. **重建Hive元数据(最终手段)** 当元数据损坏时: ```sql DROP TABLE words; -- 删除问题表 CREATE TABLE words (...) -- 重建表(参考引用[1]) ``` --- ### 验证步骤 ```sql -- 重新加载数据(使用引用[1]的命令) LOAD DATA LOCAL INPATH '/path/to/data' INTO TABLE words; -- 执行查询验证 SELECT * FROM words LIMIT 5; ``` > **重要提示**:生产环境务必在升级前备份元数据库(通常存储在MySQL/PostgreSQL中)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值