【Flink】入门Demo实现、Flink运行架构之运行时组件,任务提交流程,任务调度原理

news2025/7/9 14:21:57

文章目录

  • 一 快速上手
    • 1 创建maven项目
    • 2 引入依赖
    • 3 代码实现
      • (1)从在线数据读取
      • (2)从离线数据读取
    • 4 将程序提交到单点集群运行
  • 二 Flink运行架构
    • 1 Flink运行时组件
      • (1)作业管理器(JobManager)
      • (2)资源管理器(ResourceManager)
      • (3)分发器(Dispatcher)
      • (4)JobMaster
      • (5)任务管理器(TaskManager)
    • 2 任务提交流程
    • 3 任务调度原理

一 快速上手

1 创建maven项目

创建maven项目flink2022tutorial。

2 引入依赖

    <properties>
        <flink.version>1.13.0</flink.version>
        <java.version>1.8</java.version>
        <scala.binary.version>2.12</scala.binary.version>
        <slf4j.version>1.7.30</slf4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-scala_2.11</artifactId>
            <version>1.10.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-scala -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-scala_2.11</artifactId>
            <version>1.10.0</version>
        </dependency>
    </dependencies>

<build>
    <plugins>
    <!-- 该插件用于将Scala代码编译成class文件 -->
    <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>3.4.6</version>
        <executions>
            <execution>
                <!-- 声明绑定到maven的compile阶段 -->
                <goals>
                    <goal>compile</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在编写程序时需要注意:Flink程序支持java和scala两种语言。在引入包中,有java和scala两种包时注意要使用对应语言的包。

3 代码实现

(1)从在线数据读取

package day01;


import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

public class Example1 {
    // 抛出异常
    public static void main(String[] args) throws Exception{
        // 获取流处理的运行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 设置并行任务的数量为1
        env.setParallelism(1);

        // 读取数据源,先在终端启动'nc -lk 9999',再执行程序
        DataStreamSource<String> stream = env.socketTextStream("hadoop101", 9999);

        // map操作,这里使用flatMap方法
        // map操作:将数据中的每一条文本,切分,然后转换成元组或POJO类
        // 这里定义一个POJO类
        // map:针对流中的每一个元素,输出一个元素
        // flatMap:针对流中的每一个元素,输出0个,1个或者多个元素
        // Collector是Flink的集合类型
        SingleOutputStreamOperator<WordWithCount> mappedStream = stream
                // 输入泛型:String;输出泛型:WordWithCount
                .flatMap(new FlatMapFunction<String, WordWithCount>() {
                    public void flatMap(String value, Collector<WordWithCount> out) throws Exception {
                        String[] arr = value.split(" ");
                        // 使用collect方法向下游发送数据
                        for (String s : arr) {
                            out.collect(new WordWithCount(s, 1L));
                        }
                    }
                });
        
        // 分组:shuffle
        KeyedStream<WordWithCount, String> keyedStream = mappedStream
                // 第一个泛型:流中元素的泛型
                // 第二个泛型:key的泛型
                .keyBy(new KeySelector<WordWithCount, String>() {
                    public String getKey(WordWithCount value) throws Exception {
                        return value.word;
                    }
                });

        // 累加,reduce操作
        // reduce会维护一个累加器,第一条数据到来,作为累加器输出
        // 第二条数据到来,和累加器进行聚合操作,然后输出累加器
        // 累加器和流中元素的类型是一样的
        SingleOutputStreamOperator<WordWithCount> result = keyedStream
                .reduce(new ReduceFunction<WordWithCount>() {
                    // 定义了聚合的逻辑
                    public WordWithCount reduce(WordWithCount value1, WordWithCount value2) throws Exception {
                        return new WordWithCount(value1.word, value1.count + value2.count);
                    }
                });

        // 输出
        result.print();

        // 执行程序
        env.execute("Socket stream word count");
    }

    // POJO类:模拟了case class
    // 1 必须是公有类
    // 2 所有字段必须是public
    // 3 必须有空构造器
    // Flink在执行程序时,需要通过反射来获取字段类型
    public static class WordWithCount{
        public String word;
        public Long count;

        public WordWithCount(){
        }

        public WordWithCount(String word,Long count){
            this.word = word;
            this.count = count;
        }

        @Override
        public String toString() {
            return "WordWithCount{" +
                    "word='" + word + '\'' +
                    ", count=" + count +
                    '}';
        }
    }
}

总结:数据流的来源是DataStreamSource,执行map操作之后,变为单输出流的算子SingleOutputStreamOperator,经过shuffle操作之后,变为一个键控流(按照key进行逻辑分区的流)KeyedStream,分组之后的流再聚合完成之后,发送给下游,流又变成单输出流SingleOutputStreamOperator,最后输出结果,执行程序。

flatMap是无状态的算子,而reduce是有状态的算子,reduce针对每一个单词,内部都会维护一个累加器,当重复发送数据时,相同的的单词会经过这样一个运算:reduce先将累加器的值读取出来,然后和输入的数据进行聚合,聚合完成后,写回到累加器,最后输出。

(2)从离线数据读取

修改读取数据部分代码

// 读取数据源
DataStreamSource<String> stream = env.fromElements("hello word", "hello word");

4 将程序提交到单点集群运行

解压下载好的安装包,解压缩,进入bin目录、启动集群,使用‘./start-cluster.sh’命令。

可在Flink中查看。

在这里插入图片描述

将程序打包,在flink网页端,点击上传新job,选择jar包,如果集群中包含程序运行的依赖,上传不带依赖的jar包,否则上传带依赖的jar包。

添加程序的入口类:

在这里插入图片描述

执行完成之后可以在Task Managers 的Stdoout中查看运行结果。

或者通过命令行的方式进行提交任务:

‘./flink run -c day01.Example2 /opt/module/flink-1.13.1/lib/flink2022tutorial-1.0-SNAPSHOT.jar’

执行完成之后同样可以在Task Managers 的Stdoout中查看运行结果。

停止集群:‘./stop-cluster.sh ’

查看日志文件:‘[hzy@hadoop101 log]$ cat flink-hzy-taskexecutor-0-hadoop101.out’

二 Flink运行架构

Flink 运行时由两种类型的进程组成:一个 JobManager (主节点)和一个或者多个 TaskManager(从节点)。

是一种典型的 Master-Slave 架构,Flink运行架构如下图:

在这里插入图片描述

1 Flink运行时组件

Flink运行时架构主要包括四个不同的组件,它们会在运行流处理应用程序时协同工作:作业管理器(JobManager)、资源管理器(ResourceManager)、任务管理器(TaskManager),以及分发器(Dispatcher)。

因为Flink是用Java和Scala实现的,所以所有组件都会运行在Java虚拟机上。每个组件的职责如下。

(1)作业管理器(JobManager)

控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobMaster所控制执行。

JobManager是一个主节点,每接收一个作业就会产生一个JobMaster。

JobManager会先接收到要执行的应用程序,这个应用程序会包括:作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其它资源的JAR包。

JobManager会把JobGraph转换成一个物理层面的数据流图,这个图被叫做“执行图”(ExecutionGraph),包含了所有可以并发执行的任务。

JobManager会向Flink的资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的任务插槽(slot)。

一旦它获取到了足够的资源,就会将执行图分(DAG)发到真正运行它们的TaskManager上。而在运行过程中,JobManager会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

作业管理器是一个主节点,是一个JVM进程,其内部存在的线程为:资源管理器,分发器和 JobMaster。

(2)资源管理器(ResourceManager)

主要负责Flink集群中资源的分配,对于Yarn来说,管理的资源是容器。Flink的资源管理器管理的资源是任务管理器(TaskManager)的插槽(slot),这是Flink集群中资源调度的单位。在上面两个例子中设置并行任务的数量为1,也就是需要1个任务插槽。

Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARN、Mesos、K8s,以及standalone部署。

当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。另外,ResourceManager还负责终止空闲的TaskManager,释放计算资源。

(3)分发器(Dispatcher)

可以跨作业运行,它为应用提交提供了REST接口(SpringBoot中处理get/post请求的接口就是REST接口)。分发器就是一个网页,也即前后端分离的一个服务。

当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobMaster。

由于是REST接口,所以Dispatcher可以作为集群的一个HTTP接入点,这样就能够不受防火墙阻挡。

Dispatcher也会启动一个Web UI( hadoop101:8081),用来方便地展示和监控作业执行的信息。

Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。

(4)JobMaster

JobMaster 负责管理单个 JobGraph 的执行。Flink 集群中可以同时运行多个作业,每个作业都有自己的JobMaster。

(5)任务管理器(TaskManager)

Flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制了TaskManager能够执行的任务数量。

启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给JobManager调用。

JobManager就可以向插槽分配任务(tasks)来执行了。在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。

2 任务提交流程

整体架构如下:

在这里插入图片描述

Flink是一个主从架构,主节点中有分发器,JobMaster,资源管理器,每接收一个作业就会产生一个JobMaster。

每一个任务管理器中都有N个任务插槽,至少一个,在进行任务提交时,主从节点会进行一些交流。

计算单元是从节点中的任务槽。

3 任务调度原理

任务调度流程如下:

在这里插入图片描述

客户端的代码在编译期(打包过程中,java程序首先编译成字节码文件,然后将这些字节码文件和一些依赖压缩成一个包)会进行优化,我们编写的程序就是一个有向无环图,对有向无环图优化成另一种数据结构(作业图),使用客户端将作业提交到JobManager。

Actor System是一种通信的并发设计模式,在这里特指akka通信组件,也就是说jar包是通过使用了akka通信组件将作业提交到JobManager,之后JobManger将作业部署到不同的TaskManger的时候,使用的也是Actor System。

TaskManger之间也会有数据流的通信,其会交换数据,典型的就是shuffle,使用的是netty,是一个并发性能很好的网络IO通信库。

从节点要固定给主节点发送Heartbeats(TCP包)。

客户端不是运行时和程序执行的一部分,但它用于准备并发送dataflow(JobGraph)给Master(JobManager),然后,客户端断开连接或者维持连接以等待接收计算结果。

当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给 JobManager,JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。

Client 为提交 Job 的客户端,可以是运行在任何机器上(与 JobManager 环境连通即可)。提交 Job 后,Client 可以结束进程(Streaming的任务),也可以不结束并等待结果返回。

JobManager 主要负责调度 Job 并协调 Task 做 checkpoint,职责上很像 Storm 的 Nimbus。从 Client 处接收到 Job 和 JAR 包等资源后,会生成优化后的执行计划,并以 Task 的单元调度到各个 TaskManager 去执行。

TaskManager 在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。从 JobManager 处接收需要部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt TCP网络编程基本教程

首先介绍一下TCP&#xff1a;&#xff08;Transmission Control Protocol 传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。相比而言UDP&#xff0c;就是开放式、无连接、不可靠的传输层通信协议。 下面&#xff0c;我一次进行客户端和服务器端…

STM32f103 SMO滑膜观测器的FOC驱动DIY

小时候玩航模了解到无刷电机&#xff0c;又从方波控制了解到FOC控制&#xff0c;在接触了一些开源项目的时候&#xff0c;感叹做的真好&#xff0c;不论是方波的还是Foc的启动都是那么丝滑&#xff0c;软件做的虽然好&#xff0c;但在这几年电机驱动芯片和部分型号的单片机价格…

【878. 第 N 个神奇数字】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 一个正整数如果能被 a 或 b 整除&#xff0c;那么它是神奇的。 给定三个整数 n , a , b &#xff0c;返回第 n 个神奇的数字。因为答案可能很大&#xff0c;所以返回答案 对 109 7 取模 后的值。 示…

亚马逊气候友好型承诺所有认证

【亚马逊气候友好型承诺所有认证】 亚马逊与广泛的外部认证合作&#xff0c;包括政府机构、非营利组织和独立实验室&#xff0c;以帮助我们区分更具可持续性的产品。亚马逊专注于信誉良好、透明且专注于保护自然世界的认证。我们将定期评估和重新评估认证环境&#xff0c;以确保…

若依框架的暴力破解漏洞

文章目录 漏洞描述漏洞复现修复建议漏洞描述 由于图片验证码未做好前后台的统一校验,可重复利用验证码,以及无登录错误次数限制等,导致攻击者可对账号与密码进行的穷举测试,从而获取网站登录访问权限 漏洞复现 第一步 抓包获取登录数据包,默认口令Admin123 第二步 发…

win10系统下使用openvino部署yolov5模型

文章目录前言一、环境1、硬件2、软件二、YOLO模型三、新建Qt项目1、pro文件2、main.cpp四、效果五、后记前言 上一篇介绍过使用onnxruntime实现模型推理部署&#xff0c;但在我的机器上视频效果仍不理想&#xff0c;本篇介绍使用openvino完成模型推理部署。   openvino是Inte…

Windows OpenGL ES 图像透明度

目录 一.OpenGL ES 图像透明度 1.原始图片2.效果演示 二.OpenGL ES 图像透明度源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 Open…

linux下gcc编程11-window下clion编译调试nginx+集成lua-nginx-module+安装开源x-waf

nginx模块 nginx作为项目的7层代理入口&#xff0c;对于http请求的过滤&#xff0c;如sql注入&#xff0c;xss攻击等过滤功能较弱&#xff0c;研究了下开源的一些waf&#xff0c;完全开源的https://github.com/xsec-lab/x-waf&#xff0c;利用lua来过滤请求&#xff0c;同时拥…

TuckER 论文笔记

Modeling Relation Paths for Representation Learning of Knowledge Bases- Introduction- Background- Algorithm- Experiment- Conclusion- CodeIvana Balazevic, Carl Allen, Timothy M.Hospedales - Introduction TuckERuckER是一个相对简单但功能强大的线性模型&#xf…

网络营销中 SEO 的作用

与其有时间去阅读各种SEO知识&#xff0c;不如多做一些实际的测试和练习。在百度官方发布的网页质量白皮书中&#xff0c;其实重点介绍了网页速度对SEO优化的影响&#xff0c;前面也出现了一种叫做闪电算法的算法&#xff0c;对于移动排名1.5秒内加载首屏即可打开的网页&#x…

2022亚马逊云科技re:Invent科创风尚,抢占下一个万亿赛道

新风向&#xff1a;重塑科技创投格局 面向未来增长&#xff0c;聚焦投资风向&#xff0c;演绎全新技术。11月28日至12月2日&#xff0c;2022亚马逊云科技re:Invent即将重磅来袭&#xff0c;在美国拉斯维加斯再度盛启。改变世界的全新云技术、不同领域的优选实践&#xff0c;都…

【仿真建模】第一课:AnyLogic入门基础教程 - 行人库入门讲解

文章目录一、AnyLogic介绍二、设置2.1 设置中文三、新建项目四、行人库介绍五、创建新行人六、切换3D视角七、增加墙八、行人密度图一、AnyLogic介绍 二、设置 2.1 设置中文 三、新建项目 四、行人库介绍 点击面板&#xff0c;选择第三个图标&#xff0c;就是行人库 行人库分…

react--编程式导航、antd的使用

编程式 1. 借助路由对象中的history 获取&#xff1a; this.props.history.push(/xx/xx) | this.props.history.replace(/xx/xx) 2. 传递sreach参数 this.props.history.push(/xx/xx?xxx100&xx111) 3. 传state参数 this.props.history.push(/xx,{id:1,title:…

web前端期末大作业 HTML+CSS+JavaScript仿唯品会购物商城网页设计实例 企业网站制作

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

ISO 5659-2塑料 烟生成 第2 部分:单室法测定烟密度试验方法

本标准适用于测定塑料燃烧时所产生烟雾的比光密度&#xff0c;并以最大比光密度为试验结果。它用于评定在规定条件下塑料的发烟性能。 ISO5659-2 建筑材料阻燃防火测试-标准名称&#xff1a; ISO 5659-2: 塑料&#xff0d;生烟性测定&#xff0d;第2部分&#xff1a;单烟箱光…

echarts看板效果图:流光折线图、3d柱状图、3d饼图

前言 现在展厅的大看板是越花里胡哨越好,不过真的挺难做的。好在可以百度找到一些大神的作品进行参考。 下面的内容都是基于echarts 5.3.3 和 vue3 。另外demo都是参考别人的案例。 流光折线图 效果图 代码 <template><div id="demo"></div&g…

从零开始学JAVA(01):配置Java运行环境、实现HelloWorld

一、下载安装JDK 1、下载安装 Oracle | Cloud Applications and Cloud Platform 2、验证&#xff08;控制太输入java、java-version、javac&#xff09; 二、 实现HelloWorld 1、下载 Sublime Text Sublime Text - Text Editing, Done Right 2、编写HelloWorld.java文件 …

数据恢复方法有哪些?如何恢复误删照片

数据恢复方法有哪些&#xff1f;电脑文件数据的误删除&#xff0c;基本每个人都遇到过。当我们还是一个电脑小白的时候&#xff0c;说实话这是非常让人崩溃的事情&#xff0c;不过不用担心&#xff0c;今天小编就以自己的亲身经历告诉大家几种比较好用的数据恢复方法。 删除的文…

PyTorch深度学习基础之Tensor对象及其应用的讲解及实战(附源码 简单易懂 包括分段 映射 矩阵乘法 随机数等等)

觉得有帮助请点赞关注收藏 有问题可评论区留言~~~ Tensor对象是一个维度任意的矩阵&#xff0c;但是一个Tensor中所有元素的数据类型必须一致。torch包含的数据类型和普遍编程语言的数据类型类似&#xff0c;包含浮点型&#xff0c;有符号整型和无符号整形&#xff0c;这些类型…

typora免费安装版教程,支持Windows、Mac、Linux

大家好&#xff0c;我是可乐&#xff0c;本篇文章为大家介绍 Typora快捷键、Typora免费安装教程。 Typora是一款简单易用的Markdown编辑器。 目前 Typora 官方是不提供免费版下载了&#xff0c;需要一次性购买版权&#xff0c;支持正版的可以直接前往官网购买&#xff0c;89 …