Исключение NoSuchMethodError при чтении файла protobuf из HDFS - PullRequest
0 голосов
/ 13 сентября 2018

Я пишу Java-программу для подсчета строки файла protobuff, хранящегося в HDFS, и запускаю программу с помощью «hadoop -jar countLine.jar»

Однако я получаю исключение

Исключениев потоке "main" java.lang.NoSuchMethodError: com.google.protobuf.CodedInputStream.shouldDiscardUnknownFields () Z в com.google.protobuf.GeneratedMessageV3.parseUnknownField (только сгенерированный * * *.некоторые из файлов protobuf.Файлы с другой схемой не имеют этой проблемы.

Мой файл protobuf - gzipped 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++;
}

У кого-нибудь есть идеи?Будет ли размер файла вызывать эту проблему?

Спасибо

Дэвид

1 Ответ

0 голосов
/ 15 сентября 2018

Спасибо @jwismar за подсказки.Проблема возникает, когда я запускаю "hadoop jar countLine.jar" из командной строки.Загрузчик классов Hadoop загружает библиотеку protobuf, которая имеет более низкую версию, чем протокол, который я использовал для создания файлов Java.После того, как я понизил версию protoc до более низкой версии и заново сгенерировал java-файлы, проблема исчезла.

Спасибо, Дэвид

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...