Исключение nosuchmethoderror при чтении файла protobuf из hdfs

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

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

Исключение в потоке "main" java.lang.NoSuchMethodError: com.google.protobuf.CodedInputStream.shouldDiscardUnknownFields () Z в com.google.protobuf.GeneratedMessageV3.parseUnknownField (GeneratedMessageV3.java:290)

Это происходит только с некоторыми файлами protobuf. Файлы с другой схемой не имеют этой проблемы.

Мой файл protobuf заархивирован 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++;
}

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

Спасибо

Дэйвид

Каждый раз, когда я сталкивался с ошибкой NoSuchMethodError, это происходило из-за конфликта версий в используемой мной библиотеке. Обычно у меня есть прямая зависимость и косвенная зависимость, и они не используют одну и ту же версию. Не могу сказать, что это единственная причина, по которой такое может произойти, но это первое место, куда я бы посмотрел.

jwismar 13.09.2018 21:11
1
1
570
1

Ответы 1

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

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

Другие вопросы по теме