5

したがって、mapreduceプログラムへの入力としてCity.datとCountry.datの2つのファイルが必要です。

私のメインメソッドでは、次のようにコマンドライン引数を解析します。

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

なぜこれを私の出力ディレクトリとして扱うのですか?出力ディレクトリとして別のディレクトリを指定しました。誰かがこれを説明できますか?

4

3 に答える 3

7

スタックトレースに基づいて、出力ディレクトリは空ではありません。したがって、最も簡単なことは、ジョブを実行する前に実際に削除することです。

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

それに加えて、メインクラスのクラス名で始まる引数org.myorg.Capital。これがゼロ番目のインデックスの引数です。(スタックトレースと提供したコードに基づきます)。

基本的に、すべてのインデックスを1つ右にシフトする必要があります。

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

ただし、出力フォルダをクリアすることを忘れないでください!

また、ちょっとしたヒントとして、ファイルをコンマ ""で区切ることができるので、次のように1回の呼び出しでファイルを設定できます。

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]);
于 2012-11-05T18:15:12.300 に答える
1

ここで起こっていることは、クラス名が最初の引数であると見なされるということです!

デフォルトでは、最初の非オプション引数は呼び出されるクラスの名前です。完全修飾クラス名を使用する必要があります。-jarオプションが指定されている場合、最初の非オプション引数は、アプリケーションのクラスファイルとリソースファイルを含むJARアーカイブの名前であり、スタートアップクラスはMain-Classマニフェストヘッダーで示されます。

したがって、マニフェストファイルを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

コードで使用されているインデックス値を変更することは確かに可能ですが、それはお勧めできない解決策です。

于 2012-11-05T22:20:06.743 に答える
-1

あなたはこれを試すことができます:

hadoop jar Capital.jar / user / cloudera / Capital / input / user / cloudera / Capital / output

これにより、単一の入力ディレクトリ内のすべてのファイルが読み取られます。

于 2013-11-14T05:40:47.470 に答える