所以我需要两个文件作为我的mapreduce程序的输入:City.dat和Country.dat
在我的main方法中,我解析命令行参数,如下所示:
Path cityInputPath = new Path(args[0]);
Path countryInputPath = new Path(args[1]);
Path outputPath = new Path(args[2]);
MultipleInputs.addInputPath(job, countryInputPath, TextInputFormat.class, JoinCountryMapper.class);
MultipleInputs.addInputPath(job, cityInputPath, TextInputFormat.class, JoinCityMapper.class);
FileOutputFormat.setOutputPath(job, outputPath);
如果我现在使用以下命令运行我的程序:
hadoop jar capital.jar org.myorg.Capital /user/cloudera/capital/input/City.dat /user/cloudera/capital/input/Country.dat /user/cloudera/capital/output
我收到以下错误:
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory /user/cloudera/capital/input/Country.dat already exists
为什么将此视为输出目录?我指定了另一个目录作为输出目录。有人可以解释一下吗?
答案 0 :(得分:6)
根据堆栈跟踪,您的输出目录不为空。所以最简单的事情就是在运行作业之前删除它:
bin/hadoop fs -rmr /user/cloudera/capital/output
除此之外,您的参数以主类org.myorg.Capital
的类名开头。这就是零指数的论证。 (基于堆栈跟踪和您提供的代码)。
基本上你需要将所有指数一个向右移动:
Path cityInputPath = new Path(args[1]);
Path countryInputPath = new Path(args[2]);
Path outputPath = new Path(args[3]);
MultipleInputs.addInputPath(job, countryInputPath, TextInputFormat.class, JoinCountryMapper.class);
MultipleInputs.addInputPath(job, cityInputPath, TextInputFormat.class, JoinCityMapper.class);
FileOutputFormat.setOutputPath(job, outputPath);
不要忘记清除输出文件夹了!
对你来说也是一个小提示,你可以用逗号“,”分隔文件,这样你就可以用这样的一个调用来设置它们:
hadoop jar capital.jar org.myorg.Capital /user/cloudera/capital/input/City.dat,/user/cloudera/capital/input/Country.dat
在你的java代码中:
FileInputFormat.addInputPaths(job, args[1]);
答案 1 :(得分:1)
这里发生的是类名被认为是第一个参数!
默认情况下,第一个非选项参数是要调用的类的名称。应使用完全限定的类名。如果指定了-jar选项,则第一个非选项参数是包含应用程序的类和资源文件的JAR存档的名称,其中启动类由Main-Class清单标头指示。
那么我建议您add a Manifest files to your jar在哪里指定主类。您的MANIFEST.MF文件可能如下所示:
Manifest-Version: 1.0
Main-Class: org.myorg.Capital
现在你的命令看起来像:
hadoop jar capital.jar /user/cloudera/capital/input/City.dat /user/cloudera/capital/input/Country.dat /user/cloudera/capital/output
您当然可以只更改代码中使用的索引值,但这不是明智的解决方案。
答案 2 :(得分:-1)
hadoop jar capital.jar / user / cloudera / capital / input / user / cloudera / capital / output
这应该读取单个输入目录中的所有文件。