Flink笔记

Flink笔记

  • 2.Flink学习笔记
    • 2.1流式处理对比
    • 2.2 Flink核心概念
      • 2.2.1并行度
      • 2.2.2算子链
      • 2.2.3任务槽
    • 2.3 DataStream
      • 2.3.2 读取数据源-源算子(Source)
      • 2.3.3 转换算子(Transformation)

2.Flink学习笔记

2.1流式处理对比

学习Spark Streaming后对实时处理有了浅显的认识,Flink主要也是用来做实时计算的,不过两者对实时计算的处理方式有所不同。
![在这里插入图片描述](https://img-blog.csdnimg.cn/bd546e6f132047d0b88247c97679f8a5.png
图2.1 Spark Streaming的微批处理
Spark Streaming是微批处理,根据时间将数据流划分为很小的数据集合再进行批处理。
在这里插入图片描述

图2.2 Flink的流式处理
而Flink是流处理,以一个事件为单位划分计算,是标准的流执行模式。

2.2 Flink核心概念

在这里插入图片描述

图2.3 Flink的运行过程
JobManager:JobManager是Flink集群中任务管理和调度的核心,是控制应用执行的主进程。
包含3个的组件:JobMaster负责处理单独的作业(Job)、ResourceManager主要负责资源的分配和管理、Dispatcher用来提交应用,并且负责为每一个新提交的作业启动一个新的JobMaster 组件。
TaskManager:TaskManager是Flink中的工作进程,数据流的具体计算就是它来做的。

在这里插入图片描述

图2.4 数据流并行视图

2.2.1并行度

在Flink执行过程中,每一个算子可以包含一个或多个子任务,这些子任务在不同的线程、不同的物理机或不同的容器中完全独立地执行。一个特定算子的子任务的个数被称之为其并行度。可以在算子后跟着调用setParallelism()方法,来设置当前算子的并行度。

2.2.2算子链

一个数据流在算子之间传输数据的形式可以是: 1、一对一的直通模式,数据流维护着分区以及元素的顺序,这种关系类似于Spark中的窄依赖。2、也可以是打乱的重分区模式,数据流的分区会发生改变,每一个算子的子任务,会根据数据传输的策略,把数据发送到不同的下游目标任务。类似于Spark中的shuffle。
合并算子链:在Flink中,并行度相同的一对一(one to one)算子操作,可以直接链接在一起形成一个“大”的任务,这样原来的算子就成为了真正任务里的一部分。每个task会被一个线程执行。这样的技术被称为“算子链”。
在这里插入图片描述
图2.5 合并算子链
将算子链接成task是非常有效的优化:可以减少线程之间的切换和基于缓存区的数据交换,在减少时延的同时提升吞吐量,Flink默认会按照算子链的原则进行链接合并。

2.2.3任务槽

为了控制并发量,我们需要在TaskManager上对每个任务运行所占用的资源做出明确的划分,就是任务槽。每个任务槽表示TaskManager拥有计算资源的一个固定大小的子集。这些资源就是用来独立执行一个子任务的。
在这里插入图片描述
图2.6 任务槽slot共享
当我们将资源密集型和非密集型的任务同时放到一个slot中,它们就可以自行分配对资源占用的比例,从而保证最重的活平均分配给所有的TaskManager。slot共享还有一个好处就是允许我们保存完整的作业管道。这样一来,即使某个TaskManager出现故障宕机,其他节点也可以完全不受影响,作业的任务可以继续执行。

2.3 DataStream

DataStream API是Flink的核心层API。一个Flink程序其实就是对DataStream的各种转换。DataStream的执行主要分为4步:获取执行环境、读取数据源、转换操作、输出。
在这里插入图片描述
图2.7 DataStream的四大构成部分
2.3.1 获取执行环境Environment
1、创建执行环境StreamExecutionEnvironment:
1)getExecutionEnvironment:会根据当前运行的上下文直接得到正确的结果:如果程序是独立运行的,就返回一个本地执行环境;如果是创建了jar包,然后从命令行调用它并提交到集群执行,那么就返回集群的执行环境。该方法会根据当前运行的方式,自行决定该返回什么样的运行环境。
2)createLocalEnvironment:本地执行环境
3)createRemoteEnvironment:集群执行环境
2、执行模式:
1)流执行模式(Streaming):这是DataStream API最经典的模式,一般用于需要持续实时处理的无界数据流。
2)批执行模式(Batch):专门用于批处理的执行模式。
3)自动模式(AutoMatic):在这种模式下,将由程序根据输入数据源是否有界,来自动选择执行模式。
1.StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
2.env.setRuntimeMode(RuntimeExecutionMode.BATCH);
3.env.execute();

2.3.2 读取数据源-源算子(Source)

Flink可以从各种来源获取数据,然后构建DataStream进行转换处理。
1.从集合中读取数据:
1.List data = Arrays.asList(1, 22, 3);
2.DataStreamSource ds = env.fromCollection(data);

2.从文件读取数据:
1.FileSource fileSource = FileSource.forRecordStreamFormat(new TextLineInputFormat(), new Path(“input/word.txt”)).build();
2.env.fromSource(fileSource,WatermarkStrategy.noWatermarks(),“file”).print();

3.从Socket读取数据:
1.DataStream stream = env.socketTextStream(“localhost”, 7777);

4.从Kafka读取数据:
1.KafkaSource kafkaSource = KafkaSource.builder()
2. .setBootstrapServers(“hadoop102:9092”)
3. .setTopics(“topic_1”)
4. .setGroupId(“atguigu”)
5. .setStartingOffsets(OffsetsInitializer.latest())
6. .setValueOnlyDeserializer(new SimpleStringSchema())
7. .build();
8.DataStreamSource stream = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), “kafka-source”);
9.stream.print(“Kafka”);

2.3.3 转换算子(Transformation)

1)基本转换算子:
1.map:主要用于将数据流中的数据进行转换,形成新的数据流。
2.filter:对数据流执行一个过滤,判断为true则元素正常输出,若为false则元素被过滤掉
3.flatMap:将数据流中的整体(一般是集合类型)拆分成一个一个的个体使用。
2)聚合算子:
1.keyBy:分区操作,keyBy通过指定键key,可以将一条流从逻辑上划分成不同的分区。基于不同的key,流中的数据将被分配到不同的分区中。
2.sum/min/max/minBy/maxBy:在输入流上,对指定的字段做叠加求和、求最小值、求最大值。
3.reduce:归约聚合reduce可以对已有的数据进行归约处理,把每一个新输入的数据和当前已经归约出来的值,再做一个聚合计算。
3)用户自定义函数(UDF):
用户可以根据自身需求,重新实现算子的逻辑。用户自定义函数分为:函数类、匿名函数、富函数类。
1.函数类(Function Classes):Flink暴露了所有UDF函数的接口,具体实现方式为接口或者抽象类,例如MapFunction、FilterFunction、ReduceFunction等。用户可以自定义一个函数类,实现对应的接口。
2.富函数类(Rich Function Classes):所有的Flink函数类都有其Rich版本。不同于函数类,富函数类可以获取运行环境的上下文,并拥有一些生命周期方法,所以可以实现更复杂的功能。open()方法,是Rich Function的初始化方法,会开启一个算子的生命周期。当一个算子如map()或filter()方法被调用之前,open()会首先被调用。close()方法,是生命周期中的最后一个调用的方法,类似于结束方法,用来做一些清理工作。
4)物理分区算子:
物理分区算子可以提高计算作业的并行处理性能,实现负载均衡,有效管理任务的状态。
1.随机分区shuffle:将数据随机地分配到下游算子的并行任务中去。
2.轮询分区rebalance:按照先后顺序将数据做依次分发。
3.重缩放分区rescale:底层也是使用轮询分区算法进行分区,但是只会将数据轮询发送到下游并行任务的一部分中,发牌人只给自己团体内的所有人轮询分区。
4.广播broadcast:广播之后,数据会在不同的分区都保留一份,可能进行重复处理。
5)分流操作:
将一条数据流拆分成完全独立的两条、甚至多条流。基于一个DataStream,定义一些筛选条件,将符合条件的数据拣选出来放到对应的流里。
6)合流操作:
将来源不同的多条流的数据进行联合处理。
1.Union(联合):数据类型必须相同,合并之后的新流会包括所有流中的元素,数据类型不变。
2.Connect(连接):为了处理更加灵活,连接操作允许流的数据类型不同。链接之前,每个链接流内部仍保持各自的数据形式不变,彼此之间是相互独立的。要想得到新的DataStream,需要进一步定义一个“同处理”转换操作,用来说明对于不同来源、不同类型的数据,分别进行处理转换、得到统一的输出类型。

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

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

相关文章

ubuntu22.04上如何创建有privilege权限,有固定自定义IP的空容器

需求背景: 我想用docker来隔离自己的主机环境,来创建一个隔离的空白全新的开发环境,并且使之有固定的IP,在里面可以自由更新下载各种编译依赖,具有privileged权限的容器,以下是操作实现的具体步骤 查看do…

1.12 springboot 整合log4j打印日志

1.除去springboot自带的日志 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><!-- 除去springboot自带的日志 --><exclusion><groupId>org.sprin…

在vscode中运行Hbuilder创建的项目

想必习惯使用vscode的人突然使用HBuilder很不习惯吧&#xff0c;但是HBuilder创建的项目本身没有调试功能。当你有一个app项目但又不想使用HBuilder编写&#xff0c;需要浏览器调试的时候&#xff0c;你这时就需要一个插件了&#xff1a;uni run 插件 基于HBuilderX的采用unia…

JVM运行时区域——对象创建内存分配过程

新创建的对象&#xff0c;都存放在伊甸园区域&#xff0c;当垃圾回收时&#xff0c;将伊甸园区域的垃圾数据销毁&#xff0c;然后将存活的对象转移到幸存者0区域&#xff0c;之后创建的新的对象还是存放在伊甸园区域&#xff0c;等到再次垃圾回收后&#xff0c;将伊甸园区域和幸…

Aurix TC3xx系列MCU ADC采集时间计算方法(四)

文章目录 1 前言2 各阶段时间的计算方法2.1 计算公式2.2 采样阶段2.3 转换阶段2.4 降噪阶段2.5 校准阶段3 采集时间示例>>返回总目录<< 1 前言 在项目开发前期评估阶段,会比较关注ADC的采集时间,我们可以给出一个大概的采样的时间0.5us~1.2us左右,但是对于精确…

SpringCloud nacos 集成 feign 实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

创建型设计模式-4.原型设计模式

创建型设计模式-4.原型设计模式 原型设计模式&#xff08;Prototype Design Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在通过复制现有对象来创建新对象&#xff0c;而不是通过使用构造函数进行创建。它允许我们通过克隆&#xff08;复制&#xff09;现有对象的实…

【C++】开源:跨平台轻量日志库easyloggingpp

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍跨平台轻量日志库easyloggingpp。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&am…

【SQL应知应会】表分区(四)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分区表 • MySQL版 前言一、分区表1.非分区表2.分区…

Spring MVC异步上传、跨服务器上传和文件下载

一、异步上传 之前的上传方案&#xff0c;在上传成功后都会跳转页面。而在实际开发中&#xff0c;很多情况下上传后不进行跳转&#xff0c;而是进行页面的局部刷新&#xff0c;比如&#xff1a;上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。 1.1 JSP页面 …

centos7 访问windows系统的共享文件夹

window系统上共享文件夹 选择共享文件夹&#xff0c;点击属性 点击共享 选择用户&#xff0c;点击共享 centos系统挂载共享文件夹 创建挂载目的文件夹 mkdir -p /mnt/smb 挂载命令 mount -t cifs -o usernamezenglg,password*** //192.168.1.10/ftp /mnt/smb/其中&#xff…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 18 日论文合集)

文章目录 一、分割|语义相关(14篇)1.1 Multimodal Diffusion Segmentation Model for Object Segmentation from Manipulation Instructions1.2 Variational Probabilistic Fusion Network for RGB-T Semantic Segmentation1.3 Dense Affinity Matching for Few-Shot Segmentat…

Spring MVC拦截器和跨域请求

一、拦截器简介 SpringMVC的拦截器&#xff08;Interceptor&#xff09;也是AOP思想的一种实现方式。它与Servlet的过滤器&#xff08;Filter&#xff09;功能类似&#xff0c;主要用于拦截用户的请求并做相应的处理&#xff0c;通常应用在权限验证、记录请求信息的日志、判断用…

二十四章:SEgmentation TRansformer (SETR)——以Transformer的序列到序列的视角重新思考语义分割问题

0.摘要 最近的语义分割方法采用了全卷积网络&#xff08;FCN&#xff09;和编码器解码器架构。编码器逐渐降低空间分辨率&#xff0c;并学习具有更大感受野的抽象/语义视觉概念。由于上下文建模对于分割是至关重要的&#xff0c;最新的研究工作将重点放在增加感受野上&#xff…

Upgrading kubeadm clusters from v1.27.3 to v1.27.4

文章目录 1. Before you begin2. Notes3. Master3.1 Login into the first node and upgrade the kubeadm tool only3.2 Verify the upgrade plan3.3 Drain the control plane node3.4 kubeadm upgrade3.5 Uncordon the control plane node3.6 Upgrade kubelet and kubectl3.7 …

自然语言处理: 第五章Attention注意力机制

自然语言处理: 第五章Attention注意力机制 理论基础 Attention&#xff08;来自2017年google发表的[1706.03762] Attention Is All You Need (arxiv.org) &#xff09;&#xff0c;顾名思义是注意力机制&#xff0c;字面意思就是你所关注的东西&#xff0c;比如我们看到一个非…

【计算机组成原理】24王道考研笔记——第二章 数据的表示和运算

第二章 数据的表示和运算 一、数值与编码 1.1 进制转换 任意进制->十进制&#xff1a; 二进制<->八进制、十六进制&#xff1a; 各种进制的常见书写方式&#xff1a; 十进制->任意进制&#xff1a;&#xff08;用拼凑法最快&#xff09; 真值&#xff1a;符合人…

嵌入式软件和硬件的安全性:保护连接世界的数字盾牌

引言&#xff1a; 随着嵌入式系统的广泛应用和物联网的快速发展&#xff0c;嵌入式软件和硬件的安全性问题越来越引起人们的关注。安全性是确保嵌入式系统能够抵御恶意攻击和数据泄露的关键。本文将深入探讨嵌入式软件和硬件的安全性问题&#xff0c;包括技术原理、应用场景、学…

Edge 中比较独特的调试技巧

背景 大家日常开发基本都会使用 Chrome&#xff0c;毕竟确实好用。但是基于 Chromium 的新版 Microsoft Edge 已于 2020 年 1 月 15 日发布。 Edge 目前的使用基本跟 Chrome 差不多了&#xff0c;但显然&#xff0c;Edge 团队不仅仅想当 Chrome 的备用。他们也提供了一些特有…

【C++】-模板进阶(让你更好的使用模板创建无限可能)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …