hadoopmapreduce多个输入文件

iovurdzv  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(350)

所以我需要两个文件作为我的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

为什么要把它当作我的输出目录?我指定了另一个目录作为输出目录。有人能解释一下吗?

b0zn9rqh

b0zn9rqh1#

你能试试这个吗:
hadoop jar capital.jar/user/cloudera/capital/input/user/cloudera/capital/output
这应该读取单个输入目录中的所有文件。

332nm8kg

332nm8kg2#

这里发生的事情是,类名被认为是第一个参数!
默认情况下,第一个non-option参数是要调用的类的名称。应使用完全限定的类名。如果指定了-jar选项,则第一个non-option参数是包含应用程序的类和资源文件的jar存档的名称,启动类由主类清单头指示。
所以我建议您在jar中添加一个清单文件,在其中指定main类。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

当然,您可以只更改代码中使用的索引值,但这不是明智的解决方案。

az31mfrm

az31mfrm3#

根据stacktrace,输出目录不是空的。因此,最简单的方法实际上是在运行作业之前删除它:

bin/hadoop fs -rmr /user/cloudera/capital/output

除此之外,您的参数以主类的类名开始 org.myorg.Capital . 这就是关于第0个索引的论点(基于stacktrace和您提供的代码)。
基本上,你需要把所有的索引移到右边:

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

相关问题