2013-07-03 21 views
11

Hadoopは、プログラムに設定されているマッパーの数に基づいてデータを分割しますか?つまり、サイズが500MBのデータセットを持つ場合、マッパーの数が200の場合(Hadoopクラスターで同時に200のマッパーを使用できると仮定して)、各マッパーは2.5MBのデータを与えられますか?Hadoopでデータを分割する方法

さらに、すべてのマッパーを同時に実行するのか、それとも一部のマッパーを連続して実行するのか?

答えて

0

私はちょうどあなたの質問に基づいて、試料MRプログラムを実行し、ここに私は

入力発見された:小さなファイルそのブロックサイズを。

ケース1:マッパー数= 1結果:1マップタスクが開始されました。各マッパー(この場合は1つ)の入力部 のサイズは、入力ファイル のサイズと同じです。

ケース2:マッパーの数= 5結果:5つのマップタスクが開始されました。 各マッパーの入力分割サイズは、入力ファイルサイズの1/5です。

ケース3:マッパーの数= 10結果:10のマップタスクが開始されました。 各マッパーの入力分割サイズは、入力ファイルサイズの1/10です。

したがって上記に基づいて、ファイルの少ないブロックサイズ次いで、

分割サイズ=起動マップタスクの総入力ファイルサイズ/数。

注:ただし、入力された分割に基づいて決定される。

+0

さらに、すべてのマッパーを同時に実行するのか、それとも一部のマッパーを連続して実行するのか? - 十分な地図スロットがある場合は、すべてのマップタスクが一緒に開始されます。使用可能なスロットよりも多くのマップタスクがある場合、追加のマップタスクは、実行中のマッパーが完了するまで待機します。 –

+0

また、私のコードはそれに基づいているので、古いマップドAPIを使用していると考えました。ここにFileInputFormatのgetSplitsのシグネチャがあり、パラメータとしてnumSplitsがあります。 public InputSplit [] getSplits(JobConfジョブ、int numSplits) –

+0

これは別の方法です – Tagar

6

Hadoop分散ファイルシステム(HDFS)にデータを入力すると、Hadoopはブロックサイズ(デフォルトは64 MB)に応じてデータを分割し、ブロックをクラスタ全体に分散します。 500 MBは8ブロックに分割されます。それはマッパーの数に依存しません、それはHDFSのプロパティです。

MapReduceジョブを実行すると、Hadoopはデフォルトでブロックごとに1マッパーを割り当てます。したがって、8ブロックがある場合、hadoopは8つのマップタスクを実行します。

ただし、明示的にマッパーの数(つまり200)を指定すると、各マップで処理されるデータのサイズは、ブロックの分布とマッパーの実行ノードによって異なります。実際にデータを処理するマッパーの数は、入力分割によって異なります。

500 MBが8ブロックに分割されていると仮定すると、200マッパーを指定しても、すべてが初期化されてもデータを処理するわけではありません。

+0

ありがとうございました。しかし、ジョブカウンタは、200のマッパーが立ち上げられていることを示しています!それは本当ではないという意味ですか? –

+1

その場合、ほとんどのマッパーは実行されますが、データは処理されません。私はあなたがマッパーログをチェックアウトするときにそれを見つけるだろうと思う、彼らのほとんどは入出力データを持っていないでしょう。私はそれを反映するために私の答えを編集します。 – Chaos

23

これは逆です。マッパの数は、分割数に基づいて決定されます。実際には、使用している分割の作成にはInputFormatの仕事があります。分割の数が決まるまで、マッパーの数は分かりません。 HDFSのブロックサイズに基づいて分割が作成されるとは限りません。これは、InputFormatのメソッドgetSplits()内のロジックに完全に依存します。

これをよりよく理解するために、MRを使用してMySQLに格納されたデータを処理しているとします。この場合、ブロックの概念はないので、分割が常にHDFSブロックに基づいて作成されるという理論は失敗します。右?それでスプリットの作成はどうですか?1つの可能性は、MySQLテーブル内の行の範囲に基づいて分割を作成することです(これはリレーショナルデータベースからデータを読み込むための入力形式であるDBInputFormatです)。 100行があるとします。次に、それぞれ20行の5つの分割を持つことができます。

FileInputFormat(ファイルに格納されたデータを処理するためのInputFormat)に基づくInputFormatsについてのみ、分割は入力ファイルの合計サイズ(バイト単位)に基づいて作成されます。ただし、入力ファイルのFileSystemブロックサイズは、入力分割の上限として扱われます。 HDFSブロックサイズよりも小さいファイルがある場合、そのファイルに対しては1マッパーしか得られません。いくつかの異なる動作をしたい場合は、mapred.min.split.sizeを使用できます。しかし、それは再びあなたのInputFormatのgetSplits()にのみ依存します。

MR splitとHDFS blockの間には根本的な違いがあり、これによって混乱することがよくあります。ブロックはデータの物理的な部分ですが、分割はマッパーに供給される論理的な部分です。分割に入力データが含まれていない場合、データへの参照に過ぎません。では、分割は何ですか?分割には基本的に2つのものがあります:length in bytesstorage locationsのセットです。これらは単にホスト名文字列です。

ご質問に戻る。 Hadoopでは、200以上のマッパーを使用できます。 500MBのデータだけで200のマッパーを持つのは意味がありません。 Hadoopについて語るときは、非常に巨大なデータを扱っていることを常に覚えておいてください。各マッパーにわずか2.5 MBのデータを送信することは過度のことです。また、空いているCPUスロットがない場合、現在のマッパーの完了後にいくつかのマッパーが実行される可能性があります。しかし、MRフレームワークは非常に知的であり、このような状況を避けるために最善を尽くしています。処理対象のデータが存在するマシンに空きCPUスロットがない場合、空きスロットが利用可能な近くのノードにデータが移動され、処理されます。

HTH

0

200マッパーはデータの500メガバイトのために実行されている場合は、個々のファイルのサイズをチェックする必要があります。そのファイルサイズがブロックサイズ(64 MB)より小さい場合は、ファイルごとにマップタスクが実行されます。

通常、我々はそれがありません

0

号(ブロックサイズよりも大きいサイジング)大きなファイルに小さなファイルをマージします。

ジョブのマッパーの数は、フレームワークによって定義されます。

Apache MapReduceチュートリアルのリンクをご覧ください。

どのくらいのマップですか?

マップの数は、通常は、入力ファイルのブロックの総数である入力の合計サイズ、によって駆動されます。

マップの適切なレベルの並列性は、非常にCPUの軽いマップタスク用に300マップに設定されていますが、ノードあたり約10-100マップと思われます。タスクの設定にはしばらく時間がかかるため、マップの実行に最低1分かかる場合が最適です。

このように、Configuration.set(MRJobConfig.NUM_MAPS、int)(フレームワークのヒントのみを提供しない限り、入力データが10TBでブロックサイズが128MBの場合、マップは82,000になります。 )はさらに高く設定するために使用されます

クエリに戻って来る:マッパーの数は200(Hadoopクラスタ200のマッパ同時に可能にすると仮定)である場合、サイズ500メガバイトのデータセットを有する、ある

は、それぞれでありますmapperに2.5 MBのデータが与えられていますか?

DFSブロックおよび入力分割サイズが128メガバイトある場合、500メガバイトファイルは、データを処理する4マッパーを必要とします。フレームワークは上記の4つのMapperタスクを実行します。

すべてのマッパーが同時に実行されるのか、それとも一部が連続して実行されるのでしょうか?

すべてのマッパーは同時に実行されます。しかし、Reducerは、すべてのマッパーからの出力がコピーされて利用可能な場合にのみ実行されます。

関連する問題