Flink入门到实战-阶段二(图解运行时架构)

该博客探讨了Apache Flink的系统架构,包括作业提交流程、数据流程图和并行度的概念。通过实验展示了如何设置并行度影响任务执行,提到了算子链和任务与任务槽的关系。此外,还讨论了任务调度优化,解释了如何根据任务槽共享任务以提高效率。
摘要由CSDN通过智能技术生成

系统架构

提交作业流程 

高级抽象视角

独立模式 

Yarn集群 

会话模式

1.先对于yarn申请一个JobManager

 2.JobManager处理任务

单作业模式 

数据流程图

所有的 Flink 程序都可以归纳为由三部分构成: Source Transformation Sink
Source 表示 源算子 ,负责读取数据源。
Transformation 表示 转换算子 ,利用各种算子进行处理加工。
Sink 表示 下沉算子 ,负责数据的输出。

并行度 

流程图

实验

public class FlinkSoctet {
    public static void main(String[] args) throws Exception {
        //得到执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> initData = env.socketTextStream("master",9997);

        SingleOutputStreamOperator<Tuple2<String, Integer>> map = initData.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String item, Collector<String> out) throws Exception {
                String[] resItem = item.split(" ");
                for (String s : resItem) {
                    out.collect(s);
                }
            }
        }).setParallelism(1).map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String item) throws Exception {
                return Tuple2.of(item, 1);
            }
        }).setParallelism(2);

        //对于得到的元组的流数据,进行分组聚合
        map.keyBy(new KeySelector<Tuple2<String, Integer>, String>() {
            @Override
            public String getKey(Tuple2<String, Integer> value) throws Exception {
                return value.f0;
            }
        }).sum(1).setParallelism(3).print();

        //由于是流处理程序,所以这里要不断的执行
        env.execute();
    }
}

得到的结果

结论 

  • 可以看出Flink的并行度和Spark的重分区的概念很像

算子链

实验 

public class FlinkSoctet {
    public static void main(String[] args) throws Exception {
        //得到执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> initData = env.socketTextStream("master",9997);
        env.setParallelism(1);

        SingleOutputStreamOperator<Tuple2<String, Integer>> map = initData.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String item, Collector<String> out) throws Exception {
                String[] resItem = item.split(" ");
                for (String s : resItem) {
                    out.collect(s);
                }
            }
        }).map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String item) throws Exception {
                return Tuple2.of(item, 1);
            }
        });

        //对于得到的元组的流数据,进行分组聚合
        map.keyBy(new KeySelector<Tuple2<String, Integer>, String>() {
            @Override
            public String getKey(Tuple2<String, Integer> value) throws Exception {
                return value.f0;
            }
        }).sum(1).print();

        //由于是流处理程序,所以这里要不断的执行
        env.execute();
    }
}

结果 

结论 

  • 可以看到一对一的关系的算子他们在一个任务里面执行
  • 如果是一对多,那么就是分开两个任务执行
  • 这个和Spark里面发生Shuffle拆分Stage很像 

执行图

        在这个转换过程中,有几个不同的阶段,会生成不同层级的图,其中最重要的就是作业图
JobGraph )和执行图( ExecutionGraph )。 Flink 中任务调度执行的图,按照生成顺序可以分成
四层:
逻辑流图( StreamGraph )→ 作业图( JobGraph )→ 执行图( ExecutionGraph )→ 物理
图( Physical Graph )。

任务(Tasks)和任务槽(Task Slots

理论

任务槽( Task Slots
之前已经提到过, Flink 中每一个 worker( 也就是 TaskManager) 都是一个 JVM 进程,它可以启动多个独立的线程,来并行执行多个子任务( subtask)。所以如果想要执行 5 个任务,并不一定非要 5 个 TaskManager,我们可以让 TaskManager多线程执行任务。如果可以同时运行 5 个线程,那么只要一个 TaskManager 就可以满足我们之
前程序的运行需求了。

任务对任务槽的共享

下面是分配的例子任务槽和并行度的关系

 

实验

前期准备

现在的情况是有3个task slots,如果我们设置并行度为5是什么情况

实验代码 

public class FlinkSoctet {
    public static void main(String[] args) throws Exception {
        //得到执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> initData = env.socketTextStream("master",9997);
        env.setParallelism(5);

        SingleOutputStreamOperator<Tuple2<String, Integer>> map = initData.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String item, Collector<String> out) throws Exception {
                String[] resItem = item.split(" ");
                for (String s : resItem) {
                    out.collect(s);
                }
            }
        }).map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String item) throws Exception {
                return Tuple2.of(item, 1);
            }
        });

        //对于得到的元组的流数据,进行分组聚合
        map.keyBy(new KeySelector<Tuple2<String, Integer>, String>() {
            @Override
            public String getKey(Tuple2<String, Integer> value) throws Exception {
                return value.f0;
            }
        }).sum(1).print();

        //由于是流处理程序,所以这里要不断的执行
        env.execute();
    }
}

结果

 

 报错

任务调度

可以根据自己的要求,合理分配task在不同的taskslots,了解即可,因为taskslots共享就是一种对于任务执行的优化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

工作变成艺术

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

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

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

打赏作者

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

抵扣说明:

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

余额充值