前回も触れましたが、Spark のクラスタマネージャには、Standalone とMesos とYARN が存在します。ここではYARN 上でのSpark アプリケーションがどのように実行されるかを、HDInsight Spark の物理環境(リンクはこちら)に合わせて説明してみたいと思います。その前にまずYARN について軽く触れたいと思います。
##YARNとは
MapReduce v1 時代は、専用のJobTracker やTaskTracker と言われるプロセスでMRのジョブ制御やスケジューリングやモニタリングを行っていました。ただスケーリングに問題があり、MapReduce v2からそれを解決する目的で、YARNというMapReduce 以外でも汎用的に使えるプラットフォームが開発されました。YARNは汎用的に使用できるため、MapReduce以外にもSpark やStorm といったアプリケーションでも同じように利用することが可能です。Hadoop の分散環境上で動くOS みたいなものと思っていただければと思います。またYARNの主な構成としては以下のものが挙げられます。
###Resource Manager
クラスタ上で1つだけ存在します。名前の通り、Spark アプリケーションに対して、CPUコアやメモリなどのリソースの割り当て・管理を行うものです。HDInsight Spark の場合、ヘッドノードで動作しています。
###Node Manager
ワーカーノード内のコンテナを実行します。YARN の場合、Spark アプリケーションはコンテナ(下記)という形で抽象化されており、Node Manager により制御されています。
###ApplicationMaster
ApplicationMaster は、動かすアプリケーション毎(MapReduce やSpark など)につき、それぞれ専用のものが使用されることになっており、汎用的なYARN の処理の中では、アプリケーション固有の動作を提供しているサービスになります。
###Container
CPU、メモリ、Diskなどのリソースをバンドルしたロジカルな箱のようなものになります。Spark の場合、ワーカーノードの中でExecutor として動作します。
##Spark のデプロイのモードは2種類
クラスタマネージャの種類に関係なく、Spark アプリケーションの実行には、Clientモードと Cluster モードの2つがあります。
###Client モード
Driver Program がクラスタの外部で生成されるモードです。下記の例ではDriver Program がヘッドノードで動作している場合の図となります。例えばspark-submit で起動する時は、spark-submit と同じプロセス内にDriver Program が存在することになります。Client モードの場合、Driver Program がSpark アプリケーションの結果を受け取ることができるため、spark-submit の結果をコンソールで確認することが可能となっています。spark-shell は都度結果を知る必要があるため、Client モードになります。
- クライアントプロセスがアプリケーションをResource Manager にsubmit する。
- Resource Manager がNode Manager に対してApplicationMaster 用のContainer の割り当てを依頼する。
- Node Manager がApplicationMaster のためのContainer を起動しApplicationMasterが生成される。
- ApplicationMaster がResouce Manager にアプリケーション起動のための、リソースの取得を要求する。
- リソースが取得できた場合、ApplicationMaster がNode Manager にコンテナの中のExecutor を起動するよう依頼します。
- Node Manager がExecutor を起動し、ワーカーノードにて実際の処理が開始されます。
注)点線は、Driver Program は直接Executor と話してステータス確認を行っています。
###Cluster モード
Driver Program はワーカーノードのApplicationMaster の中で起動されます。Client モードと異なりアプリケーションの出力が標準出力に出ないので、 Cluster Manager が提供しているWEB のUI などで確認することになります。またクライアントがワーカーノードから非常に離れている場合は、レイテンシを小さくするためにCluster モードが有効になることがあります。(ちなみに処理の流れは、ほぼClient モードと同じため割愛します)
このあたりの動作は、本家Spark のWEB サイトを見てもほとんどよく分からないのですが、図式化してみることで、クラスタマネージャの動作が非常に大きな役割を果たしていることが良く分かるかと思います。