2016-03-25 8 views
5

enter image description hereスパーク糸建築

は、私は、次のされたチュートリアルでは、このイメージに関する質問を持っていました。したがって、糸ベースのアーキテクチャのこのイメージに基づいて、スパークアプリケーションの実行は次のようになります。

まず、クライアントノードまたは一部のデータノードで実行されているドライバがあります。このドライバ(javaのドライバに似ています)では、Spark Contextに提出するコード(java、python、scalaなどで書かれたもの)で構成されています。そのスパークコンテキストはHDFSへの接続を表し、Hadoopエコシステムのリソースマネージャーにリクエストを送信します。次に、リソース・マネージャーはNameノードと通信して、クラスター内のどのデータ・ノードがクライアント・ノードが要求した情報を含んでいるかを調べます。スパークコンテキストは、タスクを実行するワーカーノードにエグゼキュータを配置します。ノードマネージャはExecutorを起動し、Spark Contextによって与えられたタスクを実行し、クライアントから要求されたデータをHDFSからドライバに返す。

上記の解釈は正しいですか?

ドライバは、HDFSのデータがさまざまなデータノードで3回複製されるため、各データノードに3つのエグゼキュータを送信してHDFSからデータを取得しますか?

答えて

3

あなたの解釈は現実に近いですが、いくつかの点で少し混乱しているようです。

これをより明確にすることができるかどうかを見てみましょう。

Scalaにcountという例があるとしましょう。あなたがappnameのマスターのようないくつかの設定を提供SparkContextオブジェクトを作成して初期化ステップを持っているすべてのスパークの仕事で

object WordCount { 
    def main(args: Array[String]) { 
     val inputFile = args(0) 
     val outputFile = args(1) 
     val conf = new SparkConf().setAppName("wordCount") 

     val sc = new SparkContext(conf) 

     val input = sc.textFile(inputFile) 

     val words = input.flatMap(line => line.split(" ")) 

     val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y} 

     counts.saveAsTextFile(outputFile) 
    } 
} 

、その後、あなたはで、inputFileを読んで、あなたはそれを処理して、あなたは上の処理結果を保存しますディスク。このコードはすべて、ドライバで実行されています。実際の処理(関数は.flatMap、.map、およびreduceByKeyに渡されます)およびI/O関数textFileとsaveAsTextFileは、クラスタ上でリモートで実行されます。

ここで、DRIVERは、コードをspark-submit(あなたの写真ではクライアントノードと呼ばれます)と提出した同じノードでローカルに実行されているプログラムの部分に付けられた名前です。スパーク・サブミットとYARNクラスタへのネットワーク・アクセスを持っている限り、任意のマシン(ClientNode、WorderNode、またはMasterNode)からコードを送信できます。簡単にするために、Clientノードはラップトップであり、Yarnクラスターはリモート・マシンで構成されていると仮定します。

簡単にするために、私はこの図を外します。これはHDFSに高可用性を提供するために使用され、スパークアプリケーションの実行には関係しないためです。 Yarn Resource ManagerとHDFS Namenodeは、糸とHDFSの役割であり(実際にはJVM内で実行されるプロセスです)、同じマスターノード上または別のマシン上に存在することができます。 Even Yarnノードマネージャとデータノードはロールだけですが、通常は同じマシン上に存在し、データの局所性(データが格納されている場所の近くで処理)を提供します。

アプリケーションを送信するときは、まずResource ManagerにNameNodeと連絡を取り、火花タスクを実行する場所にあるWorkerノードを見つけようとします。データローカリティの原則を利用するために、Resource Managerは、処理する必要があるファイルに対して、同じマシンにHDFSブロック(各ブロックの3つのレプリカのいずれか)を格納するワーカーノードを優先します。これらのブロックを持つワーカーノードが利用できない場合は、他のワーカーノードを使用します。この場合、データはローカルでは使用できないため、HDFSブロックは、データノードのいずれかからスパークタスクを実行しているノードマネージャにネットワーク経由で移動する必要があります。このプロセスは、ファイルを作成したブロックごとに行われるため、一部のブロックはローカルで検出され、一部は移動する必要があります。

ResourceManagerがワーカーノードを使用可能にすると、そのノード上のNodeManagerに連絡して、スパークエグゼキュータを実行する場所であるYarn Container(JVM)を作成するように要求します。他のクラスタモード(MesosまたはStandalone)では、Yarnコンテナはありませんが、spark executorのコンセプトは同じです。スパークエグゼキュータはJVMとして実行され、複数のタスクを実行できます。

クライアントノードで実行されているドライバとspark executorで実行中のタスクは、ジョブを実行するために通信し続けます。ドライバがラップトップで実行中でラップトップがクラッシュすると、タスクへの接続が失われ、ジョブが失敗します。そのため、スパークが糸クラスタで実行されているときに、ラップトップで「--deploy-mode = client」を実行するか、別の糸コンテナとして糸クラスターで実行するかを指定できます」--deploy-mode = cluster "詳しくはspark-submit

+0

この詳しい説明はありがとうございます!!リソースマネージャとネームノードがどのように連携してワーカーノードを見つけるかについて。したがって、基本的に、ファイルの3つのレプリカはHDFSの3つの異なるデータノードに格納されます。リソースマネージャは、データローカリティに基づいて最初のHDFSブロックを持つワーカーノードを選択し、そのワーカーノード上のNodeManagerに連絡して、スパークエグゼキュータを実行する場所にYarn Container(JVM)を作成します。他のブロックがこの「範囲」内で利用可能でない場合は、他のワーカー・ノードに移動し、他のブロックを – LP496

+0

上に、リソース・マネージャが元々見つけた(そのスパーク・エグゼキュータを実行している)最も近いデータ・ノードに転送する? – LP496

+1

はい、正確です。あなたは正しいです – PinoSan

関連する問題