указание собственного входного формата для потоковой работы - PullRequest
4 голосов
/ 09 февраля 2012

Я определил свой собственный формат ввода следующим образом, который предотвращает разбиение файла:

import org.apache.hadoop.fs.*;
import org.apache.hadoop.mapred.TextInputFormat;

public class NSTextInputFormat extends TextInputFormat {
    @Override
    protected boolean isSplitable(FileSystem fs, Path file) {
        return false;
    }
}

Я скомпилировал это с помощью Eclipse в класс NSTextInputFormat.class. Я скопировал этот класс клиенту, с которого запускается задание. Я использовал следующую команду для запуска задания и передачи над классом как inputformat.

hadoop jar $ HADOOP_HOME / hadoop-streaming.jar -Dmapred.job.queue.name = ununded -input 24222910 / framefile -input 24225109 / framefile -output Выходной -inputformat NSTextInputFormat -mapper ExtractHSV-файл -умат-HST-файл-файл-N-файл-файл-HS-файл-файл-файл-HS-файл-файл-файл-NS-файл-файл-файл-HS-файл-файл-файл-N-файл-файл-файл-HS-файл-файл-файл-HS-файл-файл-файл-N-файл-файл-файл-HS-файл-файл-файл-N-файл-файл-файл-FS-файл-файл-N-файл-файл-файл-файл-файл-файл-файл-N-файл-файл-файл-файл-файл-файл-файл-файл-файл-файл -numReduceTasks 0

Это не говорит: -inputformat: класс не найден: NSTextInputFormat Ошибка потоковой работы!

Я установил переменные PATH и CLASSPATH в каталог, содержащий NSTextInputFormat.class, но все равно это не работает. Любые указатели на это будут полезны.

Ответы [ 2 ]

4 голосов
/ 27 декабря 2013

Здесь есть несколько ошибок, которые могут помочь вам, если вы не знакомы с Java.

-inputformat (и другие параметры командной строки, которые ожидают имена классов) ожидает полное имя класса, в противном случае он ожидаетнайдите класс в некотором org.apache.hadoop... пространстве имен.Таким образом, вы должны включить имя пакета в ваш файл .java

package org.example.hadoop;

import org.apache.hadoop.fs.*;
import org.apache.hadoop.mapred.TextInputFormat;

public class NSTextInputFormat extends TextInputFormat {
    @Override
    protected boolean isSplitable(FileSystem fs, Path file) {
        return false;
    }
}

и указать полное имя в командной строке:

-inputformat org.example.hadoop.NSTextInputFormat

При сборке файла JAR файл .classтакже должен быть в структуре каталогов, которая отражает имя пакета.Я уверен, что это Java Packaging 101, но если вы используете потоковую передачу Hadoop, то вы, вероятно, не слишком знакомы с Java в первую очередь.Передача опции -d в javac скажет ему скомпилировать входные файлы в файлы .class в каталогах, которые соответствуют имени пакета.

javac -classpath `hadoop classpath` -d ./output NSTextInputFormat.java

Скомпилированный файл .class будет записан в ./output/org/example/hadoop/NSTextInputFormat.class.Вам нужно будет создать каталог output, но другие подкаталоги будут созданы для вас.Затем файл jar можно создать следующим образом:

jar cvf myjar.jar -C ./output/ .

И вы должны увидеть вывод, подобный следующему:

added manifest
adding: org/(in = 0) (out= 0)(stored 0%)
adding: org/example/(in = 0) (out= 0)(stored 0%)
adding: org/example/hadoop/(in = 0) (out= 0)(stored 0%)
adding: org/example/hadoop/NSTextInputFormat.class(in = 372) (out= 252)(deflated 32%)
3 голосов
/ 17 мая 2012

Объедините формат ввода и класс сопоставления в jar (myjar.jar) и добавьте параметр -libjars myjar.jar в командную строку:

hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
   -libjars myjar.jar \
   -Dmapred.job.queue.name=unfunded \\
   -input 24222910/framefile \
   -input 24225109/framefile \
   -output Output \
   -inputformat NSTextInputFormat \
   -mapper ExtractHSV \
   -numReduceTasks 0
...