3

プログラムのマップ フェーズでは、作成されたマッパーの総数を知る必要があります。これは、マップのキー作成プロセスに役立ちます (マッパーの数と同じ数のキーと値のペアを各オブジェクトに発行したい)。

マッパーの数を設定することはヒントにすぎないことはわかっていますが、実際のマッパーの数を取得するにはどうすればよいでしょうか。Mapper の configure メソッドで次のことを試しました。

public void configure(JobConf conf) {
    System.out.println("map tasks: "+conf.get("mapred.map.tasks"));
    System.out.println("tipid: "+conf.get("mapred.tip.id"));
    System.out.println("taskpartition: "+conf.get("mapred.task.partition"));
}

しかし、私は結果を得る:

map tasks: 1
tipid: task_local1204340194_0001_m_000000
taskpartition: 0
map tasks: 1
tipid: task_local1204340194_0001_m_000001
taskpartition: 1

これは (?) 印刷された 1 つだけでなく 2 つのマップ タスクがあることを意味します (2 つの小さな入力ファイルがあるので、これは非常に自然なことです)。マップ タスクの後の数は 2 であるべきではありませんか?

今のところ、入力フォルダー内のファイル数を数えるだけですが、ファイルがブロック サイズよりも大きくなり、複数の入力分割が発生してマッパーが発生する可能性があるため、これは適切な解決策ではありません。助言がありますか?

4

2 に答える 2

3

最後にconf.get("mapred.map.tasks"))、実行可能なjarファイルを生成し、クラスター/ローカルでプログラムを実行すると、結局は機能するようです。「マップタスク」の出力が正しくなりました。

Eclipse プラグインから Hadoop でローカルに mapreduce プログラムを実行した場合にのみ機能しませんでした。Eclipse プラグインの問題かもしれません。

これが同じ問題を抱えている他の誰かに役立つことを願っています。回答ありがとうございます。

于 2013-11-12T15:00:02.667 に答える
1

これを行う簡単な方法はないと思います。独自の InputFormat クラスを実装しました。これを行うと、ジョブを開始するプロセスで要求できる InputSplits の数をカウントするメソッドを実装できます。その番号を構成設定に入れると、マッパープロセスでそれを読み取ることができます。

大きなファイルは分割される可能性があるため、入力ファイルの数は常にマッパーの数とは限りません。

于 2013-10-13T09:09:55.717 に答える