私は、データを読み取り、それをHDFS
使用して書き込むコードを開発していますmapreduce
。ただし、複数のファイルがある場合、それがどのように処理されるかわかりません。マッパーへの入力パスは、次の出力から明らかなように、ディレクトリの名前です。
String filename = conf1.get("map.input.file");
では、ディレクトリ内のファイルをどのように処理するのでしょうか?
私は、データを読み取り、それをHDFS
使用して書き込むコードを開発していますmapreduce
。ただし、複数のファイルがある場合、それがどのように処理されるかわかりません。マッパーへの入力パスは、次の出力から明らかなように、ディレクトリの名前です。
String filename = conf1.get("map.input.file");
では、ディレクトリ内のファイルをどのように処理するのでしょうか?
入力ファイルのパスを取得するには、次のcontext
ようにオブジェクトを使用できます。
FileSplit fileSplit = (FileSplit) context.getInputSplit();
String inputFilePath = fileSplit.getPath().toString();
複数のファイルがどのように処理されるかについては、次のとおりです。
マッパー関数のいくつかのインスタンスが、クラスター内のさまざまなマシンに作成されます。各インスタンスは異なる入力ファイルを受け取ります。ファイルがデフォルトの dfs ブロック サイズ (128 MB) よりも大きい場合、ファイルはさらに小さな部分に分割され、マッパーに配布されます。
したがって、次の 2 つの方法で、各マッパーが受け取る入力サイズを構成できます。
dfs.block.size=1048576
)mapred.min.split.size
(これは、HDFS ブロック サイズよりも大きいサイズにのみ設定できます)注: これらのパラメーターは、入力形式が入力ファイルの分割をサポートしている場合にのみ有効です。一般的な圧縮コーデック (gzip など) はファイルの分割をサポートしていないため、これらは無視されます。
@Amarの回答に続いて、カスタマイズした入力形式では入力ファイルが分割されないため、次のコードでFileStatusオブジェクトを使用しました。
FileSystem fs = file.getFileSystem(conf);
FileStatus status= fs.getFileStatus(file);
String fileName=status.getPath().toString();