【Flink】任务调度原理、自定义数据源、基本转换算子的使用之map

一 Flink运行架构

1 任务调度原理

(1)TaskManger与Slots

在这里插入图片描述

Flink中每一个worker(TaskManager)都是一个JVM进程,它可能会在独立的线程上执行一个或多个subtask。为了控制一个worker能接收多少个task,worker通过task slot来进行控制(一个worker至少有一个task slot)。

每个task slot表示TaskManager拥有资源的一个固定大小的子集。假如一个TaskManager有三个slot,那么它会将其管理的内存分成三份给各个slot。资源slot化意味着一个subtask将不需要跟来自其他job的subtask竞争被管理的内存,取而代之的是它将拥有一定数量的内存储备。需要注意的是,这里不会涉及到CPU的隔离,slot目前仅仅用来隔离task的受管理的内存。

通过调整task slot的数量,允许用户定义subtask之间如何互相隔离。如果一个TaskManager一个slot,那将意味着每个task group运行在独立的JVM中(该JVM可能是通过一个特定的容器启动的),而一个TaskManager多个slot意味着更多的subtask可以共享同一个JVM。而在同一个JVM进程中的task将共享TCP连接(基于多路复用)和心跳消息。它们也可能共享数据集和数据结构,因此这减少了每个task的负载。

在这里插入图片描述

默认情况下,Flink允许子任务共享slot,即使它们是不同任务的子任务(前提是它们来自同一个job)。 这样的结果是,一个slot可以保存作业的整个管道。

Task Slot是静态的概念,是指TaskManager具有的并发执行能力**,可以通过参数taskmanager.numberOfTaskSlots进行配置;而**并行度parallelism是动态概念,即TaskManager运行程序时实际使用的并发能力,可以通过参数parallelism.default进行配置。

也就是说,假设一共有3个TaskManager,每一个TaskManager中的分配3个TaskSlot,也就是每个TaskManager可以接收3个task,一共9个TaskSlot,如果我们设置parallelism.default=1,即运行程序默认的并行度为1,9个TaskSlot只用了1个,有8个空闲,因此,设置合适的并行度才能提高效率。

在这里插入图片描述

在这里插入图片描述

并行度的设置见以下程序:

public static void main(String[] args) throws Exception{
   
   
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    // 整体并行度设置为1
    env.setParallelism(1);

    // 设置局部并行度为1
    DataStreamSource<String> stream = env.fromElements("hello word", "hello word").setParallelism(1);

    // 设置局部并行度为2
    SingleOutputStreamOperator<WordWithCount> mappedStream = stream
            .flatMap(new FlatMapFunction<String, WordWithCount>() {
   
   
                public void flatMap(String value, Collector<WordWithCount> out) throws Exception {
   
   
                    String[] arr = value.split(" ");
                    for (String s : arr) {
   
   
                        out.collect(new WordWithCount(s, 1L));
                    }
                }
            }).setParallelism(2);

    // 分组:按照key进行分区,与并行度无关
    KeyedStream<WordWithCount, String> keyedStream = mappedStream
            .keyBy(new KeySelector<WordWithCount, String>() {
   
   
                public String getKey(WordWithCount value) throws Exception {
   
   
                    return value.word;
                }
            });

    // 设置局部并行度为2
    SingleOutputStreamOperator<WordWithCount> result = keyedStream
            .reduce(new ReduceFunction<WordWithCount&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneTenTwo76

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值