Flink Task 并行度

  1. 并行的数据流

    • Flink程序由多个任务(转换/运算符,数据源和接收器)组成,Flink中的程序本质上是并行和分布式的。

    • 在执行期间,流具有一个或多个流分区,并且每个operator具有一个或多个operator*子任务*

    • operator子任务彼此独立,并且可以在不同的线程中执行,这些线程又可能在不同的机器或容器上执行。

    • operator子任务的数量是该特定operator的并行度。

    • 流的并行度始终是其生成operator的并行度。

    • 同一程序的不同operator可能具有不同的并行级别。

    • 示意图:

      image-20191113083419692

    • 流可以以一对一(或重新分配)模式或以重新分发模式在两个运营商之间传输数据:

      • 一对一流
        • 如上图中的Sourcemap运算符之间
        • 保留元素的分区和排序
        • 这意味着map运算符的subtask [1] 将看到与Source运算符的subtask [1]生成的顺序相同的元素
      • 重新分配流
        • 在上面的mapkeyBy / window之间,以及 keyBy / windowSink之间重新分配流
        • 每个运算符子任务将数据发送到不同的目标子任务, 具体取决于所选的转换。
        • 图中是根据 keyby算子进行数据的重新分布。
  2. 任务并行度设置

    • 算子级别

      • 可以通过调用其setParallelism()方法来定义单个运算符,数据源或数据接收器的并行度。

                //1.初始化环境
                StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
                //2.读取数据源,并进行转换操作
                DataStream<Tuple2<String, Integer>> dataStream = env
                        .socketTextStream("ronnie01", 9999)
                        .flatMap(new Splitter())
                        .keyBy(0)
                        //每5秒触发一批计算
                        .timeWindow(Time.seconds(5))
                        // 设置并行度
                        .sum(1).setParallelism(3);
    • 执行环境级别

      • 执行环境级别的并行度是本次任务中所有的操作符,数据源和数据接收器的并行度。

      • 可以通过显式的配置运算符并行度来覆盖执行环境并行度。

                //1.初始化环境
                StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
                env.setParallelism(3);
    • 客户端级别

      • 在向Flink提交作业时,可以在客户端设置并行度,通过使用指定的parallelism参数-p。
      • 例如:
        • ./bin/flink run -p 10 ../examples/WordCount-java.jar
    • 系统级别

      • 通过设置flink_home/conf/flink-conf.yaml 配置文件中的parallelism.default配置项来定义默认并行度。

猜你喜欢

转载自www.cnblogs.com/ronnieyuan/p/11846623.html