このシリーズには次のものが含まれます。
- 【ビッグデータ】Flink詳しく解説(1):基礎編
- 【ビッグデータ】Flinkの詳細解説(2):コア編 前編
- 【ビッグデータ】Flink詳しく解説(3):コア編Ⅱ
- 【ビッグデータ】フリンク詳しく解説(4):コア編Ⅲ
- 【ビッグデータ】Flinkの詳しい解説(5):核心編IV
- 【ビッグデータ】Flinkの詳しい解説⑥:ソースコード編 前編
Flink詳細解説⑥:ソースコードⅠ
- 55. Flink ジョブの送信プロセスは何ですか?
- 56. Flink ジョブを送信する方法は何通りありますか?
- 57. Flink JobGraph はいつ生成されますか?
- 58. JobGraph はクラスターを送信する前にどのようなプロセスを経ましたか?
- 59. PipeExecutor について言及しましたが、それにはどのような実装クラスがありますか?
- 60. ローカル投稿モードの特徴とその実現方法を教えてください。
- 61. リモート送信モードとは何ですか?
- 62. スタンドアロン モードについて簡単に説明しますか?
- 63. 糸クラスターの投稿方法について教えてください。
- 64. 糸セッションモードの特徴は何ですか?
- 65. ジョブごとの糸モードの特徴は何ですか?
- 66. 糸かけモードの特徴は何ですか?
- 67. 糸セッションの提出プロセスについて詳しく教えてください。
- 68. ジョブごとの糸の送信プロセスについて詳しく教えてください。
55. Flink ジョブの送信プロセスは何ですか?
Flink の提出プロセス:
- で、 の関数を開始し、
Flink Client
リフレクションを通じてFlink StreamGraph と JobGraph を生成し、JobGraph を Flink クラスターに送信します。jar
main
- Flink クラスターは JobGraph を受信 (
JobManager
受信) した後、JobGraph を ExecutionGraph に変換し、スケジューリングを開始し、起動が成功した後にデータの消費を開始します。
要約すると、Flink コアの実行プロセス、ユーザー API の呼び出しはStreamGraph
→ JobGraph
→に変換できますExecutionGraph
。
56. Flink ジョブを送信する方法は何通りありますか?
Flink のジョブの送信は 2 つの方法に分かれています。
- ローカル モード: つまり、IDEA でコードを直接実行するローカル送信モードです。
- リモート投稿方法:
standalone
方法、yarn
方法、K8s
方法に分かれています。その中で、yarn
メソッドはyarn-per-job
モード、yarn-session
モード、yarn-application
モードの 3 つの提出モードに分かれています。
57. Flink JobGraph はいつ生成されますか?
StreamGraph と JobGraph はすべてFlink Client
クライアント側、つまりクラスターに送信する前に生成されます。概略図は次のとおりです。
58. JobGraph はクラスターを送信する前にどのようなプロセスを経ましたか?
- ユーザーは Flink クラスターを起動し、コマンド ラインを使用してジョブを送信し、実行します
flink run -c WordCount xxx.jar
。 run
コマンドラインを実行した後、スクリプトを通じてエントリが呼び出されCliFrontend
、CliFrontend
ユーザーによって送信されたjar
ファイル内のメソッドがトリガーされ、それがメソッドにmain
渡され、最後に送信モードに従って特定の実行がトリガーされます。PipelineExecuteor
execute
PipelineExecutor
- 具体的な
PipelineExecutor
実行に応じて、ユーザーのコードがコンパイルされて StreamGraph が生成され、最適化後に Jobgraph が生成されます。
具体的なフローチャートは以下の通りです。
59. PipeExecutor について言及しましたが、それにはどのような実装クラスがありますか?
PipeExecutor
Flink では、これはパイプライン エグゼキューターと呼ばれ、JobGraph の生成後にクラスターにジョブを送信するインターフェイスであり、Flink Client
重要な部分です。前述したように、クラスターにジョブを送信するにはいくつかの方法がありますが、最も一般的に使用される方法は次の方法yarn
です。yarn
3つの提出モード、主にsession
モード、per-job
モードを使用します。application
このモードでは、JobGraph がクラスター内に生成されます。
したがって、PipeExecutor
の実装クラスは次の図に示すとおりです: (コードを押すとCTRL+H
表示されます)
赤枠内の上記 2 つのモードに加えて、IDEA 環境で Flink MiniCluster をデバッグ用に実行するときに使用しますLocalExecutor
。
60. ローカル投稿モードの特徴とその実現方法を教えてください。
Local は、ローカル IDEA 環境で実行される送信方法です。クラスター上にはありません。主にデバッグに使用され、概略図は次のとおりです。
-
Flink プログラムは
JobClient
によって提出されます。 -
JobClient
に課題を提出しますJobManager
。 -
JobManager
リソースの割り当てとジョブの実行を調整する責任を負います。リソースの割り当てが完了すると、タスクは対応する に送信されますTaskManager
。 -
TaskManager
スレッドを開始して実行を開始し、開始、進行中、完了などのステータスの変化を に報告しますTaskManager
。JobManager
-
ジョブの実行が完了すると、結果がクライアントに返されます。
ソースコード分析: Flink 1.12.2 1.12.2経由1.12.2ソースコードが解析されます。
(1) 対応するStreamExecutionEnvironment
オブジェクトを作成して取得しますLocalStreamEnvironment
。
StreamExecutionEnvironment
オブジェクトのメソッドを呼び出しますexecute
。
(2) StreamGraphを取得します。
(3) 特定のPipeLineExecutor
Get localExecutorFactoryを実行します。
(4) JobGraph を取得します。
localExecutorFactoryの実装クラスLocalExecutorに従ってJobGraphを生成します。
上記の部分はすべてFlink Client
で生成されます。Localモードでサブミットするので、次にMiniClusterクラスタを作成し、miniCluster.submitJob
サブミットするjobGraphを で指定します。
(5) MiniCluster クラスターをインスタンス化します。
(6)JobClient
クライアントに戻ります。
上記を実行してminiCluster.submitJob
JobGraph をローカル クラスターに送信すると、JobClient
クライアントが返されます。これJobClient
には、JobID、アプリケーションのステータスなど、アプリケーションの詳細情報が含まれます。最後に、コード実行の前の層に戻ります。対応するクラスは ですStreamExecutionEnvironment
。
以上がローカルモードのソースコード実行処理です。
61. リモート送信モードとは何ですか?
リモート提出方式:スタンドアロン方式、Yarn方式、K8s方式に分かれます。
- スタンドアロン:
session
スキーマが含まれます。 - Yarn メソッドは
yarn-per-job
、モード、yarn-Session
モード、の 3 つの送信モードに分かれていますyarn-application
。 - K8s の方法:
session
モードが含まれます。
62. スタンドアロン モードについて簡単に説明しますか?
スタンドアロン モードは、 Flink クラスターのスタンドアロン版のサブミット方法であり、サブミットには 1 つのノードのみが使用され、セッション モードが一般的に使用されます。
次のようにコマンドを送信します。
bin/flink run org.apache.flink.WordCount xxx.jar
Client
クライアントはタスクを に送信しますJobManager
。JobManager
タスクの運用に必要なリソースの申請と、タスクとリソースの管理を担当します。JobManager
実行するタスクを分散しますTaskManager
。TaskManager
ステータスを定期的JobManager
に に報告します。
63. 糸クラスターの投稿方法について教えてください。
糸クラスターでの投稿は3・3に分かれています3つの提出方法:
session
モデルper-job
モデルapplication
モデル
64. 糸セッションモードの特徴は何ですか?
次のようにコマンドを送信します。
./bin/flink run -t yarn-session \
-Dyarn.application.id=application_XXXX_YY xxx.jar
糸セッション モード: すべてのジョブはクラスター リソースを共有し、分離が不十分で、JM 負荷のボトルネックがあり、main
メソッドはクライアント上で実行されます。実行時間が短く、頻繁に実行される短いタスクに適しており、クラスタ内にジョブは 1 つだけあり、JobManager
ジョブはランダムに割り当てられますTaskManager
。
特徴:session-cluster
このモードでは、最初にクラスターを開始し、次にジョブを送信し、次に Yarn からスペースを申請する必要があります。リソースは永久に変更されません。リソースがいっぱいの場合、次のジョブは送信できません。次のジョブは、Yarn 内のジョブの 1 つが完了してリソースが解放された後にのみ通常どおり送信できます。すべてのジョブがリソースを共有しDispatcher
てResourceManager
共有するため、小規模で実行時間が短いジョブに適しています。
65. ジョブごとの糸モードの特徴は何ですか?
コミットコマンド:
./bin/flink run -t yarn-per-job --detached xxx.jar
ジョブごとの糸モード: 各ジョブは、適切な分離、JM ロード バランシングを使用して独立してクラスターを開始し、main
メソッドはクライアント上で実行されます。モードではper-job
、 Job ごとに 1 つが存在しJobManager
、TaskManager
それぞれに 1 つの Job のみが存在します。
特徴: タスクはジョブに対応します。送信された各ジョブは、ジョブが完了するまで、それぞれの状況に応じて Yarn からリソースを個別に申請します。ジョブが失敗しても、次のジョブの通常の送信や操作には影響しません。排他的Dispatcher
およびResourceManager
リソース アプリケーションはオンデマンドで受け付けられます。大規模で長時間実行されるジョブに適しています。
66. 糸かけモードの特徴は何ですか?
次のようにコマンドを送信します。
./bin/flink run-application -t yarn-application xxx.jar
糸アプリケーション モード: 各ジョブは、適切な分離、JM ロード バランシングを使用して独立してクラスターを開始し、main
メソッドはJobManager
で実行されます。
yarn-per-job
と の両方のモードでyarn-session
、クライアントは次の 3 つの手順を実行する必要があります。
- ジョブに必要な依存関係を取得します。
- 環境分析を実行し、論理的な計画を取得することにより、つまり
StreamGraph
→JobGraph
; - 依存関係と JobGraph をクラスターにアップロードします。
これらが完了した後でのみ、env.execute()
Flink ランタイムがトリガーされ、メソッドを通じて実際にジョブの実行が開始されます。すべてのユーザーが同じクライアント上でジョブを送信する場合、より大きな依存関係により多くの帯域幅が消費され、より複雑なジョブ ロジックを JobGraph に変換する際にもより多くの CPU とメモリが消費され、代わりにクライアントのリソースがボトルネックになります。
それを解決するために、コミュニティは従来の展開モードに基づいてアプリケーション モードを実装しました。元々クライアントが実行する必要があった 3 つのことは、 に転送されましたJobManager
。つまり、main()
メソッドはクラスター (エントリ ポイントが配置されている場所ApplicationClusterEntryPoint
) で実行され、クライアントはデプロイメント リクエストを開始することだけを担当する必要があります。
要約すると、Flink コミュニティでは、yarn-per-job
またはyarn-application
モードを使用してアプリケーションを送信することを推奨しています。
67. 糸セッションの提出プロセスについて詳しく教えてください。
提出の流れは以下の通りです。
1. クラスターを起動します
Flink Client
Yarn ResourceManager
タスク情報 を に送信します。Flink Client
アプリケーション構成 (Flink-conf.yaml
、logback.xml
、log4j.properties
) および関連ファイル (Flink Jar、構成クラス ファイル、ユーザー Jar ファイル、JobGraph オブジェクトなど) を分散ストレージ HDFS にアップロードします。Flink Client
Yarn ResourceManager
タスク情報を に送信します。
- Yarn が Flink クラスターを開始します。2 2を実行します。2 つのステップ:
Yarn Client
Flink のアプリケーションを送信してクラスターYarn ResourceManager
を作成し、Yarn ResourceManager
コンテナー リソースを割り当て、対応するNodeManager
ジョブを開始するように通知しますApplicationMaster
(Flink ジョブが送信されるたびに、ジョブが開始されますApplicationMaster
)。ApplicationMaster
これには現在開始されるジョブJobManager
と内部使用が含まれます。フリンク自体のResourceManager
。- クラスター起動のエントリ ポイントとして
JobManager
プロセス内で実行されます。Flink によって内部的に使用されるYarnSessionClusterEntryPoint
Initializationは、関連する RPC サービスを開始し、Rest インターフェイスを介して JobGraph が送信されるのを待ちます。Dispatcher
ResourceManager
Flink Client
2. ジョブの送信
-
Flink Client
Dispatcher
コンパイルされた JobGraphを Rest 経由で送信します。Dispatcher
これは Rest インターフェイスであり、実際のスケジュール設定や割り当て作業を担当しません。 -
Dispatcher
JobGraph を受け取った後、ジョブ用の JobGraph を作成しJobMaster
、ジョブを引き渡しJobMaster
、JobMaster
ジョブのスケジューリングを担当し、ジョブとタスクのライフサイクルを管理し、ExecutionGraph (JobGraph の並列バージョン、ジョブグラフのコア データ構造) を構築します。スケジューリング層)。
上記の 2 つのステップが実行された後、ジョブはスケジュール実行段階に入ります。
3. ジョブのスケジュール実行
-
JobMaster
ExecutionGraphからリソースを申請しResourceManager
、ExecutionGraph のスケジュールを開始します。 -
ResourceManager
リソースリクエストを待機キューに追加し、ハートビートを通じてYarnResourceManager
新しいコンテナを申請することでプロセスを開始しますTaskManager
。 -
YarnResourceManager
を開始し、Jar ファイルとその他の必要な関連リソースを HDFS からロードし、コンテナーで開始しTaskManager
、 をTaskManager
開始しますTaskExecutor
。 -
TaskManager
開始後、ResourceManager
に登録し、スロット リソースのステータスを に報告しますResourceManager
。 -
ResourceManager
待機キューから Slot リクエストを取り出し、TaskManager
にリソースの空き状況を確認し、TaskManager
どの Slot に割り当てられているかを伝えますJobMaster
。 -
TaskManager
JobMaster
自分のタスクに属する自分のスロットに返信すると、JobMaser
そのスロットは SlotPool にキャッシュされます。 -
JobMaster
TaskMnager
スロットで実行されるタスクをスケジュールします。
68. ジョブごとの糸の送信プロセスについて詳しく教えてください。
次のようにコマンドを送信します。
./bin/flink run -t yarn-per-job --detached xxx.jar
提出の流れは以下の通りです。
1. クラスターを起動します
Flink Client
Yarn ResourceManager
タスク情報 を に送信します。Flink Client
アプリケーション構成 (Flink-conf.yaml
、logback.xml
、log4j.properties
) および関連ファイル (Flink Jar、構成クラス ファイル、ユーザー Jar ファイル、JobGraph オブジェクトなど) を分散ストレージ HDFS にアップロードします。Flink Client
Yarn ResourceManager
タスク情報を に送信します。
- Yarn が Flink クラスターを開始します。2 2を実行します。2ステップ操作。
Yarn Client
Flink のアプリケーションを送信してクラスターYarn ResourceManager
を作成し、Yarn ResourceManager
コンテナー リソースを割り当て、対応するNodeManager
ジョブを開始するように通知しますApplicationMaster
(Flink ジョブが送信されるたびに、ジョブが開始されますApplicationMaster
)。ApplicationMaster
これには現在開始されるジョブJobManager
と内部使用が含まれます。フリンク自体のResourceManager
。- クラスター起動のエントリ ポイントとして
JobManager
プロセス内で実行されます。Flink によって内部的に使用されるYarnJobClusterEntryPoint
Initializationは、関連する RPC サービスを開始し、Rest インターフェイスを介して JobGraph が送信されるのを待ちます。Dispatcher
ResourceManager
Flink Client
2. ジョブの送信
ApplicationMaster
StartDispatcher
、Dispatcher
start 、ResourceManager
およびJobMaster
(このステップはセッションとはJobMaster
異なり、Dispatcher
クライアントによって渡されるのではなくプルされます)。JobMaster
ジョブのスケジューリング、ジョブとタスクのライフ サイクルの管理、ExecutionGraph (スケジューリング レイヤーのコア データ構造である JobGraph の並列バージョン) の構築を担当します。
上記の 2 つのステップが実行された後、ジョブはスケジュール実行段階に入ります。
3. ジョブのスケジュール実行
-
JobMaster
ExecutionGraphからスロット リソースを申請しResourceManager
、スケジュールを開始します。 -
ResourceManager
リソースリクエストを待機キューに追加し、ハートビートを通じてYarnResourceManager
新しいコンテナを申請することでプロセスを開始しますTaskManager
。 -
YarnResourceManager
開始し、Jar ファイルとその他の必要な関連リソースを HDFS からロードし、コンテナーで開始しますTaskManager
。 -
TaskManager
内部的に開始しますTaskExecutor
。 -
TaskManager
開始後、ResourceManager
に登録し、スロット リソースのステータスを に報告しますResourceManager
。 -
ResourceManager
待機キューから Slot リクエストを取り出し、TaskManager
にリソースの空き状況を確認し、TaskManager
どの Slot に割り当てられているかを伝えますJobMaster
。 -
TaskManager
JobMaster
自分のタスクに属する自分のスロットに返信すると、JobMaser
そのスロットは SlotPool にキャッシュされます。 -
JobMaster
TaskMnager
スロットで実行されるタスクをスケジュールします。