1

私のマップ削減ジョブでは、入力ファイルの行を読み取って外部ファイル パスを取得しています。したがって、入力として使用しているファイルは次のようになります。

/user/local/myfiles/temp1.png

/user/local/myfiles/temp2.jpg

/user/local/myfiles/temp3.txt

/user/local/myfiles/temp4.txt

....

そして、それらのファイルに対して何らかの操作を実行したいと考えています。map 関数で読み取った文字列パスからファイル オブジェクトを取得する必要があります。私の質問は、これらのファイルの実際のコピーをどこに置いて、それらを取得できるようにするかです。Hadoop dfs に配置しますか? それらをローカルシステムに配置すると、ファイルが見つからないというエラーが発生しますが、hadoop ファイルシステムに配置すると同じエラーが発生します (したがって、入力ファイルのすべての行は "/user/hadoop/input/ temp1.txt")。ファイル名は取得できますが、入力ファイルにリストされているパスから画像オブジェクトまたはテキスト ファイル オブジェクトを取得できる必要があります。文字列パスだけを指定して、マップ関数から dfs (またはローカル システム) 上のファイルにアクセスする方法はありますか?

4

1 に答える 1

1

すべてのマッパーからアクセスできるように、それらを HDFS に追加する必要があります。以下は私にとってはうまくいきます(0.20で):

        FileSystem fs = FileSystem.get(context.getConfiguration());
        FSDataInputStream in = null;
        BufferedReader br = null;
        String line = null;

        String file = context.getConfiguration().get(Constants.INFILE); 
        in = fs.open(new Path(file));
        br = new BufferedReader(new InputStreamReader(in));
        while((line=br.readLine())!=null)

そして、ファイル名をコードにハードコーディングしないように、ドライバーに Constants.INFILE を追加します。

于 2012-10-16T19:32:26.697 に答える