Я разработал программу уменьшения масштаба, используя Apache Hadoop 1.2.1. Я сделал начальную разработку, используя Eclipse IDE, чтобы имитировать распределенную вычислительную среду hadoop со всеми входными и выходными файлами, поступающими из локальной файловой системы. Эта программа будет выполнена в Eclipse без проблем. Затем я создаю файл JAR с помощью Eclipse, и попытаться запустить это на мой кластер из-одной Hadoop машины и получать сообщения об ошибках:Hadoop mapper class не найден
Вот мой код, чтобы установить и запустить задание Hadoop:
String outputPath = "/output";
String hadoopInstructionsPath = args[0];
Job job = new Job();
job.setJarByClass(Main.class); //setJarByClass is here but not found apparently?!?
job.setJobName("KLSH");
FileInputFormat.addInputPath(job, new Path(hadoopInstructionsPath));
FileOutputFormat.setOutputPath(job,new Path(outputPath));
job.setMapperClass(KLSHMapper.class);
job.setReducerClass(KLSHReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
System.exit(job.waitForCompletion(true) ? 0:1);
boolean success = job.waitForCompletion(true);
return success ? 0 : 1;
I затем создайте банку, используя eclipse, с помощью файла File -> Export -> Runnable JAR, чтобы создать файл JAR для запуска в кластере.
Команда, которую я использую для выполнения задания, выглядит следующим образом (KLSH.jar - это имя файла JAR,/hasoopInstruction - это входной параметр args [0] и imageFeature.Main/указывает, где находится основной класс)
./hadoop jar ./KLSH.jar /hadoopInstructions imageFeatures.Main/
Это производит следующий вывод:
14/11/12 11:11:48 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/11/12 11:11:48 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
14/11/12 11:11:48 INFO input.FileInputFormat: Total input paths to process : 1
14/11/12 11:11:48 INFO util.NativeCodeLoader: Loaded the native-hadoop library
14/11/12 11:11:48 WARN snappy.LoadSnappy: Snappy native library not loaded
14/11/12 11:11:49 INFO mapred.JobClient: Running job: job_201411051030_0022
14/11/12 11:11:50 INFO mapred.JobClient: map 0% reduce 0%
14/11/12 11:11:56 INFO mapred.JobClient: Task Id : attempt_201411051030_0022_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: imageFeatures.KLSHMapper
...
Так это ошибки, потому что он не может найти класс картографа. Существует предупреждение «Нет заданий в файле jar file», но я чувствую, что я указал job.setJarByClass в первом блоке кода, поэтому не знаю, почему эта ошибка возникает ...
I также знать класс KLSHMapper находится в JAR, потому что, если я выполнить следующую команду:
jar tf KLSH.jar
Я получаю довольно много продукции, но вот часть выхода:
...
imageFeatures/Main.class
imageFeatures/Feature.class
imageFeatures/FileLoader.class
imageFeatures/KLSHMapper.class
...
Так ясно Класс KLSHMapper там ... Я пробовал модифицировать мой путь класса hadoop, чтобы включить путь KLSH.jar, Я попытался скопировать KLSH.jar в DFS и попытаться использовать этот путь вместо пути в локальной файловой системе, и я также попытался выполнить задание с помощью спецификатора -libjars. Независимо от того, что я, кажется, пытаюсь, hadoop, похоже, не может найти мой класс Mapper. Может ли кто-нибудь там указать мне на то, что я делаю неправильно? Я просто не могу сделать переход от моего кода, работающего в Eclipse, чтобы заставить его работать с фактическим кластером Hadoop. Благодаря!
Могу я спросить, странно, каким образом? Я основывал свой код на примере кода в книге Hadoop, «Определяющее руководство» (3-е издание). Это мое первое серьезное предприятие, использующее Hadoop для выполнения всего, кроме как подсчета слов. Есть ли лучший способ сделать что-то? – shutch
Я просто не знаком с распределенной вычислительной средой, использующей хаос. Не значит критиковать то, что вы делаете. Я уверен, что ты на правильном пути. Вы просмотрели документацию для класса Job: http://hadoop.apache.org/docs/r2.3.0/api/org/apache/hadoop/mapreduce/Job.html –
Я думаю, все, что я могу сказать наверняка, это что ошибка, которую вы получаете, больше связана с тем, что java не находит файл класса. Должна быть ссылка на физическое местоположение файла jar в CLASSPATH, а затем в Java вам нужно указать, где находится найденный пакет (который обычно выполняется с помощью инструкции import). –