java - Hadoop Mapreduce 多个输入文件

标签 java command-line hadoop mapreduce command-line-arguments

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

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

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

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

最佳答案

根据堆栈跟踪,您的输出目录不为空。所以最简单的事情实际上是在运行作业之前删除它:

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

关于java - Hadoop Mapreduce 多个输入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237497/

相关文章:

java - Java:存储随机种子以通过线程进行复制

java - 如何在不刷新android应用程序的情况下从数据库获取数据?

c - 例如,git 如何创建他们使用的数据库?

hadoop - 点击流数据分析

Hadoop MultipleOutPutFormat 和连接查询

hadoop - 运行 WordCount v1.0 示例时 part-00000 中没有输出

java - Eclipse 在将 GaussianBlur 与 OpenCV for Android 一起使用时出错

java - Android Studio 提供的 android 应用程序触发错误

windows - 复制文件到当前目录

linux - 如何使用正在运行的程序的 PID 获取实际的程序名称?