現在、マップタスクの数を20に修正したジョブを実行していますが、より高い数を取得しています。また、reduceタスクをゼロに設定しましたが、まだゼロ以外の数値を取得しています。 MapReduceジョブが完了するまでの合計時間も表示されません。誰かが私が間違っていることを教えてもらえますか。私はこのコマンドを使用しています
hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0
出力:
11/07/30 19:48:56 INFO mapred.JobClient: Job complete: job_201107291018_0164
11/07/30 19:48:56 INFO mapred.JobClient: Counters: 18
11/07/30 19:48:56 INFO mapred.JobClient: Job Counters
11/07/30 19:48:56 INFO mapred.JobClient: Launched reduce tasks=13
11/07/30 19:48:56 INFO mapred.JobClient: Rack-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient: Launched map tasks=24
11/07/30 19:48:56 INFO mapred.JobClient: Data-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient: FileSystemCounters
11/07/30 19:48:56 INFO mapred.JobClient: FILE_BYTES_READ=4020792636
11/07/30 19:48:56 INFO mapred.JobClient: HDFS_BYTES_READ=1556534680
11/07/30 19:48:56 INFO mapred.JobClient: FILE_BYTES_WRITTEN=6026699058
11/07/30 19:48:56 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=1928893942
11/07/30 19:48:56 INFO mapred.JobClient: Map-Reduce Framework
11/07/30 19:48:56 INFO mapred.JobClient: Reduce input groups=40000000
11/07/30 19:48:56 INFO mapred.JobClient: Combine output records=0
11/07/30 19:48:56 INFO mapred.JobClient: Map input records=40000000
11/07/30 19:48:56 INFO mapred.JobClient: Reduce shuffle bytes=1974162269
11/07/30 19:48:56 INFO mapred.JobClient: Reduce output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient: Spilled Records=120000000
11/07/30 19:48:56 INFO mapred.JobClient: Map output bytes=1928893942
11/07/30 19:48:56 INFO mapred.JobClient: Combine input records=0
11/07/30 19:48:56 INFO mapred.JobClient: Map output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient: Reduce input records=40000000
[hcrc1425n30]s0907855:
特定のジョブのマップタスクの数は、mapred.map.tasksパラメーターではなく、入力分割の数によって決まります。入力分割ごとに、マップタスクが生成されます。そのため、mapreduceジョブの有効期間中、マップタスクの数は入力分割の数に等しくなります。 mapred.map.tasksは、マップの数に関するInputFormatへの単なるヒントです。
あなたの例では、Hadoopは24の入力分割があると判断し、合計24のマップタスクを生成します。ただし、各タスクトラッカーで並行して実行できるマップタスクの数を制御できます。
また、-Dの後にスペースを削除すると、reduceの問題が解決する場合があります。
マップの数とタスクの削減の詳細については、以下のURLをご覧ください
https://cwiki.Apache.org/confluence/display/HADOOP2/HowManyMapsAndReduces
Praveenが前述したように、基本的なFileInputFormat
クラスを使用するときは、データを構成する入力分割の数だけです。レデューサーの数isは、mapred.reduce.tasks
によって制御されます。-D mapred.reduce.tasks=10
は10個のレデューサーを指定します。 -D
の後のスペースは必須;であることに注意してください。スペースを省略すると、構成プロパティーはHadoopではなく関連するJVMに渡されます。
削減作業がないため、0
を指定していますか?その場合、実行時パラメーターに問題がある場合は、コードで直接値を設定することもできます。 JobConf
インスタンスjob
を指定して、呼び出します
job.setNumReduceTasks(0);
たとえば、Tool.run
の実装内。これにより、マッパーから直接出力が生成されます。ジョブが実際に出力をまったく生成しない場合(ネットワーク呼び出しや画像処理などの副作用のためだけにフレームワークを使用しているため、または結果がカウンター値で完全に考慮される場合)、呼び出して出力を無効にすることができます
job.setOutputFormat(NullOutputFormat.class);
HadoopのMapReduceフレームワークでは次のことしかできないことに注意してください
提案ジョブのマップタスクの数
上記で指摘したPraveenのように、タスクの入力分割の数に対応します。レデューサーの数に対する動作とは異なり(MapReduceジョブによって出力されるファイルの数に直接関連しています)
デマンド n個の減速機を提供します。
例で説明するには:
Hadoop入力ファイルサイズが2 GBで、ブロックサイズを64 MBに設定すると、32個のMappersタスクが実行されるように設定され、各マッパーは64 MBブロックを処理してHadoopジョブのMapperジョブを完了します。
==>実行するように設定されたマッパーの数は、1)ファイルサイズと2)ブロックサイズに完全に依存しています
クラスターサイズ4でhadoopを実行していると仮定します。confファイルのmapred.map.tasksおよびmapred.reduce.tasksパラメーターをノードに次のように設定するとします。
Node 1: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 2: mapred.map.tasks = 2 and mapred.reduce.tasks = 2
Node 3: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 4: mapred.map.tasks = 1 and mapred.reduce.tasks = 1
このクラスターの4つのノードに上記のパラメーターを設定するとします。 Node 2の処理リソースが少ない場合があるため、Node 2がそれぞれ2と2のみを設定していることに気付いた場合(2プロセッサー、2コア)、Node 4はさらに低く設定されますそのノードの処理リソースがそれぞれ1プロセッサ、2コアであるため、それぞれ1と1だけになるのは、マッパータスクとリデューサータスクを1つしか実行できないためです。
したがって、ジョブを実行すると、Node 1、Node 2、Node 3、Node 4は最大値を実行するように構成されます。ジョブが完了する必要がある42個のマッパータスクのうち、合計(4 + 2 + 4 + 1)11個のマッパータスク。各Nodeがマップタスクを完了すると、残りのマッパータスクが42マッパータスクに残ります。
Mapred.reduce.tasks = 0に設定すると、リデューサーに移り、42個のファイル(マッパータスクごとに1ファイル)にのみマッパー出力を取得し、レデューサー出力は取得しません。
Hadoopの新しいバージョンでは、はるかに詳細なmapreduce.job.running.map.limit
およびmapreduce.job.running.reduce.limit
これにより、hdfsファイルの分割サイズに関係なく、マッパーとリデューサーのカウントを設定できます。これは、クラスター内の大きなリソースを使用しないという制約がある場合に役立ちます。
ログから、12個のローカルマップが生成されるため、12個の入力ファイルがあることがわかりました。ラックローカルマップは、そのファイルのブロックの一部が他のデータノードにある場合、同じファイルに対して生成されます。データノードはいくつありますか?
マップタスクの数は、入力が分割されるチャンクの数によって直接定義されます。データチャンクのサイズ(つまりHDFSブロックサイズ)は制御可能であり、個々のファイル、ファイルのセット、ディレクトリに設定できます。そのため、ジョブに特定の数のマップタスクを設定することは可能ですが、ジョブの入力データに対応するHDFSブロックサイズを設定する必要があります。 mapred.map.tasksもこれに使用できますが、指定された値がジョブの入力データの分割数よりも大きい場合のみです。
mapred.reduce.tasksを介してレデューサーの数を制御することは正しいです。ただし、これをゼロに設定するのはかなり特殊なケースです。ジョブの出力はマッパーの出力の連結(ソートなし)です。マットの答えでは、減速機の数を設定するより多くの方法を見ることができます。
あなたの例では、-D
パーツは選択されません:
hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0
これらは、次のようにクラス名部分の後に来る必要があります。
hadoop jar Test_Parallel_for.jar Test_Parallel_for -Dmapred.map.tasks=20 -Dmapred.reduce.tasks=0 Matrix/test4.txt Result 3
ただし、-D
の後のスペースは許可されます。
また、他の人がここで言及したように、マッパーの数を変更することはおそらく悪い考えであることに注意してください。
最初の部分は既に「提案」と回答されています。2番目の部分も「周りの余分なスペースを削除= "これらが機能しない場合、 ToolRunner を実装しましたか?」
マップタスクの数はファイルサイズに依存します。n個のマップが必要な場合は、次のようにファイルサイズをnで除算します。
conf.set("mapred.max.split.size", "41943040"); // maximum split file size in bytes
conf.set("mapred.min.split.size", "20971520"); // minimum split file size in bytes
数値mappタスクは入力分割に依存することに同意しますが、いくつかのシナリオでは、少し異なることがわかります
ケース1私は単純なmappタスクを作成しましたが、以下で指定した2つの重複出力ファイル(データと同じ)コマンドを作成します
bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -D mapred.reduce.tasks = 0 -input /home/sample.csv -output /home/sample_csv112.txt -mapper/home/amitav/workpython /readcsv.py
ケース-2したがって、mappタスクを1に再設定しました。出力には1つの出力ファイルが正しく含まれていましたが、1つのリデューサーもUI画面に表示されましたが、リデューサージョブは制限されていました。コマンドを以下に示します。
bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -D mapred.map.tasks = 1 mapred.reduce.tasks = 0 -input /home/sample.csv -output /home/sample_csv115.txt-マッパー/home/amitav/workpython/readcsv.py
マッパーの数を増やす1つの方法は、入力を分割ファイルの形式で提供することです(linux splitコマンドを使用できます)。 Hadoopストリーミングは通常、入力ファイル(多数のファイルがある場合)と同じ数のマッパーを割り当てます。割り当てられていない場合、入力を同じサイズのパーツに分割しようとします。
-D property = valueではなく-D property = valueを使用します(余分な空白を削除します)。したがって、-D mapred.reduce.tasks = valueは正常に機能します。
マップタスクの数を設定すると、使用する分割サイズとInputFormatに依存するため、設定した値が常に反映されるとは限りません。
Reduceの数を設定すると、クラスター/クライアント側の構成で設定されたreduceの数が確実にオーバーライドされます。