【ビッグデータ】Flinkの詳しい解説⑥:ソースコード編 前編

このシリーズには次のものが含まれます。


55. Flink ジョブの送信プロセスは何ですか?

Flink の提出プロセス:

  • で、 の関数を開始し、Flink Clientリフレクションを通じてFlink StreamGraph と JobGraph を生成し、JobGraph を Flink クラスターに送信します。jarmain
  • Flink クラスターは JobGraph を受信 (JobManager受信) した後、JobGraph を ExecutionGraph に変換し、スケジューリングを開始し、起動が成功した後にデータの消費を開始します。

要約すると、Flink コアの実行プロセス、ユーザー API の呼び出しはStreamGraphJobGraph→に変換できます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コマンドラインを実行した後、スクリプトを通じてエントリが呼び出されCliFrontendCliFrontendユーザーによって送信されたjarファイル内のメソッドがトリガーされ、それがメソッドmain渡され、最後に送信モードに従って特定の実行がトリガーされます。PipelineExecuteorexecutePipelineExecutor
  • 具体的なPipelineExecutor実行に応じて、ユーザーのコードがコンパイルされて StreamGraph が生成され、最適化後に Jobgraph が生成されます。

具体的なフローチャートは以下の通りです。

ここに画像の説明を挿入

59. PipeExecutor について言及しましたが、それにはどのような実装クラスがありますか?

PipeExecutorFlink では、これはパイプライン エグゼキューターと呼ばれ、JobGraph の生成後にクラスターにジョブを送信するインターフェイスであり、Flink Client重要な部分です。前述したように、クラスターにジョブを送信するにはいくつかの方法がありますが、最も一般的に使用される方法は次の方法yarnです。yarn3つの提出モード、主にsessionモード、per-jobモードを使用します。applicationこのモードでは、JobGraph がクラスター内に生成されます。

したがって、PipeExecutorの実装クラスは次の図に示すとおりです: (コードを押すとCTRL+H表示されます)

ここに画像の説明を挿入
赤枠内の上記 2 つのモードに加えて、IDEA 環境で Flink MiniCluster をデバッグ用に実行するときに使用しますLocalExecutor

60. ローカル投稿モードの特徴とその実現方法を教えてください。

Local は、ローカル IDEA 環境で実行される送信方法です。クラスター上にはありません。主にデバッグに使用され、概略図は次のとおりです。

ここに画像の説明を挿入

  • Flink プログラムはJobClientによって提出されます。

  • JobClientに課題を提出しますJobManager

  • JobManagerリソースの割り当てとジョブの実行を調整する責任を負います。リソースの割り当てが完了すると、タスクは対応する に送信されますTaskManager

  • TaskManagerスレッドを開始して実行を開始し、開始、進行中、完了などのステータスの変化を に報告しますTaskManagerJobManager

  • ジョブの実行が完了すると、結果がクライアントに返されます。

ソースコード分析: Flink 1.12.2 1.12.2経由1.12.2ソースコードが解析されます。

(1) 対応するStreamExecutionEnvironmentオブジェクトを作成して取得しますLocalStreamEnvironment

StreamExecutionEnvironmentオブジェクトのメソッドを呼び出しますexecute

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
(2) StreamGraphを取得します。

ここに画像の説明を挿入
(3) 特定のPipeLineExecutorGet localExecutorFactoryを実行します。

ここに画像の説明を挿入
(4) JobGraph を取得します。

localExecutorFactoryの実装クラスLocalExecutorに従ってJobGraphを生成します。

ここに画像の説明を挿入
上記の部分はすべてFlink Clientで生成されます。Localモードでサブミットするので、次にMiniClusterクラスタを作成し、miniCluster.submitJobサブミットするjobGraphを で指定します。

(5) MiniCluster クラスターをインスタンス化します。

ここに画像の説明を挿入
(6)JobClientクライアントに戻ります。

上記を実行してminiCluster.submitJobJobGraph をローカル クラスターに送信すると、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 つが完了してリソースが解放された後にのみ通常どおり送信できます。すべてのジョブがリソースを共有しDispatcherResourceManager共有するため、小規模で実行時間が短いジョブに適しています。

ここに画像の説明を挿入

65. ジョブごとの糸モードの特徴は何ですか?

コミットコマンド:

./bin/flink run -t yarn-per-job --detached xxx.jar

ジョブごとの糸モード: 各ジョブは、適切な分離、JM ロード バランシングを使用して独立してクラスターを開始し、mainメソッドはクライアント上で実行されます。モードではper-job、 Job ごとに 1 つが存在しJobManagerTaskManagerそれぞれに 1 つの Job のみが存在します。

特徴: タスクはジョブに対応します。送信された各ジョブは、ジョブが完了するまで、それぞれの状況に応じて Yarn からリソースを個別に申請します。ジョブが失敗しても、次のジョブの通常の送信や操作には影響しません。排他的DispatcherおよびResourceManagerリソース アプリケーションはオンデマンドで受け付けられます。大規模で長時間実行されるジョブに適しています。

ここに画像の説明を挿入

66. 糸かけモードの特徴は何ですか?

次のようにコマンドを送信します。

./bin/flink run-application -t yarn-application xxx.jar

糸アプリケーション モード: 各ジョブは、適切な分離、JM ロード バランシングを使用して独立してクラスターを開始し、mainメソッドはJobManagerで実行されます。

yarn-per-jobと の両方のモードyarn-session、クライアントは次の 3 つの手順を実行する必要があります。

  • ジョブに必要な依存関係を取得します。
  • 環境分析を実行し、論理的な計画を取得することにより、つまりStreamGraphJobGraph;
  • 依存関係と JobGraph をクラスターにアップロードします。

ここに画像の説明を挿入
これらが完了した後でのみ、env.execute()Flink ランタイムがトリガーされ、メソッドを通じて実際にジョブの実行が開始されます。すべてのユーザーが同じクライアント上でジョブを送信する場合、より大きな依存関係により多くの帯域幅が消費され、より複雑なジョブ ロジックを JobGraph に変換する際にもより多くの CPU とメモリが消費され、代わりにクライアントのリソースがボトルネックになります。

それを解決するために、コミュニティは従来の展開モードに基づいてアプリケーション モードを実装しました。元々クライアントが実行する必要があった 3 つのことは、 に転送されましたJobManager。つまり、main()メソッドはクラスター (エントリ ポイントが配置されている場所ApplicationClusterEntryPoint) で実行され、クライアントはデプロイメント リクエストを開始することだけを担当する必要があります。

ここに画像の説明を挿入
要約すると、Flink コミュニティでは、yarn-per-jobまたはyarn-applicationモードを使用してアプリケーションを送信することを推奨しています。

67. 糸セッションの提出プロセスについて詳しく教えてください。

提出の流れは以下の通りです。

ここに画像の説明を挿入

1. クラスターを起動します

  • Flink ClientYarn ResourceManagerタスク情報 を に送信します。
    • Flink Clientアプリケーション構成 ( Flink-conf.yamllogback.xmllog4j.properties) および関連ファイル (Flink Jar、構成クラス ファイル、ユーザー Jar ファイル、JobGraph オブジェクトなど) を分散ストレージ HDFS にアップロードします。
    • Flink ClientYarn ResourceManagerタスク情報を に送信します。
  • Yarn が Flink クラスターを開始します。2 2を実行します。2 つのステップ:
    • Yarn ClientFlink のアプリケーションを送信してクラスターYarn ResourceManagerを作成し、Yarn ResourceManagerコンテナー リソースを割り当て、対応するNodeManagerジョブを開始するように通知しますApplicationMaster(Flink ジョブが送信されるたびに、ジョブが開始されますApplicationMaster)。ApplicationMasterこれには現在開始されるジョブJobManagerと内部使用が含まれます。フリンク自体のResourceManager
    • クラスター起動のエントリ ポイントとしてJobManagerプロセス内で実行されます。Flink によって内部的に使用されるYarnSessionClusterEntryPointInitializationは、関連する RPC サービスを開始し、Rest インターフェイスを介して JobGraph が送信されるのを待ちます。DispatcherResourceManagerFlink Client

2. ジョブの送信

  • Flink ClientDispatcherコンパイルされた JobGraphを Rest 経由で送信します。Dispatcherこれは Rest インターフェイスであり、実際のスケジュール設定や割り当て作業を担当しません。

  • DispatcherJobGraph を受け取った後、ジョブ用の JobGraph を作成しJobMaster、ジョブを引き渡しJobMasterJobMasterジョブのスケジューリングを担当し、ジョブとタスクのライフサイクルを管理し、ExecutionGraph (JobGraph の並列バージョン、ジョブグラフのコア データ構造) を構築します。スケジューリング層)。

上記の 2 つのステップが実行された後、ジョブはスケジュール実行段階に入ります。

3. ジョブのスケジュール実行

  • JobMasterExecutionGraphからリソースを申請しResourceManager、ExecutionGraph のスケジュールを開始します。

  • ResourceManagerリソースリクエストを待機キューに追加し、ハートビートを通じてYarnResourceManager新しいコンテナを申請することでプロセスを開始しますTaskManager

  • YarnResourceManagerを開始し、Jar ファイルとその他の必要な関連リソースを HDFS からロードし、コンテナーで開始しTaskManager、 をTaskManager開始しますTaskExecutor

  • TaskManager開始後、ResourceManagerに登録し、スロット リソースのステータスを に報告しますResourceManager

  • ResourceManager待機キューから Slot リクエストを取り出し、TaskManagerにリソースの空き状況を確認し、TaskManagerどの Slot に割り当てられているかを伝えますJobMaster

  • TaskManagerJobMaster自分のタスクに属する自分のスロットに返信すると、JobMaserそのスロットは SlotPool にキャッシュされます。

  • JobMasterTaskMnagerスロットで実行されるタスクをスケジュールします。

68. ジョブごとの糸の送信プロセスについて詳しく教えてください。

次のようにコマンドを送信します。

./bin/flink run -t yarn-per-job --detached xxx.jar

提出の流れは以下の通りです。

ここに画像の説明を挿入
1. クラスターを起動します

  • Flink ClientYarn ResourceManagerタスク情報 を に送信します。
    • Flink Clientアプリケーション構成 ( Flink-conf.yamllogback.xmllog4j.properties) および関連ファイル (Flink Jar、構成クラス ファイル、ユーザー Jar ファイル、JobGraph オブジェクトなど) を分散ストレージ HDFS にアップロードします。
    • Flink ClientYarn ResourceManagerタスク情報を に送信します。
  • Yarn が Flink クラスターを開始します。2 2を実行します。2ステップ操作。
    • Yarn ClientFlink のアプリケーションを送信してクラスターYarn ResourceManagerを作成し、Yarn ResourceManagerコンテナー リソースを割り当て、対応するNodeManagerジョブを開始するように通知しますApplicationMaster(Flink ジョブが送信されるたびに、ジョブが開始されますApplicationMaster)。ApplicationMasterこれには現在開始されるジョブJobManagerと内部使用が含まれます。フリンク自体のResourceManager
    • クラスター起動のエントリ ポイントとしてJobManagerプロセス内で実行されます。Flink によって内部的に使用されるYarnJobClusterEntryPointInitializationは、関連する RPC サービスを開始し、Rest インターフェイスを介して JobGraph が送信されるのを待ちます。DispatcherResourceManagerFlink Client

2. ジョブの送信

  • ApplicationMasterStart DispatcherDispatcherstart 、ResourceManagerおよびJobMaster(このステップはセッションとはJobMaster異なり、Dispatcherクライアントによって渡されるのではなくプルされます)。JobMasterジョブのスケジューリング、ジョブとタスクのライフ サイクルの管理、ExecutionGraph (スケジューリング レイヤーのコア データ構造である JobGraph の並列バージョン) の構築を担当します。

上記の 2 つのステップが実行された後、ジョブはスケジュール実行段階に入ります。

3. ジョブのスケジュール実行

  • JobMasterExecutionGraphからスロット リソースを申請しResourceManager、スケジュールを開始します。

  • ResourceManagerリソースリクエストを待機キューに追加し、ハートビートを通じてYarnResourceManager新しいコンテナを申請することでプロセスを開始しますTaskManager

  • YarnResourceManager開始し、Jar ファイルとその他の必要な関連リソースを HDFS からロードし、コンテナーで開始しますTaskManager

  • TaskManager内部的に開始しますTaskExecutor

  • TaskManager開始後、ResourceManagerに登録し、スロット リソースのステータスを に報告しますResourceManager

  • ResourceManager待機キューから Slot リクエストを取り出し、TaskManagerにリソースの空き状況を確認し、TaskManagerどの Slot に割り当てられているかを伝えますJobMaster

  • TaskManagerJobMaster自分のタスクに属する自分のスロットに返信すると、JobMaserそのスロットは SlotPool にキャッシュされます。

  • JobMasterTaskMnagerスロットで実行されるタスクをスケジュールします。

おすすめ

転載: blog.csdn.net/be_racle/article/details/132419006