protobuf 2.5.0问题

简介:

线上一个项目需要操作hdfs和hive,在使用时报如下错误:

java.lang.UnsupportedOperationException: This is supposed to be overridden by subclasses.
        at com.google.protobuf.GeneratedMessage.getUnknownFields(GeneratedMessage.java:180)
        at org.apache.hadoop.hdfs.protocol.proto.HdfsProtos$FsPermissionProto.getSerializedSize(HdfsProtos.java:5407)
        at com.google.protobuf.CodedOutputStream.computeMessageSizeNoTag(CodedOutputStream.java:749)
        at com.google.protobuf.CodedOutputStream.computeMessageSize(CodedOutputStream.java:530)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$CreateRequestProto.getSerializedSize(ClientNamenodeProtocolProtos.java:2371)
        at com.google.protobuf.AbstractMessageLite.toByteString(AbstractMessageLite.java:49)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.constructRpcRequest(ProtobufRpcEngine.java:149)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:193)
        at $Proxy28.create(Unknown Source)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.create(ClientNamenodeProtocolTranslatorPB.java:193)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:164)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:83)
        at $Proxy29.create(Unknown Source)
        at org.apache.hadoop.hdfs.DFSOutputStream.<init>(DFSOutputStream.java:1325)
        at org.apache.hadoop.hdfs.DFSOutputStream.newStreamForCreate(DFSOutputStream.java:1344)
        at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1255)
        at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1212)
        at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:276)
        at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:265)
        at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:82)
        at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:886)

根据堆栈信息,可以看到是pb的问题,异常由com.google.protobuf.GeneratedMessage类的getUnknownFields方法抛出。
在2.4.0a中这个方法的定义如下:

    //@Override (Java 1.6 override semantics, but we must support 1.5)
    public final UnknownFieldSet getUnknownFields() {
      return unknownFields; //会返回一个值
    }

而在2.5.0中:

  //@Override (Java 1.6 override semantics, but we must support 1.5)
  public UnknownFieldSet getUnknownFields() {
    throw new UnsupportedOperationException( //在180行可以看到这个方法直接返回一个错误
        "This is supposed to be overridden by subclasses.");
  }

即这个错误是由于pb的版本导致,项目是运行在tomcat容器下面的,在WEB-INF/lib目录下只发现protobuf-java-2.4.0a.jar的包,同时在整个文件系统中也只有这一个pb包,在删除这个pb包之后,错误仍然存在,也就是有可能pb已经打在别的jar包里面了。通过jar tvf,最终发现pb是在hive-exec的包里面:

jar tvf hive-exec-0.13.1.jar |grep protobuf
     0 Mon Jun 02 12:50:20 CST 2014 META-INF/maven/com.google.protobuf/
     0 Mon Jun 02 12:50:20 CST 2014 META-INF/maven/com.google.protobuf/protobuf-java/
   141 Mon Jun 02 12:50:20 CST 2014 META-INF/maven/com.google.protobuf/protobuf-java/pom.properties
  8375 Mon Jun 02 12:50:20 CST 2014 META-INF/maven/com.google.protobuf/protobuf-java/pom.xml
     0 Mon Jun 02 12:50:20 CST 2014 com/google/protobuf/
  1014 Mon Jun 02 12:50:20 CST 2014 com/google/protobuf/AbstractMessage$1.class
30034 Mon Jun 02 12:50:20 CST 2014 com/google/protobuf/AbstractMessage$Builder.class
  7979 Mon Jun 02 12:50:20 CST 2014 com/google/protobuf/AbstractMessage.class
...

同时解压jar之后,查看其pom.properties文件,发现是pb是2.5.0版本的

cd /usr/local/src/META-INF/maven/com.google.protobuf/protobuf-java
cat pom.properties
#Generated by org.apache.felix.bundleplugin
#Thu Mar 07 15:48:28 PST 2013
version=2.5.0
groupId=com.google.protobuf
artifactId=protobuf-java

尝试更改了hive的pom文件,把pb的依赖设置为2.4.0a时,编译不能通过,即cdh4.6.0是需要使用pb 2.4.x的,而hive0.13.1默认是使用2.5.0的,而项目默认加载了2.5.0的pb,导致会报错。

根据

http://stackoverflow.com/questions/5474765/order-of-loading-jar-files-from-lib-directory

https://issues.apache.org/bugzilla/show_bug.cgi?id=57129

在 tomcat 5-7 jar包是按字母顺序加载的,因此如果要想使protobuf-java-2.4.0a.jar先于hive-exec-0.13.1.jar加载,可以更改protobuf-java-2.4.0a.jar的文件名。




本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1592804,如需转载请自行联系原作者

相关文章
|
SQL 存储 缓存
Paimon与Spark
Paimon与Spark
594 1
|
9月前
|
人工智能 数据挖掘 物联网
智能穿戴设备市场竞争的内卷与突围
智能穿戴设备市场竞争的内卷与突围
224 19
|
9月前
|
存储 缓存 弹性计算
聚宽揭秘:为什么量化研究员喜欢在Kubernetes上使用Fluid简化数据管理?
在量化投研过程中,通过引入阿里云的 ack-fluid 技术,基于 JindoRuntime 的分布式缓存加速,解决了多数据源、弹性扩展、动态挂载等挑战,显著提升了数据处理效率和资源利用率,降低运营成本。
|
12月前
|
人工智能
HunyuanVideo:腾讯推出的开源视频生成模型,参数高达130亿
腾讯推出的开源视频生成模型HunyuanVideo,拥有130亿参数,是目前参数量最大的开源视频模型之一。该模型具备物理模拟、高文本语义还原度、动作一致性和电影级画质等特性,能生成带有背景音乐的视频,推动了视频生成技术的发展和应用。
546 16
HunyuanVideo:腾讯推出的开源视频生成模型,参数高达130亿
|
人工智能 中间件 Java
呼叫中心系统如果对接阿里灵积大模型
自chatgpt3.5发布以来,各种大模型飞速发展,各行各业都有接入大模型的需求,呼叫中心行业非常适合通过接入大模型用AI来回答用户的各种咨询,降低人力资源,使用顶顶通呼叫中心中间件,只需要100行不到的代码,就可以非常简单容易的让电话机器人系统,呼叫中心系统快速接入各种大模型
769 2
|
机器学习/深度学习 存储 并行计算
深度学习之声纹识别
基于深度学习的声纹识别(Speaker Recognition)是一种通过分析和识别人的声音特征来确认身份的技术。
2437 2
|
IDE 开发工具 Android开发
Gradle升级,Error:Connection timed out: connect. If you are behind an HTTP proxy, please configure
Gradle升级,Error:Connection timed out: connect. If you are behind an HTTP proxy, please configure
5252 0
Gradle升级,Error:Connection timed out: connect. If you are behind an HTTP proxy, please configure
|
小程序 物联网 Java
Android 蓝牙BLE开发从官方源码demo开始(一)
Android 蓝牙BLE开发从官方源码demo开始(一)
|
存储 人工智能 数据库
AI知识库这事儿FastGPT是专业的
在搭建AI知识库这事儿上,有不少成熟的框架,我推荐使用FastGPT。这篇文章笔者就使用过的两款平台做个比较,FastGPT和百度千帆平台。