2012-02-17 4 views
6

私はhadoopで遊び始めています(ただし、クラスタにアクセスすることはできませんが、スタンドアロンで遊んでいるだけです)。私の質問は、クラスターの設定では、タスクがどのように分散され、コードベースが新しいノードに移されるかということです。Hadoopはタスクとコードベースを配布できますか?

理想的には、私は大規模なバッチジョブを実行したいと思います。容量を増やす必要がある場合は、新しいノードをクラスタに追加しますが、ローカルで実行しているコードと同じコードをコピーするか、バッチジョブが実行されている間に容量を追加できます。私は自分のコードベースをHDFS上に保存し、必要なときに実行するためにローカルに引き出すことができると考えましたが、それでもサーバ上で何らかの初期スクリプトが必要であり、手動で最初にそれを実行する必要があることを意味します。

これが可能かどうかについてのご意見やアドバイスは素晴らしいと思います!

ありがとうございます。

答えて

7

hadoop jarコマンドを使用してmapreduceジョブをスケジュールすると、jobtrackerはジョブを実行するために必要なマッパーの数を判断します。これは、通常、入力ファイルのブロック数によって決まります。この数は、所有しているワーカーノードの数に関係なく固定されています。その後、あなたの仕事を実行するための1つまたは複数のタスクトラッカーが参加します。

アプリケーションのjarファイル(および-libjars引数を使用して指定された他のjarファイル)は、jarsの実行に使用されるタスクトラッカーを実行しているすべてのマシンに自動的にコピーされます。これらのすべては、Hadoopインフラストラクチャによって処理されます。

タスクトラッカーを追加すると、予定外のマップタスクがあると仮定して、ジョブの並列性が向上しますマップの容量を超えてパラレル化するために入力を自動的に再パーティション化することはできません。したがって、24のマップ容量(4つのデータノードのそれぞれに6つのマッパーを仮定)があり、最初の24回の実行で100のマップタスクがあり、別のデータノードを追加すると、さらに速度が向上します。マップタスクが12個しかない場合は、マシンを追加しても役立つことはありません。

最後に、データ参照の地域性に注意する必要があります。理想的には、最初にデータを格納しているのと同じマシンでデータを処理する必要があるため、新しいタスクトラッカーを追加しても、データは当初はそのノード上にローカルではなく、ネットワークを介してコピーする必要があるため、

+0

ありがとう、素晴らしい答え。それはjavaで理にかなっていますが、これはPythonのストリーミングを使用することでも同じですか? – Lostsoul

+2

http://hadoop.apache.org/common/docs/r0.15.2/streaming.html#Package+Files+With+Job+Submissionsから: "実行可能ファイルをマッパーおよび/またはリデューサとして指定できます。実行可能ファイルはクラスタ内のマシン上にあらかじめ存在する必要はありませんが、そうでない場合は、実行可能ファイルをジョブ提出の一部としてパックするように、 "-file"オプションを使用する必要があります。タスクトラッカーの追加に関する上記のすべては、ストリーミングにも当てはまります。 –

0

Hadoopクラスタを構築する前に、Amazon's Elastic MapReduceを使用してHadoopで遊ぶことをおすすめします。

解決しようとしている問題に関して、私はHadoopが適切であるとは確信していません。 Hadoopは、非常に並列化可能なバッチジョブ、すなわち、千世代(またはそれ以上)のドキュメントの解析、ソート、データの再バケット化などに便利です。 Hadoop Streamingでは、任意の言語を使用してマッパーやレデューサーを作成できますが、入力と出力は固定された形式でなければなりません。多くの用途がありますが、私の意見では、プロセス制御は設計目標の1つではありませんでした。

[編集]おそらくZooKeeperは、あなたが探しているものに近いです。

+0

私は予定しています。私はちょうどアマゾンを支払う前にプロセスを理解したい。 – Lostsoul

+0

Amazonの価格はちょっと混乱するかもしれません。私は小さい地図をいくつかのノードと小さなデータセットを減らす仕事を実行して、それぞれの実行は$ 0.25ドルかそこらだった。 – Frank

0

必要に応じてバッチジョブに容量を追加できますが、コードベースで可能性として提示する必要があります。たとえば、マッパーに複数のノードを割り当てて入力を要求している場合、そのノードにはプレッシャーをかけることができます。これはすべて、デフォルトのHadoopインストールでは実行できません。

私は現在、Hadoopコードベースを拡張し、マッパーまたはレデューサーが取得する入力に基づいてより多くのノードを生成することができるネストされたMap-Reduceフレームワークに取り組んでいます。あなたが興味を持っているなら私にラインをドロップし、もっと説明します。

また、-libjarsオプションについては、作成したジョブの指示に従ってjobtrackerによって割り当てられたノードに対してのみ有効です。したがって、10のマッパーを指定すると、-libjarはそこにコードをコピーします。あなたが10で始めるが、あなたの方法を働かせたいなら、あなたが追加するノードはコードを持たないでしょう。

これを回避する最も簡単な方法は、hadoop-env.shスクリプトのクラスパスにjarファイルを追加することです。これは、クラスタが知っているすべてのノードにjarファイルをコピーするジョブコピーを開始するときに常に行われます。

1

私はダニエルの返信にあまり同意しません。 「ジョブの開始時に、クラスタが知っているすべてのノードにjarコードがコピーされます」がtrueの場合、100のマッパーを使用していても1000のノードがあっても、常にすべてのジョブのコードがすべてのノード。意味を成さない。

代わりに、JobTracker上のJobSchedulerが実行するジョブを選択し、特定のデータノードによって実行されるタスクを識別すると、何とかコードベースをコピーする場所からタスクトラッカーに何らかの形で通知されます。

最初(mapreduceジョブの開始前)、コードベースはmapred.submit.replicationパラメータで定義されている複数の場所にコピーされました。したがって、tasktrackerは、いくつかの場所からコードベースをコピーすることができ、そのリストはjobtrackerによってリストに送られます。

関連する問題