2012-11-05 16 views
5

は、だから、私のMapReduceプログラムへの入力として2つのファイルを必要とする:City.datと私のメインの方法イムでCountry.datHadoopのMapReduceの複数の入力ファイル

は次のようにコマンドライン引数を解析:

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 

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

+2

質問の見出しを変更してください。最初に質問を通過した人が混乱することがあります。 –

答えて

6

stacktraceに基づいて、出力ディレクトリは空ではありません。 、そのほかに

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

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

あなたのための小さなヒントは、このような単一の呼び出しでそれらを設定することができますので、あなたは「」カンマでファイルを分離することができます:

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 

あなたは確かに自分のコード内で使用されているインデックス値を変更することができますが、それは賢明な解決策ではないのです。これは、単一の入力ディレクトリ内のすべてのファイルをお読みください

Hadoopのジャーcapital.jar /ユーザー/ Clouderaの/資本/入力/ユーザー/ Clouderaの/資本/出力

0

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

関連する問題