hadoop和hive的兼容问题

发布时间 2023-09-24 18:50:17作者: 突破铁皮

本人之前搭建的集群是hadoop3.3.5+hive3.1.3版本,后来发现这两个版本不兼容,虽然官方文档里面说hive3.1.3版本兼容hadoop3.x.y版本,但是当我在使用hive

执行插入语句时发现一直报同一个错误

java.lang.ClassCastException: org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$GetFileInfoRequestProto cannot be cast to com.google.protobuf.Message at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:247) at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:132) at com.sun.proxy.$Proxy9.getFileInfo(Unknown Source) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:966) 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.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:433) at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:166) at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:158) at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:96) at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:362) at com.sun.proxy.$Proxy10.getFileInfo(Unknown Source) at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:1739) at org.apache.hadoop.hdfs.DistributedFileSystem$29.doCall(DistributedFileSystem.java:1753) at org.apache.hadoop.hdfs.DistributedFileSystem$29.doCall(DistributedFileSystem.java:1750) at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81) at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1765) at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1829) at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.serviceInit(MRAppMaster.java:317) at org.apache.hadoop.service.AbstractService.init(AbstractService.java:164) at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$6.run(MRAppMaster.java:1760) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1899) at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.initAndStartAppMaster(MRAppMaster.java:1757) at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.main(MRAppMaster.java:1691)

经过查询资料得知,是hive语句转变为mapreduce程序的过程中,序列化出现的问题

网上资料说是hadoop和hive的jar包产生了冲突,之后我尝试删去hive的protobuf包换为hadoop的protobuf-java-2.5.0.jar,但是无济于事,依然是这个错误

之后我把hadoop里面相关的源代码下载下来,依照报错的提示找到了那个类和出差的代码块,之后我顺着错误找下去,之后我发现一个奇怪的问题那就是错误中提示使用了ProtobufRpcEngine类

但是我通过反编译的源码得到了两个类,其中一个为ProtobufRpcEngine2,而ProtobufRpcEngine被划了一条线,显然已经被废弃了,但是错误显示依然调用了ProtobufRpcEngine而不是ProtobufRpcEngine2,我猜测这可能就是问题的原因
没办法,之后我又尝试了hive3.1.2和hive4.0.0版本,但是都不太行,最后我决定把hadoop集群更换掉,将hadoop3.3.5替换为hadoop3.2.4版本
https://mirrors.aliyun.com/apache/hadoop/core/hadoop-3.2.4/?spm=a2c6h.25603864.0.0.17133820noW0iz

同时需要更改两个环境配置分别为/etv/profile和~/.bashrc ,前者为我的本地环境,后者为ssh远程连接时读取到的环境,一开始我忘记改变后者,导致一直显示为原来的环境变量
将原来的配置文件复制到新的hadoop集群中,这样就可以了
目前测试hadoop3.3.2+hive3.1.3+hbase2.5.5+zookeeper3.7.1没有问题,值得注意的是zookeeper3.7.1和spark3.3.2不兼容,这使得spark3.3.2无法搭建高可用集群

说实话,大数据生态圈的兼容性真的需要加强,还是建议不要使用新版本,不然就会被不适配问题折磨

经过调试,成功使用了hive插入语句