首页 > 解决方案 > 从 HDFS 读取 protobuf 文件时出现 NoSuchMethodError 异常

问题描述

我正在编写一个 java 程序来计算存储在 HDFS 中的 protobuff 文件的行数并使用“hadoop -jar countLine.jar”执行该程序

但是,我得到了例外

线程“主”java.lang.NoSuchMethodError 中的异常:com.google.protobuf.CodedInputStream.shouldDiscardUnknownFields()Z 在 com.google.protobuf.GeneratedMessageV3.parseUnknownField(GeneratedMessageV3.java:290)

这只发生在某些 protobuf 文件上。具有不同架构的文件不存在此问题。

我的 protobuf 文件是 gzip 压缩的 pb.gz。

//Here is the code 
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path path = new Path(<HDFS path to file>);
InputStream input = new GZIPInputStream(fs.open(path));
Message m;
while ((m = defaultMsg.getParserForType().parseDelimitedFrom(input)) != null) {
                recordCount++;
}

如果我将文件放在本地,一切正常

InputStream input = new GZIPInputStream(new File(path_to_local_file));
Message m;
while ((m = defaultMsg.getParserForType().parseDelimitedFrom(input)) != null) {
                recordCount++;
}

有没有人有想法。文件大小会导致这个问题吗?

谢谢

大卫

标签: javahdfsprotocol-buffers

解决方案


谢谢@jwismar 的提示。当我从命令行运行“hadoop jar countLine.jar”时会出现问题。Hadoop 类加载器加载了 protobuf 库,它的版本低于我用来生成 java 文件的 protoc。一旦我将协议降级为较低版本并重新生成 java 文件,问题就消失了。

谢谢大卫


推荐阅读