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);
}