Flink笔记

news2024/11/27 7:37:46

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,需要进一步定义一个“同处理”转换操作,用来说明对于不同来源、不同类型的数据,分别进行处理转换、得到统一的输出类型。

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

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

相关文章

Django设置权限管理

目录 整体思路 1.使用django自带的后台功能添加组和用户 启动django服务后,在Django终端添加一个账号 在网页上输入网址,跳转到登录页面 Groups 新增组,设置组的名字,对应的权限Save即可 Users 将用户绑定组或单独设置权限 2.用…

arm-day2

汇编实现三个灯循环点亮 .text .global _start _start: /**********LED1点灯**************/ RCC_TNIT:ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x1 << 4)orr r1,r1,#(0x1 << 5)str r1,[r0]LED_TNIT:ldr r0,0x50006000ldr r1,[r0]and r1,r1,#(~(0x3 << 20…

珠海市黄杨山之旅游

西湾村 早上6点半出门&#xff0c;买点五人份的早餐 A点 第一个点&#xff0c;冲 C点 D岛 到d点休息 B点 高度&#xff1a;229米 到这里有人吐了&#xff0c;建议早餐不要吃超过三个包子&#xff08;他吃了四个包子&#xff0c;1个鸡蛋&#xff0c;1个火腿&#xff09; 记…

linux高并发web服务器开发(web服务器)18_函数解析http请求, 正则表达式,sscanf使用,http中数据特殊字符编码解码

pdf详情版 01 学习目标 编写函数解析http请求 ○ GET /hello.html HTTP/1.1\r\n ○ 将上述字符串分为三部分解析出来编写函数根据文件后缀&#xff0c;返回对应的文件类型sscanf - 读取格式化的字符串中的数据 ○ 使用正则表达式拆分 ○ [^ ]的用法通过浏览器请求目录数据 ○…

Window环境RabbitMq搭建部署

Erlang下载安装及配置环境变量 下载erlang&#xff0c;原因在于RabbitMQ服务端代码是使用并发式语言Erlang编写的 Erlang下载 Erlang官网下载&#xff1a; http://www.erlang.org/downloads Erlang国内镜像下载&#xff08;推荐&#xff09;&#xff1a; http://erlang.org/d…

mysql主从复制(主-从-从)

文章目录 一、前期环境准备二、主库配置1.设置server-id值并开启binlog参数2.建立同步账户并给上权限3.查看主库状态4.锁表设置只读5.备份数据库数据 三、从库配置1.设置server-id值并开启binlog参数2.还原从主库备份数据3.设定从主库同步4.启动从库同步开关 四.测试1.在主库上…

力扣 -- 121. 买卖股票的最佳时机

题目&#xff1a; 题目链接&#xff1a;121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 解题步骤&#xff1a; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。说明&#xff1a;以下这种方法并…

【动态规划part02】| 62.不同路径、63.不同路径||

目录 &#x1f388;LeetCode 62.不同路径 &#x1f388;LeetCode 63. 不同路径 II &#x1f388;LeetCode 62.不同路径 链接&#xff1a;62.不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向…

jQuery基本介绍和 DOM 对象互相转换

文章目录 jQuery基本介绍和 DOM 对象互相转换基本介绍jQuery 的原理示意图JQuery 基本开发步骤说明:jQuery简单示例 jQuery 对象和 DOM 对象什么是 jQuery 对象DOM 对象转成 jQuery 对象应用实例 jQuery 对象转成 DOM 对象代码演示 jQuery基本介绍和 DOM 对象互相转换 基本介绍…

设计模式篇---工厂方法(可通过lambda实现)

文章目录 概念结构实例通过lambda实现总结 概念 工厂方法模式&#xff1a;定义一个用于创建对象的接口&#xff0c;但是让子类决定将哪个类实例化。工厂方法模式让一个类的实例化延迟到其子类。 这个模式还是比较好理解&#xff0c;且使用场景比较频繁。简单工厂是只有一个工厂…

使用 Vue 创建一个简单的 Loading 动画

使用 Vue 创建一个简单的 Loading 动画 1. 开始之前 确保 正确安装了 Vue 3知道如何启动一个新的 Vue 项目&#xff08;或在项目中使用Vue&#xff09;了解 Vue 3 的 Composition API&#xff08;本文将使用&#xff09; 2. 设计组件 该组件应该包含三个部分 控制逻辑旋转…

Centos7:Flask-Apache部署

系列文章目录 RHCE第0章&#xff1a;RHCE开始前的准备 RHCE第1章&#xff1a;Web服务器&#xff08;上&#xff09; RHCE第1章&#xff1a;Web服务器&#xff08;下&#xff09; RHCE第2章&#xff1a;DNS服务 RHCE第3章&#xff1a;DHCP服务器 RHCE第4章&#xff1a;Firewall…

Tensorflow无人车使用移动端的SSD(单发多框检测)来识别物体及Graph的认识

环境是树莓派3B&#xff0c;当然这里安装tensorflow并不是一定要在树莓派环境&#xff0c;只需要是ARM架构就行&#xff0c;也就是目前市场上绝大部分的嵌入式系统都是用这套精简指令集。 在电脑端的检测&#xff0c;有兴趣的可以查阅SSD(Single Shot MultiBox Detector)系列&a…

SpringCloudAlibaba微服务实战系列(四)Sentinel熔断降级、异常fallback、block细致处理

SpringCloudAlibaba Sentinel降级和熔断 接着上篇文章的内容&#xff0c;在Sentinel中如何进行降级和熔断呢&#xff1f; 熔断降级规则 降级规则 在Sentinel中降级主要有三个策略&#xff1a;RT、异常比例、异常数&#xff0c;也是针对某个资源的设置。而在1.8.0版本后RT改为…

python post请求编码问题

在日常的python使用中&#xff0c;必不可少的就是爬虫相关的知识。 爬虫也常会遇到一个问题&#xff0c;即就是编码的问题。 如下&#xff1a; 通过抓包可以看到额&#xff0c;实际python提交的参数为&#xff0c;如下格式&#xff1a; 那这种的签名必不可能通过&#xff0…

FPGA实现串口回环

文章目录 前言一、串行通信1、分类1、同步串行通信2、异步串行通信 2、UART串口通信1、UART通信原理2、串口通信时序图 二、系统设计1、系统框图2.RTL视图 三、源码1、串口发送模块2、接收模块3、串口回环模块4、顶层模块 四、测试效果五、总结六、参考资料 前言 环境&#xff…

【框架篇】Spring Boot核心介绍及项目创建(详细教程)

Spring Boot介绍及项目创建 一&#xff0c;Spring Boot 核心介绍 Spring Boot 是基于 Spring 开发的一种轻量级的全新框架&#xff0c;不仅继承了 Spring 框架原有的优秀特性&#xff0c;而且还通过简化配置来进一步简化了 Spring 应用的整个搭建和开发过程。通过Spring Boot&…

NO.453 最小操作次数使数组元素相等

题目 给你一个长度为 n 的整数数组&#xff0c;每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。 思路 本题要求&#xff0c;获取最小操作次数&#xff0c;即在满足所有元素均相等的情况下&#xff0c;操作次数最少。 由于本题无法确定最终元素…

火车头采集器伪原创插件【php源码】

火车头采集是一款基于Python语言开发的网络爬虫工具&#xff0c;用于快速高效地从互联网上采集数据并存储到本地或远程数据库。它简单易用且功能强大&#xff0c;在各行各业广泛应用。 火车头采集器AI伪原创PHP源码&#xff1a; <?php header("Content-type: text/h…

(四)springboot实战——springboot的事件与监听器原理

前言 本节内容是关于springboot的一些核心原理的总结&#xff0c;包括springboot的事件原理、生命周期流程、事件触发流程等核心内容的介绍&#xff0c;从而帮助我们更好的理解与使用springboot&#xff0c;这里只做概念性的内容总结&#xff0c;实战的部分请关注作者后续博客…