Spark 基礎 - Spark 作業提出#
内容整理自:
Spark 作業提出フロー#
名詞概念#
-
Application
: ユーザーが作成した Spark アプリケーションで、Driver 機能のコードとクラスタ内の複数のノードで実行される Executor コードを含む -
Driver
: Driver は上記の Application の main () 関数を実行し、Spark アプリケーションの実行環境を準備する SparkContext を作成する。Spark では、SparkContext が ClusterManager と通信し、リソースの取得、タスクの割り当て、監視などを行う。Executor 部分の実行が完了すると、Driver は SparkContext を閉じる。通常、SparkContext が Driver を代表する -
Worker
:クラスタ内で Application コードを実行できる任意のノードで、YARN の NodeManager ノードに似ている。Standalone モードでは、Slave ファイルで設定された Worker ノードを指し、Spark on Yarn モードでは NodeManager ノードを指す -
Executor
: Application が Worker ノード上で実行されるプロセスで、このプロセスは Task を実行し、データをメモリまたはディスクに保存する。各 Application には独立した Executor のグループがある -
Cluster Manager
:クラスタ上でリソースを取得する外部サービスを指し、現在は以下がある:- Standalone:Spark のネイティブリソース管理で、Master がリソースの割り当てを担当する
- Hadoop Yarn:YARN の ResourceManager がリソースの割り当てを担当する
実行フロー#
二つのコア:DAGScheduler
とTaskScheduler
詳細は: Spark 進階 - Spark スケジューリングシステム
Spark の三つの作業提出モード#
local モード#
- local モードでは、いわゆる
master+worker
という概念はない - local モードは、ローカルプロセスを起動し、プロセス内で Spark クラスタの作業の実行をシミュレートすることに相当し、Spark 作業はプロセス内の一つまたは複数の executor スレッドに対応し、実行が開始され、作業のスケジューリングやタスクの割り当てが行われる
Standalone 提出モード#
standalone モードで提出するには、master を spark://master_ipに設定する必要がある。例えば、spark://192.168.75.101:7077
Standalone Client モード#
フローディスクリプション
-
クライアントが起動した後、ユーザープログラムを直接実行し、Driver 関連の作業:DAGScheduler や BlockManagerMaster などを起動する。
-
クライアントの Driver が Master に登録する。
-
Master は Worker に Executor を起動させる。Worker は ExecutorRunner スレッドを作成し、ExecutorRunner は ExecutorBackend プロセスを起動する。
-
ExecutorBackend が起動すると、Driver の SchedulerBackend に登録する。Driver の DAGScheduler は作業を解析し、対応する Stage を生成する。各 Stage に含まれる Task は TaskScheduler を通じて Executor に割り当てられる。
-
すべての stage が完了すると作業が終了する
Standalone Cluster モード#
-
クライアントが作業を master に提出する
-
Master は Worker ノードの一つを選択して Driver を起動する。つまり
SchedulerBackend
。Worker は DriverRunner スレッドを作成し、DriverRunner は SchedulerBackend プロセスを起動する -
Master は残りの Worker に Executor を起動させる。つまり
ExecutorBackend
。Worker は ExecutorRunner スレッドを作成し、ExecutorRunner は ExecutorBackend プロセスを起動する -
ExecutorBackend が起動すると、Driver の SchedulerBackend に登録する。SchedulerBackend プロセスには DAGScheduler が含まれ、ユーザープログラムに基づいて実行計画を生成し、実行をスケジュールする。各 stage の task は TaskScheduler に保存され、ExecutorBackend が SchedulerBackend に報告する際に TaskScheduler の task を ExecutorBackend に割り当てて実行する
Standalone Client と Standalone Cluster の違い#
- client モードでは、どのマシンで spark-submit スクリプトを使用して application を提出するかに応じて、driver はそのマシンで起動する
- cluster モードでは、driver は master プロセスを通じてランダムに特定の worker プロセスに割り当てられて起動する
Yarn 提出モード#
Yarn-Client モード#
-
Spark Yarn Client が YARN の
ResourceManager
にApplication Master
の起動を申請する -
ResourceManager はリクエストを受け取った後、クラスタ内で NodeManager を選択し、そのアプリケーションに最初の Container を割り当て、ApplicationMaster をその Container 内で起動するよう要求する。YARN-Cluster との違いは、この ApplicationMaster は SparkContext を実行せず、SparkContext と連絡を取り合いリソースを配分することだけである
-
Client 内の SparkContext が初期化されると、ApplicationMaster と通信を確立し、ResourceManager に登録し、タスク情報に基づいて ResourceManager にリソース(Container)を申請する
-
ApplicationMaster がリソース(すなわち Container)を取得すると、対応する NodeManager と通信し、取得した Container 内で CoarseGrainedExecutorBackend を起動するよう要求する。CoarseGrainedExecutorBackend が起動すると、Client 内の SparkContext に登録し、Task を申請する
-
Client 内の SparkContext が Task を CoarseGrainedExecutorBackend に割り当て、CoarseGrainedExecutorBackend が Task を実行し、Driver に実行の状態と進捗を報告する
-
アプリケーションの実行が完了すると、Client の SparkContext が ResourceManager に登録解除を申請し、自身を閉じる
YARN-Cluster モード#
YARN-Cluster モードでは、ユーザーが YARN にアプリケーションを提出すると、YARN は二つの段階でそのアプリケーションを実行する:
- 第一段階は、Spark の Driver を YARN クラスタ内で ApplicationMaster として起動すること;
- 第二段階は、ApplicationMaster がアプリケーションを作成し、ResourceManager にリソースを申請し、Executor を起動して Task を実行し、その実行プロセス全体を監視し、実行が完了するまで続ける
YARN-Client と YARN-Cluster の違い#
-
YARN-Cluster
モードでは、Driver は AM(Application Master)内で実行され、YARN にリソースを申請し、作業の実行状況を監視する。ユーザーが作業を提出した後、Client を閉じることができ、作業は YARN 上で実行され続けるため、YARN-Cluster モードはインタラクティブな作業の実行には適していない -
YARN-Client
モードでは、Application Master は YARN に Executor を要求するだけで、Client は要求された Container と通信してその作業をスケジュールする。つまり、Client は離れることができない。Driver は spark 作業を提出したクライアントマシン上で実行され、詳細なログ情報をリアルタイムで確認でき、エラーの追跡や排除が容易で、テストに使用される