MapReduceプログラムがマッパーで繰り返し処理している入力パスの総数を取得しようとしています。これをカウンターと一緒に使用して、インデックスに応じて値をフォーマットします。マッパーから合計入力パス数を取得する簡単な方法はありますか?前もって感謝します。
2 に答える
入力パスの数を使用して、ジョブで構成をセットアップできます。と同じように
jobConf.setInt("numberOfPaths",paths.length);
ジョブを構成する場所にコードを配置するだけです。その後Mapper.setup(Mapper.Context context)
、コンテキストから取得して、構成から読み取ります。
ソースを調べることができますFileInputFormat.getSplits()
-これにより、構成プロパティがプルバックmapred.input.dir
され、このCSVがパスの配列に解決されます。
これらのパスは引き続きフォルダーと正規表現を表すことができるため、 getSplits() が次に行うことは、保護されたメソッドに配列を渡すことorg.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(JobContext)
です。これは実際にはディレクトリ/正規表現のリストを調べ、ディレクトリ/正規表現に一致するファイルをリストします(構成されている場合は a も呼び出しPathFilter
ます)。
したがって、このメソッドを保護することで、ListStatus メソッドを持つ FileInputFormat の単純な「ダミー」拡張を作成し、Mapper.Context を引数として受け入れ、FileInputFormat.listStatus メソッドへの呼び出しをラップすることができます。
public class DummyFileInputFormat extends FileInputFormat {
public List<FileStatus> listStatus(Context mapContext) throws IOException {
return super.listStatus(mapContext);
}
@Override
public RecordReader createRecordReader(InputSplit split,
TaskAttemptContext context) throws IOException,
InterruptedException {
// dummy input format, so this will never be called
return null;
}
}
EDIT:実際には、getSplits()メソッドの最後にFileInputFormat
ジョブプロパティmapreduce.input.num.files
を設定して、すでにこれを行っているようです(少なくとも1.0.2では、おそらく0.20.203で導入されました)