Hive on Tez插入数据失败:Kryo未注册类ID:95求助
问题:Hive Tez引擎执行Insert操作触发Kryo序列化错误
问题详情
- 执行语句:
hive> insert into music values (1,'Faded'); - 核心报错:
org.apache.hive.com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID: 95 - 环境配置:Hadoop 3.4.0、Hive 3.1.3、Tez 0.10.2、RHEL 7.9
- 异常现象:
- 使用MR作为执行引擎时所有操作正常
- Tez引擎执行排序、关联等查询正常,但执行Insert操作(beeline/hive cli均触发)报错
- 报错中提及的HDFS路径不存在
解决步骤
1. 精准注册Kryo序列化类
在Hive配置文件hive-site.xml中添加配置,强制注册缺失的Vector类(适配Insert操作的行批序列化需求):
<property> <name>hive.tez.kryo.classesToRegister</name> <value>org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch,org.apache.hadoop.hive.ql.exec.vector.LongColumnVector,org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector</value> </property>
若表包含其他数据类型(如浮点、布尔),需对应添加
DoubleColumnVector、BooleanColumnVector等类。
2. 修复Tez与Hive的依赖兼容性
Hive 3.1.3与Tez 0.10.2可能存在Kryo版本冲突:
- 对比Hive
lib目录与Tezlib目录下的kryo-*.jar版本 - 将Tez lib中的Kryo jar替换为Hive使用的版本
- 重新打包Tez并分发到HDFS(如果使用分布式Tez部署)
3. 处理HDFS路径问题
针对报错中缺失的HDFS路径:
- 确认目标表
music的存储路径是否存在:hdfs dfs -ls /user/hive/warehouse/music(替换为实际路径) - 检查Tez临时工作目录权限:
hdfs dfs -chmod -R 770 /tmp/hive/tez - 手动创建缺失路径:
hdfs dfs -mkdir -p /报错中显示的缺失路径
4. 调整Tez序列化配置
在tez-site.xml中添加以下配置,放宽Kryo序列化限制:
<property> <name>tez.runtime.kryo.serializer.buffer.mb</name> <value>64</value> </property> <property> <name>tez.runtime.kryo.serializer.buffer.max.mb</name> <value>128</value> </property> <property> <name>tez.runtime.kryo.registrationRequired</name> <value>false</value> </property>
注:
registrationRequired设为false会允许自动注册未定义类,可能解决类ID未注册问题,但会有轻微性能开销,优先尝试精准注册方案。
5. 重置缓存
- 清除Hive本地缓存:
rm -rf /tmp/hive-${USER}(替换为实际运行Hive的用户名) - 重启YARN服务,清除Tez AM缓存
- 重新执行Insert语句
内容的提问来源于stack exchange,提问作者Kaung Htet Hein
相关产品推荐
相关产品推荐

