2

私は、データを読み取り、それをHDFS使用して書き込むコードを開発していますmapreduce。ただし、複数のファイルがある場合、それがどのように処理されるかわかりません。マッパーへの入力パスは、次の出力から明らかなように、ディレクトリの名前です。

String filename = conf1.get("map.input.file");

では、ディレクトリ内のファイルをどのように処理するのでしょうか?

4

2 に答える 2

10

入力ファイルのパスを取得するには、次のcontextようにオブジェクトを使用できます。

FileSplit fileSplit = (FileSplit) context.getInputSplit();
String inputFilePath = fileSplit.getPath().toString();

複数のファイルがどのように処理されるかについては、次のとおりです。

マッパー関数のいくつかのインスタンスが、クラスター内のさまざまなマシンに作成されます。各インスタンスは異なる入力ファイルを受け取ります。ファイルがデフォルトの dfs ブロック サイズ (128 MB) よりも大きい場合、ファイルはさらに小さな部分に分割され、マッパーに配布されます。

したがって、次の 2 つの方法で、各マッパーが受け取る入力サイズを構成できます。

  • HDFS ブロック サイズを変更します (例: dfs.block.size=1048576)
  • パラメーターを設定しますmapred.min.split.size(これは、HDFS ブロック サイズよりも大きいサイズにのみ設定できます)

注: これらのパラメーターは、入力形式が入力ファイルの分割をサポートしている場合にのみ有効です。一般的な圧縮コーデック (gzip など) はファイルの分割をサポートしていないため、これらは無視されます。

于 2012-12-28T11:29:32.577 に答える
0

@Amarの回答に続いて、カスタマイズした入力形式では入力ファイルが分割されないため、次のコードでFileStatusオブジェクトを使用しました。

FileSystem fs = file.getFileSystem(conf);
                FileStatus status= fs.getFileStatus(file);
                String fileName=status.getPath().toString();
于 2012-12-31T05:23:33.450 に答える