0

MapReduceプログラムがマッパーで繰り返し処理している入力パスの総数を取得しようとしています。これをカウンターと一緒に使用して、インデックスに応じて値をフォーマットします。マッパーから合計入力パス数を取得する簡単な方法はありますか?前もって感謝します。

4

2 に答える 2

0

入力パスの数を使用して、ジョブで構成をセットアップできます。と同じように

jobConf.setInt("numberOfPaths",paths.length);

ジョブを構成する場所にコードを配置するだけです。その後Mapper.setup(Mapper.Context context)、コンテキストから取得して、構成から読み取ります。

于 2012-05-14T15:20:10.017 に答える
0

ソースを調べることができます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で導入されました)

JIRAチケットはこちら

于 2012-05-14T15:13:20.793 に答える