2012-11-05 184 views
5

所以我需要两个文件作为输入我的MapReduce程序:City.dat和Country.dat的Hadoop MapReduce的多个输入文件

在我的主要方法IM解析这样的命令行参数:

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

如果我现在运行我PROGRAMM用下面的命令:

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 

为什么它将此视为我的输出目录?我指定另一个目录作为输出目录。有人可以解释这一点吗?

+2

您可以改变问题标题,因为它会让第一次遇到问题的人感到困惑。 –

回答

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]); 
+0

这很奇怪,因为我总是用这个命令启动我的程序,它从来没有把org.myorg.Class作为零的参数。奇怪地转移我的所有指数导致同样的错误。而且我的输出文件夹不存在。问题是它认为/user/cloudera/input/Country.dat是我的输出文件夹...这就是为什么它不是空的。问题是为什么它认为这是我的输出文件夹。 – gaussd

+0

如果导致完全相同的错误,那么您没有运行您提供的代码。 –

+0

就我所遇到的问题而言,@ gaussd是正确的。 org.myorg.Capital不是args中的第0个元素。它只是说“从capital.jar文件中的类org.myorg.Capital开始”.. – pk10

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 

你当然可以只改变你的代码中使用的索引值,但是这不是最好的解决方案。

0

你可以试试这个:

Hadoop的罐子capital.jar /用户/ Cloudera公司/资本/输入/用户/ Cloudera公司/资本/输出

应显示在单个输入目录中的所有文件。

相关问题