Org.apache.hadoop.mapred.FileAlreadyExistsException
Я пытался запустить пример программы в Hadoop, указанный здесь
когда я пытаюсь запустить его, я получаю org.apache.hadoop.mapred.FileAlreadyExistsException
[email protected]:~/project/hadoop-0.20.2$ bin/hadoop jar jar_files/wordcount.jar org.myorg.WordCount jar_files/wordcount/input jar_files/wordcount/output
11/02/06 14:54:23 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
11/02/06 14:54:23 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory file:/home/emil/project/hadoop-0.20.2/jar_files/wordcount/input already exists
at org.apache.hadoop.mapred.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:111)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:772)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:730)
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1249)
at org.myorg.WordCount.main(WordCount.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
[email protected]:~/project/hadoop-0.20.2$
Его из /home/emil/project/hadoop -0.20.2/jar_files/wordcount/input, что я беру файлы ввода file01 и file02. Когда я googled, я узнал, что это сделано для предотвращения повторного выполнения одной и той же задачи. Но в моем случае это входной файл, вызывающий исключение.
Что-то не так с моей командой, потому что я не вижу сообщений с той же ошибкой для проблемы wordcount.
Я новичок в java.
Что может быть причиной этого?
Ответы
Ответ 1
Я столкнулся с той же проблемой. Потратил меня на то, чтобы понять, что происходит. Основная проблема заключалась в том, что вы не могли подключить отладчик, чтобы узнать, какие значения передаются.
вы используете аргументы [0] в качестве входных данных и args [1] в качестве выходной папки в вашем коде.
Теперь, если вы используете новую структуру, в которой вы используете командные строки внутри метода run класса Tool, args [0] - это имя исполняемой программы, которая в этом случае является WordCount.
args [1] - это имя входной папки, которую вы указываете, которая отображается программой в выходной папке, и, следовательно, вы видите исключение.
Итак, решение:
используйте args [1] и args [2].
Ответ 2
Вам нужно удалить выходной каталог, который вы даете, если задание выполнялось один раз.
Этот должен идти за вами.
bin/hadoop fs -rmr jar_files/wordcount/output
ИЗМЕНИТЬ
Я пропустил понимание создателя, подумал, что это идет о примере с примерами из примера хаоса. Не могли бы вы предоставить исходный код в своем классе? org.myorg.WordCount
Ответ 3
Я просто столкнулся с этим, и я обнаружил, что должен был сделать оба то, что Сандип и Томас сказали: используйте аргументы [1] и args [2] в примере кода и убедитесь, что выходной каталог не работает, t, несмотря на то, что говорит пример.
Ответ 4
Да. Я столкнулся с той же проблемой. Когда я удалил org.myorg.WordCount
, он работал нормально.
Изменить:
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
Единственный вход, ожидаемый заданием, - это путь ввода и вывода
Ответ 5
Это необходимо для предотвращения перезаписи предыдущих результатов.
Вы можете очистить и удалить выходной путь при создании и задании задания:
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
TextInputFormat.addInputPath(job,new Path(args[0]));
FileSystem.get(conf).delete(new Path(args[1]),true);
TextOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}