Как связать пользовательский файл hadoop-streaming.jar

Я пытаюсь использовать класс CombineFileInputFormat с помощью инструмента Yelp MrJob для EMR. Рабочий процесс создается с использованием потоковой передачи Hadoop, и в документации MrJob указано, что класс CombineFileInputFormat должен быть объединен в настраиваемый файл hadoop-streaming.jar.

Для контекста, пожалуйста, следуйте этому вопросу.

В частности, мой вопрос: где конкретный класс CombinedInputFormat.class должен быть связан или указан в hadoop-streaming.jar?

Я попытался связать CombinedInputFormat.class, добавив его в каталог org/apache/hadoop/streaming и выполнив:

jar uvf my-hadoop-streaming.jar org/apache/hadoop/streaming

Если я это сделаю, запустится потоковый рабочий процесс, с опцией -inputformat CombinedInputFormat Задание запустится на первом шаге и прервется с ошибкой:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/streaming/CombinedInputFormat (wrong name: CombinedInputFormat)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        ...

Если я просто попытаюсь установить его в корневом пути с помощью:

jar uvf my-hadoop-streaming.jar CombinedInputFormat.class

Ошибка, которую я получаю:

-inputformat : class not found : CombinedInputFormat
Streaming Job Failed!

Как мне связать CombinedInputFormat.class, чтобы он был правильно принят и устранил ошибку NoClassDefFoundError?


person vladimir montealegre    schedule 11.01.2013    source источник


Ответы (2)


Класс CombinedInputFormat, описанный здесь, расширяет CombineFileInputFormat и не портируется с помощью hadoop. . Итак, что вам нужно сделать, так это то, что в том же пакете, где у вас есть класс работы mapper/reducer, вы должны СОЗДАТЬ класс и иметь код, указанный в предыдущем выпуске. Затем создайте банку, и она должна работать нормально.

В общем, вам нужно написать свою собственную реализацию CombineFileInputFormat (которую я сделал для вас), и вы можете назвать ее как угодно, скажем, ABCClass вместо CombinedInputFormat, как я ее назвал.

person Amar    schedule 11.01.2013
comment
Спасибо, Амар, я обнаружил, что ошибка класса не найдена была вызвана отсутствием оператора пакета в начале пользовательского модуля класса. У меня это работает, но еще один вопрос, это очень хорошо работает для чтения необработанных строк текста, но у меня возникают проблемы с попыткой реализовать класс с помощью KeyValueLineRecordReader. В частности, у меня возникает проблема с методом next(), который, кажется, требует аргументов типа (Object, Object), но компилятор жалуется на строку возврата, говоря, что ему нужно возвращать тип (Text, Text). Что может быть причиной этого парадокса? - person vladimir montealegre; 13.01.2013
comment
Хорошо, поэтому вам нужно быть конкретным в отношении общих типов, на которые вы ссылаетесь здесь. Возможно, класс, который вы создаете, похож на: MyClass extends KeyValueLineRecordReader, но вместо этого вы должны делать что-то вроде: MyClass extends KeyValueLineRecordReader<Text,Text>. - person Amar; 13.01.2013
comment
Да, собственно, вчера вечером я понял, что это так, после этого исправления он работает гладко. Большое вам спасибо за вашу помощь! - person vladimir montealegre; 13.01.2013

Это еще один простой способ создать собственный jar-файл и запустить его в Hadoop Local или EMR http://www.applams.com/2014/05/using-custom-streaming-jar-using-custom.html

person hbr    schedule 20.05.2014