我正在编写一个java程序来计算存储在HDFS中的protobuff文件行,并使用"hadoop -jar countLine.jar"执行该程序
但是,我得到例外
线程"main"中的异常 java.lang.NoSuchMethodError: com.google.protobuf.CodedInputStream.shouldDiscardUnknownFields((Z at 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++;
}
有没有人知道。文件大小会导致此问题吗?
谢谢
大卫
谢谢@jwismar的提示。 当我从命令行运行"hadoop jar countLine.jar"时,就会出现问题。Hadoop类加载器加载了它附带的protobuf库,其版本低于我用来生成java文件的protoc。一旦我将 protoc 降级到较低版本并重新生成 java 文件,问题就消失了。
谢谢 大卫