Flink 开发一些代码

本文基于:Flink Java Demo

1.开发中开启WEB UI

1.添加依赖

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-runtime-web</artifactId>
            <version>1.18.0</version>
            <scope>provided</scope>
        </dependency>

2.创建带WEBUI的执行环境

        // 创建带WEBUI的执行环境,一般用于本地测试,需要引入flink-runtime-web依赖
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());

3.访问

http://localhost:8081/

2.设置任务的并行度

1.代码中配置

1.局部控制

在算子方法后使用setParallelism()方法设置并行度
在idea运行,不指定并行度,默认就是本机的线程数

        // 处理数据
        SingleOutputStreamOperator<Tuple2<String, Integer>> wordToOne = socketDS
                .flatMap((String s, Collector<Tuple2<String, Integer>> collector) -> {
                    // 按照空格切分单词
                    String[] words = s.split(" ");
                    for (String word : words) {
                        Tuple2<String, Integer> wordTuple2 = Tuple2.of(word, 1);
                        // 使用 Collector 向下游发送数据
                        collector.collect(wordTuple2);
                    }
                })
                .setParallelism(2)  //设置并行度
                .returns(Types.TUPLE(Types.STRING, Types.INT));
2.全局配置并行度

算子方法中配置的并行度优先级要高于全局配置的并行度

        // 创建带WEBUI的执行环境,一般用于本地测试,需要引入flink-runtime-web依赖
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());

        env.setParallelism(7);  // 全局配置并行度

2.提交作业时指定并行度

并行度优先级:
算子指定 > env > 提交时指定 > flink-conf.yaml[parallelim.default]

1.在WEB UI中提交任务时设置并行度[略]
2.在命令行中提交任务时设置并行度

使用-p参数指定即可。

3.算子链相关

1.局部控制

        SingleOutputStreamOperator<Tuple2<String, Integer>> wordToOneMap = wordToOne
                .map(word -> Tuple2.of(word, 1))
                //.startNewChain()    //从当前算子开始新链
                .disableChaining()  //禁用单个算子的算子链
                .returns(Types.TUPLE(Types.STRING, Types.INT));

2.全局控制

        // 创建带WEBUI的执行环境,一般用于本地测试,需要引入flink-runtime-web依赖
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());

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

4.任务槽相关

在Flink的 flink-conf.yaml 配置文件中,可以设置TaskManager的 slot 数量,默认是 1 个 slot。

taskmanager.numberOfTaskSlots: 8

需要注意的是,slot 目前仅仅用来隔离内存,不会涉及 CPU 的隔离。在具体应用时,可以将 slot数量配置为机器的 CPU核心数,尽量避免不同任务之间对 CPU的竞争。这也是开发环境默认并行度设为机器 CPU 数量的原因。
任务槽特点:

  1. 均分隔离内存,不隔离cpu资源
  2. 任务槽可以共享
  • 同一个job中,不同算子的子任务 & 同时在运行的,才可以共享同一个slot
  • 前提条件,属于同一个slot共享组,默认都是“default”
    配置slot共享组
        SingleOutputStreamOperator<Tuple2<String, Integer>> wordToOneMap = wordToOne
                .map(word -> Tuple2.of(word, 1))
                .slotSharingGroup("coreqi")   //指定当前算子的共享组,未指定则默认为"default"
                .returns(Types.TUPLE(Types.STRING, Types.INT));

slot 共享好处就是允许我们保存完整的作业管道。这样一来,即使某个TaskManager 出现故障宕机,其他节点也可以完全不受影响,作业的任务可以继续执行。

5.并行度与任务槽的关系

  • 任务槽是一种静态的概念,表示最大的并发上限
  • 并行度是一种动态的概念,表示实际运行中占用了几个
    要求: 任务槽(slot)数量 >= job并行度(算子最大并行度),job才能运行
    注意:如果是YARN模式,资源会动态申请。
    申请的TaskManager数量 = job并行度 / 每个TaskManager的slot数量,向上取整。
    例如 YARN Session模式下:开始情况下,每个TaskManager的slot数量配置为3,默认为0个TaskManager,0个slot
    提交一个Job,并行度为10
  • 10 / 3,向上取整,则会申请4个TaskManager
  • 使用10个slot,剩余2个slot
posted @ 2024-01-19 21:09  SpringCore  阅读(58)  评论(0编辑  收藏  举报