flink尚硅谷

flink

  • 1 flink基础使用
    • 1.1 角色
    • 1.2 部署模式(抽象)
      • 1.2.1 会话模式
      • 1.2.2 单作业模式
      • 1.2.3 应用模式
    • 1.3 运行模式(实际 谁来管理资源)
      • 1.3.1 Stand alone
      • 1.3.2 YARN运行模式(重点)
  • 2. 运行时架构
    • 2.1 系统架构
    • 2.2 核心概念
      • 2.2.1 并行度
      • 2.2.2 算子链
      • 2.2.2 任务槽
  • 3 DataStream api
    • 3.1 创建环境
    • 3.2 source 读取数据源【源算子】
    • 3.3 转换算子 transform
      • map
      • filter
      • flatmap
    • 3.4 聚合算子
      • keyby
      • sum/min/max/minby/maxby
      • reduce
      • richMapFunction
    • 3.5 分区
    • 3.6 分流、合流
    • 3.7 输出算子
  • 4. 窗口
    • 4.1 窗口分配器
    • 4.2 计算逻辑
      • 4.2.1 增量聚合
      • 4.2.2 全窗口聚合
      • 4.2.3 二者结合
    • 4.3 关于按照数量的滑动窗口辨析
    • 4.4 触发器和移除器
    • 4.5 窗口的实现细节
  • 5. 水位线 watermark(针对事件时间)
    • 5.1 关于窗口与水位线的正确理解
    • 5.2 水位线生成策略
    • 5.3 水位线的传递
    • 5.4 迟到数据处理
    • 5.5 window join
    • 5.6 interval join
    • 5.7 关于水位线生成-1ms
  • 6 处理函数 process算子
    • 6.1 定时器
    • 6.2 窗口处理函数
  • 7 状态管理
  • 8 容错机制

参考


1 flink基础使用

flink是一种分布式任务处理引擎

事件驱动:有数据来才进行处理,不来就不动。程序一旦开始就会一直运行

现在使用的是datastreamsource作为数据源
demo:

在这里插入图片描述
在这里插入图片描述

读socket这种无界流:

发送数据端:

在这里插入图片描述

flink端绑定一个无界数据源:

在这里插入图片描述

1.1 角色

三种角色:客户端、job manager、task manager

客户端提交job给job manager

在这里插入图片描述

1.2 部署模式(抽象)

1.2.1 会话模式

提前启动一个flink集群,一旦提交一个任务就交给这个集群做

在这里插入图片描述

1.2.2 单作业模式

不提前启动集群,一个作业提交了,为这个作业单独启动一个集群【每个作业都是隔离的,业务场景首选】
这种方式在flink1.17之后已经快要被淘汰了

在这里插入图片描述
需要注意的是,Flik本身无法直接这样运行,所以单作业模式一般需要借助一些资源管理框架来启动集群,比如YARN、Kubernetes(K8S)

1.2.3 应用模式

与(2)相比,代码在客户端解析==>代码在job manager解析,其余一致

在这里插入图片描述

1.3 运行模式(实际 谁来管理资源)

1.3.1 Stand alone

在这里插入图片描述

(1)通过会话模式部署:

在这里插入图片描述
(2)不支持单作业模式部署:

在这里插入图片描述

(3)通过应用模式部署

按照如下命令启动job manager
在这里插入图片描述
查看,发现应用模式部署成功

在这里插入图片描述
创建task manager:
在这里插入图片描述

1.3.2 YARN运行模式(重点)

在这里插入图片描述

可以通过三种部署模式实现YARN部署,区别在于起flink的指令参数不同

推荐应用模式部署

跟hdfs联合使用,先把文件传输到hdfs

2. 运行时架构

2.1 系统架构

在这里插入图片描述

客户端提交的一个job对应一个job master,job manager相当于进程,job master相当于线程
job manager中三大组件:分发器、job master、资源管理器
请求slot相当于请求资源
节点之间通过actor通讯系统进行沟通

2.2 核心概念

2.2.1 并行度

一个算子:指一种操作,比如sum/map/apply,每个操作都算是一个算子

keyby不算算子,只是一种转换操作

一个算子包含多个子任务:指一个算子的活让多个人去干,n个子任务干,并行度就叫n

一个流程的并行度是流程中每个步骤的并行度取max

默认并行度是cpu核数的二倍

2.2.2 算子链

在这里插入图片描述
上图中,每一列是一个算子,每个圆圈是一个任务

前置知识-算子之间的两种传输关系:
在这里插入图片描述
在这里插入图片描述

数据重分区可能是由并行度引起的,也可能是由keyby分组引起的(keyby导致数据重分区)

引入算子链:
在这里插入图片描述
并行度相同+一对一
在这里插入图片描述
在这里插入图片描述
针对某个算子前后禁用算子链:

在这里插入图片描述
从当前算子开始新链:

在这里插入图片描述

实际应用:两个重量级算子不应该串在一起,断开算子链还能帮助定位错误

2.2.2 任务槽

在这里插入图片描述
注意:slot大小是固定的,能够均分隔离内存,但是不能隔离cpu

在这里插入图片描述
一个 TaskManager 可以同时执行多个任务的子任务,这些子任务可以是不同的算子或操作符

不同算子的子任务才能处于同一个槽中,同一个槽里的三个任务同时进行,处理数据批次的进度不同

在这里插入图片描述

在这里插入图片描述
总结:

在这里插入图片描述

3 DataStream api

在这里插入图片描述

3.1 创建环境

StreamExecutionEnvironment.getExecutionEnvironment(conf)
自动分析是远程集群还是本地idea环境
最后触发执行:env.execute()执行当前flink job
如果想在一个main中执行多个job【不建议】:env.executeAsync() 异步执行获取结果

流处理:一直来一直处理;批处理:一批到全了开始处理

3.2 source 读取数据源【源算子】

// 从集合读
DataStreamSource sc = env.fromCollection(array);
//从文件读 依赖于FileSource
DataStreamSource sc = env.fromSource(source的实现类(FileSource build出来的),watermark,名字);
//从socket读数据
DataStream sc = env.socketTextStream("localhost", 7777);

从Kafka读:第三方件

3.3 转换算子 transform

map

一进一出

实现mapfunction接口

在这里插入图片描述

filter

对每个元素进行判断,true保留反之丢弃

实现filterfunction接口

在这里插入图片描述

flatmap

扁平映射,一进多出

实现flatmapfunction接口

在这里插入图片描述

辨析:与map区别:
map使用return控制一进一出
flatmap没有返回值 使用collector来收集输出

3.4 聚合算子

keyby

经过keyby才有后面的聚合算子,保证相同key发往同一个分区(即同一个子任务),但是不同key也可能在同一个分区

实现keySelector接口

keyby不是转换算子,因此不能设置并行度,只是对数据进行重分区

keyby之后得到keyedStream

在这里插入图片描述

sum/min/max/minby/maxby

keyby之后调用的

max:取比较字段最大值,非比较字段取第一次的值
maxby:取比较字段最大值,非比较字段取最大值字段所在数据行的数值

在这里插入图片描述

reduce

keyby之后调用的,输入输出类型需要保持一致,内部聚合逻辑比较灵活

reduce方法用于所有数据两两结合,前面累计的结果作为reduce函数的第一个参数,现在来的数据作为第二个参数

实现reduce Function接口

在这里插入图片描述

richMapFunction

为什么rich?多了生命周期管理方法,提供了子任务开启与关闭前的操作函数open、close,多了运行时上下文,获取运行时的环境信息

在这里插入图片描述

3.5 分区

分区算子 shuffle/rebalance(数据倾斜时使下游消费数据时是均匀的)/rescale(局部组队)

在这里插入图片描述
在这里插入图片描述
自定义分区器,自己实现分区逻辑:
在这里插入图片描述
在这里插入图片描述

简化后:

在这里插入图片描述

3.6 分流、合流

分流:将数字分为奇数流和偶数流

没有合适算子,就用最底层的process算子
在这里插入图片描述

数据分流逻辑需要依赖支流的tag,这样才能标记往哪里放:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

辨析:filter与分流方式的区别:前者几条流就要处理几遍,分流只需处理数据一遍

在这里插入图片描述

数据类型相同才能合流:

union合并多个流
在这里插入图片描述
connect合并两个流(工作场景常用)

在这里插入图片描述

可编辑程度更高的demo,多并行度的情况下必须结合keyby使用:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果多并行度下没有结合keyby,会导致应该关联在一起的记录没有分在同一个分区(子任务):

在这里插入图片描述

添加keyby操作:
在这里插入图片描述

3.7 输出算子

输出到文件:

在这里插入图片描述
在这里插入图片描述

红框为必须设置,文件滚动策略表示达到标准后文件就结束

输出到Kafka:

在这里插入图片描述
在这里插入图片描述
输出到MySQL:

在这里插入图片描述

自定义sink逻辑:

在这里插入图片描述
RichSinkFunction带来的open与close方法是子任务开启/关闭时调用的

4. 窗口

分类:时间窗口,计数窗口
滚动窗口(固定大小,窗口无重叠)、滑动窗口(可以重叠,设置滑动步长)、会话窗口(只能基于时间,指定时间内没有数据来,则当前窗口关闭)

4.1 窗口分配器

这里进行窗口的定义

在这里插入图片描述

经过keyby的窗口:每个key单开一个窗口
在这里插入图片描述
没有keyby的窗口,所有数据不分流,公用一个窗口:
在这里插入图片描述

在这里插入图片描述

窗口划分后的stream类型转换:

在这里插入图片描述

4.2 计算逻辑

4.2.1 增量聚合

reduce(强制输入类型、中间变量类型和输出类型全都保持一致):

demo:滚动窗口,5s一个

在这里插入图片描述
aggregate:(比reduce更灵活)

在这里插入图片描述

在这里插入图片描述

4.2.2 全窗口聚合

窗口内统一计算,可以获取上下文context

在这里插入图片描述

4.2.3 二者结合

在这里插入图片描述

既有增量(来一个处理一个节省空间)又有全量(上下文)

在这里插入图片描述

第一个参数是aggregateFunction(接口),第二个参数是processWindowFunction(接口)

在这里插入图片描述

4.3 关于按照数量的滑动窗口辨析

以长度为5步长为2的计数窗口举例:

每经过一个步长,都有一个窗口触发输出,第一次输出在第二条数据来的时候(想象前面有三个空数据)

在这里插入图片描述

第一条数据不代表是第一个窗口的起始,12两条数据是第一个窗口的结尾

4.4 触发器和移除器

触发器:

在这里插入图片描述

4.5 窗口的实现细节

在这里插入图片描述

5. 水位线 watermark(针对事件时间)

两种时间语义:事件时间&处理时间

水位线是插入到数据流中的一个标记,可以认为是特殊的数据。主要内容就是一个时间戳,用于表示当前事件时间的进展(必须单调递增)

watermark计算方式:当前最大事件时间 - 等待时间

参考

水位线的制作:

理想状态,数据量小,来一条生产一条水位线

数据量大,隔一段时间生成一个水位线

乱序流:

在这里插入图片描述
乱序+数据量小:

在这里插入图片描述
乱序+数据量大:

取当前数据中最大时间戳

在这里插入图片描述
乱序流+允许迟到:

eg. 窗口长度为10,允许迟到两秒,当第10秒生成的数据到来时并不会触发窗口的关闭,因为等待机制会将当前时间视为10-2=8
当第12秒生产的数据来的时候才会触发窗口关闭,因为等待机制下当前时间为12-2=10

5.1 关于窗口与水位线的正确理解

在这里插入图片描述
参考

某一时刻可能存在多个窗口桶,水位线是用于控制窗口的关闭的

5.2 水位线生成策略

在这里插入图片描述
有序流demo:
在这里插入图片描述

在这里插入图片描述

乱序流demo:有等待时间

在这里插入图片描述

也可以在数据源阶段就指定水位线

在这里插入图片描述

5.3 水位线的传递

当一个子任务上游有多个子任务(水位线各不相同,即数据处理进度各不相同),取上游子任务最小的水位线作为当前子任务的水位线,再广播给所有需要的下游

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
超过等待时间,则不把这个上游子任务的水位线作为当前水位线的min候选集

在这里插入图片描述

forMonotonousTimestamps() 只能有序数据,水位线也是升序的,没有等待时间
forBoundedOutOfOrderness(3) 允许乱序数据,设置等待时间

5.4 迟到数据处理

允许窗口晚关窗,晚到的数据额外处理,关窗后再来的数据不再处理:

在这里插入图片描述

辨析:window晚关窗和watermark等待有什么区别?
在这里插入图片描述

侧输出流(基于tag):

在这里插入图片描述

5.5 window join

合并两个流,将两条流的对应窗口内的内容两两合并

在这里插入图片描述

5.6 interval join

只支持事件时间语义

在这里插入图片描述

迟到数据处理逻辑:

在这里插入图片描述

在这里插入图片描述

5.7 关于水位线生成-1ms

乱序流中生成的水位线的时间戳,其实是当前数据中 最大时间戳 – 延迟时间 – 1ms

在这里插入图片描述

6 处理函数 process算子

是最底层算子,自由度最高

6.1 定时器

只有keyed之后的数据流才能定义定时器
在这里插入图片描述

  1. 注册定时器: 时间达到阈值后会触发指定事件。这个时间阈值可以是事件时间也可以是处理时间。同key定时器会去重。
    在这里插入图片描述

  2. 定义具体事件
    在这里插入图片描述

6.2 窗口处理函数

以topn问题为例:

在这里插入图片描述

  1. 方法一: 定义10s的事件滑动窗口(可重叠),滑动步长为5s+windowall全窗口函数(不能key分区)
    在这里插入图片描述
    自己实现处理所有窗口的接口
    在这里插入图片描述

  2. 方法二:使用keyedProcessFunction实现

增量计算+全量打标签

增量:来一个数据计算一次,三种类型可不同(输入类型,中间类型,输出类型)

AggregateFunction 是用于执行聚合操作的接口。它允许您定义如何将一个输入值序列聚合为一个输出值。

在这里插入图片描述

全窗口函数:处理窗口内的统计性结果

ProcessWindowFunction 会接收窗口中的所有元素,并允许您在窗口关闭时执行自定义的处理逻辑。
在这里插入图片描述
调用以上两个方法:
在这里插入图片描述

定义window内部处理函数:

在这里插入图片描述
process里放下面这个topn方法

KeyedProcessFunction 是窗口无关的,它是用于处理基于键控流的自定义处理函数

在这里插入图片描述

方法二总结:

在这里插入图片描述

7 状态管理

8 容错机制

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows 10安装 docker desktop

升级 windows 10 windows 10 升级到 20H2,如 20H2 19045.4291。 注意:需返回更新,重启计算机,确保更新完整。 bios 开启虚拟化 开启cpu虚拟化功能。 windows 启用功能 启用hyper-v 启用 wsl 安装 wsl https://learn.microso…

锁策略详解:互斥锁、读写锁、乐观锁与悲观锁、轻量级锁与重量级锁、自旋锁、偏向锁、可重入锁与不可重入锁、公平锁与非公平锁

一.锁策略 锁策略指的是在多线程编程中用于管理共享资源访问的规则和技术。它们确保在任何给定时间只有一个线程可以访问共享资源,以防止竞态条件和数据不一致性问题。常见的锁策略包括: 互斥锁(Mutex):最常见的锁类型…

导航app为什么知道还有几秒变绿灯?

在使用地图导航app行驶至信号灯的交叉路口时,这些应用程序会贴心地告知用户距信号灯变化还有多少秒,无论是即将转为绿灯还是红灯。这一智能化提示不仅使得驾驶员能适时做好起步或刹车的准备,有效缓解了因等待时间不确定而产生的焦虑情绪&…

活动预告|“AI+Security”系列第1期:大模型网络空间安全前沿探索活动火热报名中

由Wisemodel社区、安全极客主办的 “AISecurity”系列第1期: 大模型网络空间安全前沿探索 线下活动 将于2024年5月18日下午14:00 在苏州街16号神州数码大厦5层举行 本活动旨在汇聚业界专家和实践者共同探讨和推进AI自身安全、AI赋能安全与AI给安全带来的挑战等关…

Blender动画与云渲染:创造高质量作品的未来路径

Blender作为开源的3D图形软件,在多个领域广受欢迎。但随着项目复杂度提升,传统渲染方式受限。云渲染技术的兴起突破了这些限制,为创作者提供了更自由、高效的创作环境。 一、Blender动画项目的挑战 传统上,Blender动画渲染需要依…

【C语言】深度解析:动态内存管理的机制与实践

🔥引言 本篇将深度解析:动态内存管理的机制。为了更加灵活分配内存中的空间,库中为了我们提供了一些的函数,去动态开辟和释放堆上的空间。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 &a…

【Redis】Redis入门概述

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…

选择数据摆渡系统 哪个厂家比较好?

数据摆渡系统是一种用于在不同网络或安全域之间安全传输数据的技术解决方案。它通常用于解决网络隔离环境下的数据交换问题,确保数据在传输过程中的安全性、完整性和合规性。数据摆渡系统可以采用物理手段,如通过专用隔离硬件和私有安全协议,…

数据结构的二叉树(c语言版)

一.二叉树的概念 1.二叉树的基本概念 二叉树是一种常见的树状数据结构,它由若干个节点组成,这些节点通过边连接起来。每个节点最多可以有两个子节点,分别称为左子节点和右子节点。 二叉树的特点是每个节点最多有两个子节点,而且…

上海市青少年算法2023年12月月赛(丙组)试题解析

上海市青少年算法2023年12月月赛(丙组)试题解析 T1数砖数 题目描述 给定一种 22 规格的瓷砖,该瓷砖的式样为 ## .# 用这种瓷砖,从平面的左上角出发,将整个平面铺满,形如: 给定两个整数 n 与 m,请计算从左上角开始的 n 行 m 列的区域中,有多少格子是 #。 输入格式 第一…

易百纳与成都鼎桥达成战略合作,共创海鸥派生态新篇章

前言 易百纳技术社区(以下简称“易百纳”)与成都鼎桥通信技术有限公司(以下简称“成都鼎桥”)达成共建海鸥派的周边生态战略合作。基于海鸥派推出的鼎桥TD OS嵌入式发行版1.0,为海鸥派生态注入新的活力。 易百纳 Eba…

机器人增量学习研究综述

源自:控制与决策 作者:马旭淼 徐德 “人工智能技术与咨询” 发布 摘 要 机器人的应用场景正在不断更新换代,数据量也在日益增长.传统的机器学习方法难以适应动态的环境,而增量学习技术能够模拟人类的学习过程,使机器人能利用旧知识来加快新任务的…

数据分析处理的步骤是什么?制造业企业如何挑选数据分析处理软件?看这篇就够了

随着工业4.0的深入实施以及国家对制造业高质量发展战略的日益强调,工业数据已经崭露头角,成为生产经营活动中至关重要的核心要素。不仅如此,工业数据还作为优质的生产要素,为新兴生产力的形成提供了强有力的支撑,从而推…

docker自建GitLab仓库

摘要 GitLab 是一个功能强大的开源代码托管平台,它不仅提供了代码存储和版本控制的核心功能,还集成了项目管理、CI/CD 流水线、代码审查等企业级特性。本文将指导你如何在自己的服务器上搭建 GitLab 社区版,创建一个完全属于自己的开源仓库&…

Linux基础命令(续)

17,wc命令 作用:统计行数、单词数、字符个数 格式: wc 选项 文件 wc passwd 26 36 1159 passwd26:行数 36:单词数 1159:字符数 passwd:文件名wc autofs.conf 426 2604 15137 autofs.conf426…

某攻防演练心得之随笔记

最近太忙了,忙于各种奇奇怪怪的事情,有攻防,有应急,有渗透,还成为了一段时间内的“word高级工程师”......有师傅说我现在更新的越来越慢了,是呀,其实我也不知道怎么了,每天各种新闻…

用balenaEtcher烧录ubuntu的iso文件都失败,所以选用了另一种烧录的软件Rufus,然后烧录成功了+安装ubuntu的坑

https://releases.ubuntu.com/bionic/进入网页下载ubuntu 选择烧录软件将下载的Ubuntu烧录到U盘中 之前用这个U盘烧录过一次,成功了,后来应该是U盘受损或者是什么其他原因使得用这个U盘总是烧录失败 换思路:由于一直使用balenaEtcher烧录ubu…

《四月女友》开启预售 “不想错过”鼓励情侣找回消失的爱

电影《四月女友》由中国电影集团公司进口,中国电影股份有限公司发行、译制,改编自川村元气同名小说,山田智和导演,佐藤健、长泽雅美、森七菜主演。《四月女友》今日发布“不想错过”版预告,预告中,佐藤健饰…

【论文阅读笔记】HermesSim(Code is not Natural Language) (Security 24)

个人博客地址 HermesSim [Security 24] 论文:《Code is not Natural Language: Unlock the Power of Semantics-Oriented Graph Representation for Binary Code Similarity Detection》 仓库:https://github.com/NSSL-SJTU/HermesSim 提出的问题 二…

Pyhton专题学习资料包,Python从入门到精通全套学习资料[30G]

资源概览 百本Python学习书籍大礼包百本前端学习书籍大礼包微专业-数据挖掘分析之Python篇小甲鱼零基础入门学习Python(全96集) 资源获取 🧑‍💻【Pyhton专题资料】【30G】 百本Python书籍## 百本前端书籍 微专业-数据挖掘分析之Python篇 预备课【先…