spark docs には、ヤーンクライアントとヤーンクラスタの違いを説明する次の段落があります。
Sparkアプリケーションの起動に使用できる2つのデプロイモードがあります。クラスターモードでは、Sparkドライバーは、管理されているアプリケーションマスタープロセス内で実行されます。クラスター上のYARNによって、クライアントはアプリケーションの開始後に離れることができます。クライアントモードでは、ドライバーはクライアントプロセスで実行され、アプリケーションマスターはYARNからのリソースを要求するためにのみ使用されます。
理由は2つあると思います。その場合、どの方法を使用するかをどのように選択しますか?
ファクトを使用して応答を正当化し、この質問と回答がStackoverflowの要件を満たすようにしてください。
Stackoverflowにはいくつかの同様の質問がありますが、これらの質問は2つのアプローチの違いに焦点を当てていますが、一方のアプローチが他方よりも適している場合には焦点を当てていません。
一般的な導入戦略は、ワーカーマシンと物理的に同じ場所にあるゲートウェイマシン(スタンドアロンEC2クラスターのマスターノードなど)からアプリケーションを送信することです。この設定では、クライアントモードが適切です。クライアントモードでは、ドライバーは、クラスターのクライアントとして機能するspark-submitプロセス内で直接起動されます。アプリケーションの入力と出力はコンソールに接続されています。したがって、このモードは、REPLを含むアプリケーション(たとえば、Sparkシェル)に特に適しています。
または、アプリケーションがワーカーマシンから遠く離れたマシン(ラップトップのローカルなど)から送信された場合、クラスターモードを使用してドライバーとエグゼキューター間のネットワーク遅延を最小限に抑えるのが一般的です。現在、クラスターモードはMesosクラスターではサポートされていません。現在、YARNのみがPythonアプリケーションのクラスターモードをサポートしています。 "- Submitting Applications
これから私が理解しているのは、どちらの戦略もタスクを分散するためにクラスターを使用するということです。違いは、「ドライバープログラム」が実行される場所です。spark-submitを使用してローカルで、またはクラスター内でも実行されます。
これらのいずれかを使用する必要がある場合は、上記の引用で詳しく説明していますが、別のことも行いました。大きなjarの場合、rsync
を使用して、それらをクラスター(またはマスターノード)に100回コピーしました。ネットワーク速度、そしてクラスターから送信されます。これは、大きなjarの「クラスターモード」よりも優れている場合があります。クライアントモードでは、jarがマスターに転送されない可能性があることに注意してください。その時点で、2つの間の差はごくわずかです。おそらくクライアントモードは、ドライバープログラムがほとんどの時間アイドル状態のときに、ローカルマシンのコアを最大限に活用し、jarをマスターに転送しないようにする方がよいでしょう(ループバックインターフェース上でも、大きなjarにはかなりの時間がかかります)。 。また、クライアントモードでは、jarを任意のクラスターノードに転送(rsync)できます。
一方、ドライバーがCPUまたはI/Oで非常に集中している場合は、クラスターモードの方が適切であり、クラスターのバランスをよりよくすることができます(クライアントモードでは、ローカルマシンはドライバーとできるだけ多くのワーカーの両方を実行します、それをオーバーロードしてローカルタスクが遅くなるようにし、ジョブ全体がローカルマシンからのいくつかのタスクを待つようになる).
- 要約すると、クラスターと同じローカルネットワークにいる場合、クライアントモードを使用してラップトップから送信します。クラスターが遠くにある場合は、ローカルでクラスターモードで送信するか、jarをリモートクラスターに
rsync
してクライアントまたはクラスターモードでサブミットして、ドライバープログラムのリソースへの負荷に応じて。*AFAIKドライバープログラムがクラスターで実行されている場合、リモート切断によるドライバーのクラッシュやsparkジョブ全体の脆弱性は低くなります。ストリーム処理タイプのワークロードとして
YARNで実行されるSparkジョブ
YARNでSpark=を実行する場合、各Spark executorはYARNコンテナーとして実行されます。MapReduceがコンテナーをスケジュールし、タスクごとにJVMを起動する場合、Sparkは、同じコンテナ内で複数のタスクをホストします。このアプローチにより、タスクの起動時間が数桁速くなります。
Sparkは、YARNで実行するための2つのモード、「yarn-cluster」モードと「yarn-client」モード。大まかに言って、yarn-clusterモードは本番環境のジョブに適していますが、yarn-clientモードは、アプリケーションの出力をすぐに確認したいインタラクティブなデバッグ用途に適しています。
違いを理解するには、YARNのアプリケーションマスターの概念を理解する必要があります。 YARNでは、各アプリケーションインスタンスにアプリケーションマスタープロセスがあります。これは、そのアプリケーション用に開始される最初のコンテナーです。アプリケーションは、ResourceManagerにリソースを要求し、リソースが割り当てられると、NodeManagerに代わりにコンテナを起動するように指示します。アプリケーションマスターにより、アクティブなクライアントが不要になります。アプリケーションを開始するプロセスはなくなり、クラスターで実行されているYARNによって管理されるプロセスから調整が続行されます。
ヤーンクラスターモードでは、ドライバーはアプリケーションマスターで実行されます。つまり、同じプロセスがアプリケーションの駆動とYARNからのリソースの要求の両方を担当し、このプロセスはYARNコンテナー内で実行されます。アプリを起動するクライアントは、その存続期間全体に留まる必要はありません。
糸クラスターモード
ヤーンクラスタモードはnot Sparkインタラクティブに使用するのに適していますが、ヤーンクライアントモードis。Spark spark-ShellやPySparkなどのユーザー入力を必要とするアプリケーションでは、開始するクライアントプロセス内でSparkドライバーを実行する必要がありますSparkアプリケーション。yarn-clientモードでは、アプリケーションマスターはYARNからのエグゼキューターコンテナーを要求するためだけに存在します。クライアントはこれらのコンテナーと通信して、開始後に作業をスケジュールします。
ヤーンクライアントモード
次の表は、これらのモードの違いを簡潔に示しています。
リファレンス: https://blog.cloudera.com/blog/2014/05/Apache-spark-resource-management-and-yarn-app-models/