シャンシリコンバレービッグデータFlink1.17実践チュートリアル - ノート03 [Flinkランタイムアーキテクチャ]

  1. Shang シリコンバレービッグデータ Flink1.17 実践チュートリアル - ノート 01 [Flink 概要、Flink クイックスタート]
  2. Shang シリコンバレービッグデータ Flink1.17 実践チュートリアル - メモ 02 [Flink 導入]
  3. シャンシリコンバレービッグデータFlink1.17実践チュートリアル - ノート03 [Flinkランタイムアーキテクチャ]
  4. 商 シリコンバレービッグデータ Flink1.17実践チュートリアル-メモ04【】
  5. 商 シリコンバレービッグデータ Flink1.17実践チュートリアル-メモ05【】
  6. 商 シリコンバレービッグデータ Flink1.17実践チュートリアル-メモ06【】
  7. 商 シリコンバレービッグデータ Flink1.17実践チュートリアル-ノート07【】
  8. 商 シリコンバレービッグデータ Flink1.17実践チュートリアル-ノート08【】

目次

基本

第 04 章 - Flink の展開

P023【023_Flinkランタイムアーキテクチャ_システムアーキテクチャ】07:13

P024【024_Flinkランタイムアーキテクチャ_コアコンセプト_並列処理】06:45

P025【025_Flinkランタイムアーキテクチャ_コアコンセプト_並列処理設定と優先度】18:40

P026【026_Flinkランタイムアーキテクチャ_コアコンセプト_オペレーターチェーン】08:34

P027【027_Flinkランタイムアーキテクチャ_コアコンセプト_オペレーターチェーンデモ】17:11

P028 [028_Flink ランタイム アーキテクチャ_コア コンセプト_タスク スロット] 09:52

P029 [029_Flink ランタイム アーキテクチャ_コア コンセプト_タスク スロットの共有グループ] 07:59

P030 [030_Flinkランタイムアーキテクチャ_コアコンセプト_スロットと並列性の関係とデモ] 21:27

P031 [031_Flink ランタイム アーキテクチャ_サブミッション プロセス_スタンドアロン セッション モード & 4 枚の画像] 09:49

P032【032_Flinkランタイムアーキテクチャ_サブミッションプロセス_Yarnアプリケーションモード】05:18


基本

第 04 章 - Flink の展開

P023【023_Flinkランタイムアーキテクチャ_システムアーキテクチャ】07:13

Flink ランタイム アーキテクチャ - スタンドアロン セッション モードの例

P024【024_Flinkランタイムアーキテクチャ_コアコンセプト_並列処理】06:45

  • 特定のオペレーターのサブタスクの数は、そのオペレーターの並列性と呼ばれますこのように、並列サブタスクを含むデータ フローは並列データ フローであり、並列タスクを分散するために複数のパーティション (ストリーム パーティション) が必要です。一般に、ストリーム プログラムの並列度は、そのすべての演算子の中での最大の並列度であると考えることができますプログラムでは、演算子ごとに並列度が異なる場合があります。
  • 例: 上図に示すように、現在のデータ フローにはソース、マップ、ウィンドウ、シンクの 4 つの演算子があり、シンク演算子の並列度は 1、他の演算子の並列度は 2 です。したがって、このストリーム処理プログラムの並列度は 2 です。

P025【025_Flinkランタイムアーキテクチャ_コアコンセプト_並列処理設定と優先度】18:40

4.2.1 並列処理

2) 平行度の設定

Flink では、並列度の設定にさまざまな方法が使用でき、その有効範囲や優先順位も異なります。

( 1 ) コードで設定する

私たちのコードでは、演算子の後に setParallelism() メソッドを呼び出すだけで、現在の演算子の並列処理を設定できます。

stream.map(word -> Tuple2.of(word, 1L))。setParallelism (2);

この方法で設定された並列度は、現在のオペレーターに対してのみ有効です。

さらに、実行環境の setParallelism() メソッドを直接呼び出して並列度をグローバルに設定することもできます。

env.setParallelism(2);

このように、コード内のすべての演算子のデフォルトの並列処理は 2 になります。グローバル並列処理がプログラム内でハードコーディングされている場合、動的拡張が不可能になるため、通常はプログラム内でグローバル並列処理を設定しません。

ここで注意したいのは、keyBy は演算子ではないため、keyBy に並列度を設定できないことです。

( 2 ) 申請時に設定

flink run コマンドを使用してアプリケーションを送信するとき、 -p パラメーターを追加して、現在のアプリケーション実行の並列処理を指定できます。その機能は、実行環境のグローバル設定と似ています。

bin/flink run p 2 c com.atguigu.wc.SocketStreamWordCount

./FlinkTutorial-1.0-SNAPSHOT.jar

Web UI でジョブを直接送信する場合は、対応する入力ボックスに並列度を直接追加することもできます。

package com.atguigu.wc;

import org.apache.flink.api.common.typeinfo.TypeHint;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * TODO DataStream实现Wordcount:读socket(无界流)
 *
 * @author
 * @version 1.0
 */
public class WordCountStreamUnboundedDemo {
    public static void main(String[] args) throws Exception {
        // TODO 1.创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // IDEA运行时,也可以看到webui,一般用于本地测试
        // 需要引入一个依赖 flink-runtime-web
        // 在idea运行,不指定并行度,默认就是 电脑的 线程数
        // StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
        env.setParallelism(3);

        // TODO 2.读取数据: socket
        DataStreamSource<String> socketDS = env.socketTextStream("hadoop102", 7777);

        // TODO 3.处理数据: 切换、转换、分组、聚合
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = socketDS
                .flatMap(
                        (String value, Collector<Tuple2<String, Integer>> out) -> {
                            String[] words = value.split(" ");
                            for (String word : words) {
                                out.collect(Tuple2.of(word, 1));
                            }
                        }
                )
                .setParallelism(2)
                .returns(Types.TUPLE(Types.STRING,Types.INT))
                // .returns(new TypeHint<Tuple2<String, Integer>>() {})
                .keyBy(value -> value.f0)
                .sum(1);

        // TODO 4.输出
        sum.print();

        // TODO 5.执行
        env.execute();
    }
}

/**
 并行度的优先级:
    代码:算子 > 代码:env > 提交时指定 > 配置文件
 */

並列処理の優先順位:コード: オペレーター > コード: グローバル環境 > サブミット時にコマンドを指定 > 構成ファイル。

P026【026_Flinkランタイムアーキテクチャ_コアコンセプト_オペレーターチェーン】08:34

4.2.2 オペレーターチェーン

2) 演算子チェーンのマージ

Flink では、同じ並列度を持つ1 対 1 のオペレーター操作を直接リンクして「大きな」タスク ( task )を形成し、元のオペレーターが実際のタスクの一部になるようにすることができます。各タスクはスレッドによって実行されます。このような技術を「オペレーターチェーン」と呼びます

P027【027_Flinkランタイムアーキテクチャ_コアコンセプト_オペレーターチェーンデモ】17:11

package com.atguigu.wc;

import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * TODO DataStream实现Wordcount:读socket(无界流)
 *
 * @author
 * @version 1.0
 */
public class OperatorChainDemo {
    public static void main(String[] args) throws Exception {
        // TODO 1.创建执行环境
		// StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // IDEA运行时,也可以看到webui,一般用于本地测试
        // 需要引入一个依赖 flink-runtime-web
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());

        // 在idea运行,不指定并行度,默认就是 电脑的 线程数
        env.setParallelism(1);

        // 全局禁用 算子链
		//env.disableOperatorChaining();

        // TODO 2.读取数据:socket
        DataStreamSource<String> socketDS = env.socketTextStream("hadoop102", 7777);

        // TODO 3.处理数据: 切换、转换、分组、聚合
        SingleOutputStreamOperator<Tuple2<String,Integer>> sum = socketDS
				//.disableChaining()
                .flatMap(
                        (String value, Collector<String> out) -> {
                            String[] words = value.split(" ");
                            for (String word : words) {
                                out.collect(word);
                            }
                        }
                )
                .startNewChain()
				//.disableChaining()
                .returns(Types.STRING)
                .map(word -> Tuple2.of(word, 1))
                .returns(Types.TUPLE(Types.STRING,Types.INT))
                .keyBy(value -> value.f0)
                .sum(1);

        // TODO 4.输出
        sum.print();

        // TODO 5.执行
        env.execute();
    }
}

/**
 1、算子之间的传输关系:
     一对一
     重分区

 2、算子 串在一起的条件:
    1) 一对一
    2) 并行度相同

 3、关于算子链的api:
    1)全局禁用算子链:env.disableOperatorChaining();
    2)某个算子不参与链化:  算子A.disableChaining(),  算子A不会与 前面 和 后面的算子 串在一起
    3)从某个算子开启新链条:  算子A.startNewChain(), 算子A不与 前面串在一起,从A开始正常链化
 */

P028 [028_Flink ランタイム アーキテクチャ_コア コンセプト_タスク スロット] 09:52

4.2.3 タスクスロット

P029 [029_Flink ランタイム アーキテクチャ_コア コンセプト_タスク スロットの共有グループ] 07:59

3) タスクごとのタスクスロットの共有

デフォルトでは、Flink はサブタスクがスロットを共有することを許可します。シンク タスクの並列度を 1 に保ち、ジョブの送信時にグローバル並列度を 6 に設定すると、最初の 2 つのタスク ノードにはそれぞれ 6 つの並列サブタスクがあり、ストリーム処理プログラム全体には 13 のサブタスクがあります。上の図に示すように、同じジョブに属している限り、異なるタスク ノード (オペレーター) のサブタスクを同じスロットで並列実行できますしたがって、最初のタスク ノードの source→map では、その 6 つの並列サブタスクを異なるスロットに分割する必要がありますが、2 番目のタスク ノードの keyBy/window/apply の並列サブタスクは、最初のタスク ノードのスロットと共有できます。

package com.atguigu.wc;

import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * TODO DataStream实现Wordcount:读socket(无界流)
 *
 * @author
 * @version 1.0
 */
public class SlotSharingGroupDemo {
    public static void main(String[] args) throws Exception {
        // TODO 1.创建执行环境
		// StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // IDEA运行时,也可以看到webui,一般用于本地测试
        // 需要引入一个依赖 flink-runtime-web
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());

        // 在idea运行,不指定并行度,默认就是 电脑的 线程数
        env.setParallelism(1);

        // TODO 2.读取数据:socket
        DataStreamSource<String> socketDS = env.socketTextStream("hadoop102", 7777);

        // TODO 3.处理数据: 切换、转换、分组、聚合
        SingleOutputStreamOperator<Tuple2<String,Integer>> sum = socketDS
                .flatMap(
                        (String value, Collector<String> out) -> {
                            String[] words = value.split(" ");
                            for (String word : words) {
                                out.collect(word);
                            }
                        }
                )
                .returns(Types.STRING)
                .map(word -> Tuple2.of(word, 1)).slotSharingGroup("aaa")
                .returns(Types.TUPLE(Types.STRING,Types.INT))
                .keyBy(value -> value.f0)
                .sum(1);


        // TODO 4.输出
        sum.print();

        // TODO 5.执行
        env.execute();
    }
}

/**
 1、slot特点:
    1)均分隔离内存,不隔离cpu
    2)可以共享:
          同一个job中,不同算子的子任务 才可以共享 同一个slot,同时在运行的
          前提是,属于同一个 slot共享组,默认都是“default”

 2、slot数量 与 并行度 的关系
    1)slot是一种静态的概念,表示最大的并发上限
       并行度是一种动态的概念,表示 实际运行 占用了 几个

    2)要求: slot数量 >= job并行度(算子最大并行度),job才能运行
       TODO 注意:如果是yarn模式,动态申请
         --> TODO 申请的TM数量 = job并行度 / 每个TM的slot数,向上取整
       比如session: 一开始 0个TaskManager,0个slot
         --> 提交一个job,并行度10
            --> 10/3,向上取整,申请4个tm,
            --> 使用10个slot,剩余2个slot
 */

P030 [030_Flinkランタイムアーキテクチャ_コアコンセプト_スロットと並列性の関係とデモ] 21:27

4.2.4 タスクスロットと並列性の関係

タスク スロットと並列処理はどちらもプログラムの並列実行に関連しますが、それらはまったく異なる概念です簡単に言うと、タスク スロットは静的な概念であり、タスク マネージャーの同時実行機能を指し、パラメーター taskmanager.numberOfTaskSlots を使用して構成できます。一方、並列処理は動的概念であり、タスク マネージャーがタスクを実行するときに使用される実際の同時実行機能です。このプログラムは、パラメータParallelism.defaultを使用して構成できます。

スロット数と並列度の関係
    1) スロットは最大同時実行数の上限を示す静的な概念であり、
       並列度は実際の処理で占有されるスロットの数を示す動的な概念です。

    2) 要件: スロット数 >= ジョブ並列数 (オペレーターの最大並列数)、ジョブは
       TODO を実行可能 注: ヤーン モードの場合、動的アプリケーション
         --> TODO に適用される TM の数 = ジョブ並列数 / スロット各 TM 番号の切り上げ、
       たとえばセッション: 開始時のタスクマネージャーは 0、スロットは 0
         --> ジョブを送信、並列処理は 10
            --> 10/3、切り上げ、4 tm を申請
            --> 10 スロットを使用、残り 2 スロット

P031 [031_Flink ランタイム アーキテクチャ_サブミッション プロセス_スタンドアロン セッション モード & 4 枚の画像] 09:49

4.3 課題提出プロセス

4.3.1 スタンドアロン セッション モードのジョブ送信プロセス

4.3.2 論理フローグラフ/ジョブグラフ/実行グラフ/物理フローグラフ

論理フローグラフ(StreamGraph)→ジョブグラフ(JobGraph)→実行グラフ(ExecutionGraph)→物理グラフ(Physical Graph)。

P032【032_Flinkランタイムアーキテクチャ_サブミッションプロセス_Yarnアプリケーションモード】05:18

4.3.3 ヤーンアプリケーションモードのジョブ投入プロセス

おすすめ

転載: blog.csdn.net/weixin_44949135/article/details/131760766