Flink-串讲面试题

1. 概念

 

有状态的流式计算框架

可以处理源源不断的实时数据,数据以event为单位,就是一条数据。

2. 开发流程

先获取执行环境env,然后添加source数据源,转换成datastream,然后使用各种算子进行计算,使用sink算子指定输出的目的地,最后调用execute方法执行。

3. flink运行模式

  1. standalone
  2. yarn
  3. k8s

4. flink部署模式(yarn)

  1. session
    1. 先启动集群,再提交job到集群
  2. per-job
    1. 一个job启动一个集群
  3. aplication
    1. 一个job启动一个集群

per-job和application区别:

  • 提交代码位置不一样,单作业模式的main方法在客户端执行,应用模式的main方法在JobManager执行

应用模式是生产上主要提交模式,单作业模式和应用模式都是一个job启动一个集群,所以可以做到资源隔离,而会话模式是多个job分享一个集群,适合小作业共享。

5. 运行时架构

  1. Client
    1. 解析代码,提交作业
  2. JobManager

    1. 管理节点,任务切分分配

    2. dispatcher:将job传递给Jobmaster

    3. resourManager:申请资源

    4. JobMaster:切分任务

    5. Checkpointcoordinator:向数据源注入barrier

  3. TaskManager

    1. 执行任务计算 

    2. 资源最小单位slot ,算子就是我们task任务

6. 基本概念

6.1.task和subtask区别?

一个算子(map,filter,flatmap)就是一个task

算子并行子任务就是subtask 

6.2 task和slot的关系

一个task的子任务不能在一个slot中执行

一个slot中可以执行不同算子的subtask

6.3 并行度的优先级

算子 > 全局env  > 提交命令行  >   配置文件

6.4 算子链路的合并

多个subtask组成一个大的subtask

条件:

  1. 前后算子的并行度一致
  2. forward(数据分区规则)
  3. subtask必须在一个共享槽(.slotSharingGroup("default"), 在一个slot槽中执行)

算子合并优点和缺点 ?

  1. 优点
    1. 节省数据传输IO
  2. 缺点
    1. 如果有subtask计算逻辑复杂会有抢占资源问题

如何禁用算子链?

env.disableOperatorChaining()

如何设置不同的共享槽?

.slotSharingGroup("aa")

6.5 流图转化

产生发送做了什么事情
StreamGraphClientClient代码解析
JobGraphClientJM算子链的合并
ExecutionGraphJMTM并行子任务显示
物理执行图

6.6 per-job模式提交作业流程

  1. 客户端提交代码,解析参数 生成StreamGraph
  2. 由StreamGraph生成jobGraph,主要是做了算子链合并
  3. 封装参数 提交给集群yarn 的RM
  4. yarn找一个NM,启动JM
  5. 启动dispatcher,RM,Jobmaster,生成executionGraph
  6. 向JM的RM申请资源,然后去找Yarn的RM申请资源,创建TM启动slot 
  7. 注册slot,分配任务

7. API

7.1 source

kafkasource(算子状态,保存offset) 

7.2 transform

  1. 单流:map,flatmap,filter
  2. keyby :sum, min, max ,reduce 
  3. 侧输出流
  4. 物理分流算子:shuffle,forwawrd,rebalance(默认),rescale
  5. union(类型要求一致)  connect(可以不一致)

7.3 sink

kafkasink,dorissink, jdbcsink, filesink 

7.4 join

  1. API
    1. windowjoin
    2. interval join :两条实时流去根据范围关联,如果一些迟到特别久的数据关联不上
  2. SQL
    1. 常规join(比如left join ,支持回撤流)
    2. lookupjoin:读取外部系统数据,可以缓存, 适用于数据量小,而且基本不变化的表(比如字典表)
    3. interval join
    4. window tvf函数 :累积函数,滚动,滑动

8. 时间语义

  1. 事件时间:业务数据推动,获取数据中时间戳,推进时间
  2. 处理时间:获取操作系统时间
  3. 摄入时间:数据进入到flink集群的系统时间
  • 共同点
    • 时间不能倒退,单调递增 
  • 区分
    • (处理时间)速度稳定,不能停滞 
    • (事件时间)速度不稳定,可能会停滞

9. WaterMark

9.1 你对watermakr的理解

逻辑时钟,单调递增,解决乱序迟到问题

9.2 水位线传递

  • 一对多:广播水位线
  • 多对一:取最小
  • 多对多:先广播,再取最小

场景题:上游算子发生数据倾斜,某一个subtask没有数据,水位线无法抬升怎么办?

解决办法:
            调用withIdleness()方法,如果某一个subtask没有数据,超过了空闲等待时间,那么放弃使用这个subtask的水位线。

9.3 迟到数据问题如何解决?

  1. 设置乱序时间:针对于迟到时间短的数据
  2. 窗口延迟关闭:迟到中级
  3. 侧输出流:迟到特别长

9.4 水位线注入规则

当前最大时间戳 - 乱序时间  - 1ms

10. 窗口

概念:无界流切分为有界流, 集合中是一个个的桶

10.1 分类

  1. 滑动
  2. 滚动
  3. 会话:按照时间间隔划分窗口

10.2 四大组成

  1. assigner:分配器
  2. trigger :触发窗口计算
  3. evictor:驱逐器,清除窗口数据
  4. 聚合逻辑:增量聚合, 全量聚合(reduce    aggregate)

场景问题:表的字段有mid  timestamp  price   ,要求算当前累积GMV, 5分钟输出一次

解决方案:

  1. 第1种方案:windowtvf函数 Cumulate Windows
  2. 第2种方案:用滚动窗口 1天  ,实现ContinuousEventTimeTrigger,自定义每5分钟输出一次

10.3 核心概念

划分(数据属于哪个窗口)

开一个5s滚动窗口  数据是3s  会落到哪个窗口:0-5   3-8 

结论:窗口的向下取整
                timestamp - (timestamp - offset) % windowSize

生命周期

创建:属于窗口第一条数据到来

销毁:事件时间 >= 窗口长度 +允许迟到时间

左闭右开

        endtime -1ms

10.4 设置乱序时间 和窗口延迟关闭时间 有什么区别?

5s滚动窗口   乱序时间设置2s   销毁时间5s  (7s数据过来时候,时间推进到5s)

5s滚动窗口   窗口延迟关闭2s   销毁时间7s   (7s数据过来时候,时间推进到7s)

结论:

设置乱序时间,并不会影响窗口销毁时间,影响时间推进规则,窗口延迟关闭时间影响窗口的关闭时间。

举个栗子:

10s滚动窗口,设置乱序时间5s,窗口延迟关闭时间5s 

窗口销毁:水位线15s时候销毁, 数据携带20s及以上过来触发窗口销毁

11. 状态

概念:用户定义的一些变量 

状态数据是交由Flink托管的,考虑程序数据的恢复 

11.1 分类

  1. 算子状态:每个subtask
    1. list:恢复状态时候轮询
    2. unionlist:广播
  2. 键控状态:每个key去维护的状态
    1. value  map  list  reduce  aggregate 

11.2 状态后端

本地远端
hashmapTM堆内存hdfs
rocksdbrocksdbhdfs

使用场景:rocksdb存储数据量级别比hashmap大

11.3 状态后端场景选择

企业中大状态场景选用的rocksdb  ,大状态场景优化

举个例子:

用户新老访客修复  1000w用户    1k      ≈  10G

rocksdb支持:增量检查点  、 本地恢复 、预定义选项

11.4 TTL

状态的过期时间是由哪个类设置的:

StateTttlConfig

12. 容错机制

12.1 端到端一致性 (kafka  flink   kafka)

源头:offset可重发

Flink:checkpoint

sink:事务(2pc 预写日志) 幂等 

12.2 checkpoint流程

  1. JM的checkpoint协调器发送命令startcheckpint开始
  2. 定期向数据源注入barrier (特殊事件,不会跳过数据向下游发送)
  3. barrier随数据流过每个subtask 
  4. barrier到每个算子,将本地状态快照到hdfs文件系统,快照完之后acks应答(barrier之前的数据已经进入kafka,预提交)
  5. JM中协调器收到所有算子的acks,标志所有快照做完,向算子分发消息
  6. 正式提交kafka

12.3 barrier

  1. 精确一次性
    1. barrier对齐:等待所有barrier到来,快照,等待的时候将数据缓存不处理
    2. 1.11版本,barrier不对齐,状态数据和缓存数据同时快照
  2. 至少一次
    1. barrier对齐:等待所有barrier到来,快照,数据直接向下游传递,不阻塞在缓存中
    2. 问题:出现意外恢复,状态中有重复数据问题

12.4 savepoint 和checkpoint区别

  1. checkpoint:自动帮我做
  2. savepoint手动:配置文件指定savepoint的路径,取消任务触发保存点停止

场景:程序升级 (算子增加,算子减少)
            增加uid

13. FlinkSql

Flinksql如何转化成底层的api?

使用calcite解析语法树

sql转化  ast语法树   逻辑执行    物理执行     底层api执行 

14. Flink生产经验

14.1 提交任务脚本

bin/flink run 
        -d   后台运行 
        -D   并行度     5
        -D   JM内存     1~4 G   
        -D   TM内存     4~8 G 
        -D   TM的slot个数  3(1~4)  
        -c  主类
        ./jar包
        

如果并行设置为5个,slot个数设置为3个,那么会启动2个TM

14.2 TM内存模型

  1. JVM
    1. 元空间
    2. 执行开销
  2. FLink内存
    1. 堆内:框架内存,task计算内存(分配,剩余内存)
    2. 堆外:框架内存,task计算内存(0)  网络内存(组件之间交互,算子缓存区)  托管内存(状态数据)

14.3 Flink部署多少台机器

FLink充当客户端, ds的worker节点都需要部署 

如果是streampark:需要部署一台

15. Flink和sparkstreaming区别 /Flink优点

Flinksparkstreaming
模型流式微批次
时间丰富处理时间
乱序解决不能解决
窗口多灵活窗口长度必须是批次整数倍
容错机制没有
状态没有

16. Flink的Interval Join的实现原理?Join不上的怎么办?

底层调用的是keyby + connect ,处理逻辑:

(1)判断是否迟到(迟到就不处理了,直接return)

(2)每条流都存了一个Map类型的状态(key是时间戳,value是List存数据)

(3)任一条流,来了一条数据,遍历对方的map状态,能匹配上就发往join方法

(4)使用定时器,超过有效时间范围,会删除对应Map中的数据(不是clear,是remove)

Interval join不会处理join不上的数据,如果需要没join上的数据,可以用 coGroup+join算子实现,或者直接使用flinksql里的left join或right join语法。

17. Flink的keyby怎么实现的分区?分区、分组的区别是什么?

分组和分区在 Flink 中具有不同的含义和作用:

分区:分区(Partitioning)是将数据流划分为多个子集,这些子集可以在不同的任务实例上进行处理,以实现数据的并行处理。

数据具体去往哪个分区,是通过指定的 key 值先进行一次 hash 再进行一次 murmurHash,通过上述计算得到的值再与并行度进行相应的计算得到。

分组:分组(Grouping)是将具有相同键值的数据元素归类到一起,以便进行后续操作(如聚合、窗口计算等)。key 值相同的数据将进入同一个分组中。

注意:数据如果具有相同的 key 将一定去往同一个分组和分区,但是同一分区中的数据不一定属于同一组。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【从零学习python 】12.Python字符串操作与应用

文章目录 学习目标字符串介绍字符串表示方式小总结转义字符 下标和切片一、 下标/索引1. 如果想取出部分字符,那么可以通过下标的方法,(注意在计算机中,下标从 0 开始)2. 遍历3. 切片 进阶案例 学习目标 字符串的表示…

深度学习和OpenCV的对象检测(MobileNet SSD图像识别)

基于深度学习的对象检测时,我们主要分享以下三种主要的对象检测方法: Faster R-CNN(后期会来学习分享)你只看一次(YOLO,最新版本YOLO3,后期我们会分享)单发探测器(SSD,本节介绍,若你的电脑配置比较低,此方法比较适合R-CNN是使用深度学习进行物体检测的训练模型; 然而,…

JDBC数据库连接

目录 引言 一,基本概念 二,常用操作步骤 三,连接操作 引言 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种 关系数据库提供统一访问,它由一组用Java语言编写的类和接口…

【GPT-3 】创建能写博客的AI工具

一、说明 如何使用OpenAI API,GPT-3和Python创建AI博客写作工具。 在本教程中,我们将从 OpenAI API 中断的地方继续,并创建我们自己的 AI 版权工具,我们可以使用它使用 GPT-3 人工智能 (AI) API 创建独特的…

js玩儿爬虫

前言 提到爬虫可能大多都会想到python,其实爬虫的实现并不限制任何语言。 下面我们就使用js来实现,后端为express,前端为vue3。 实现功能 话不多说,先看结果: 这是项目链接:https://gitee.com/xi1213/w…

时序预测 | MATLAB实现BO-LSTM贝叶斯优化长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现BO-LSTM贝叶斯优化长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现BO-LSTM贝叶斯优化长短期记忆神经网络时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-LSTM贝叶斯优化长短期记忆神经网络时间序列预…

无涯教程-Perl - lock函数

描述 此函数将咨询锁放在共享变量或THING中包含的引用对象上,直到该锁超出范围。 lock()是一个"弱关键字":这意味着,如果您在调用该函数之前已通过该名称定义了该函数,则将改为调用该函数。 语法 以下是此函数的简单语法- lock THING返回值 此函数不返回任何值…

校对软件在司法系统中的应用:加强刑事文书审查

校对软件在司法系统中的应用可以加强刑事文书审查,提高文书的准确性和可靠性。 以下是校对软件在刑事文书审查方面的应用: 1.语法和拼写检查:校对软件可以自动检查刑事文书中的语法错误和拼写错误。这包括句子结构、主谓一致、动词形式等方面…

Nginx启动报错- Failed to start The nginx HTTP and reverse proxy server

根据日志,仍然出现 “bind() to 0.0.0.0:8888 failed (13: Permission denied)” 错误。这意味着 Nginx 仍然无法绑定到 8888 端口,即使使用 root 权限。 请执行以下操作来进一步排查问题: 确保没有其他进程占用 8888 端口:使用以…

【Tomcat】tomcat的多实例和动静分离

多实例: 在一台服务器上有多台Tomcat;就算是多实例 安装telnet服务,可以用来测试端口通信是否正常 yum -y install telnettelnet 192.168.220.112 80 tomcat的日志文件 cd /usr/local/tomcat/logsvim catalina.out Tomcat多实例部署&…

[免费在线] 将 PDF 转换为 Excel 或 Excel 转换为 PDF | 5 工具

有了免费的在线 PDF 转换器,您可以轻松免费在线将 PDF 转换为 Excel 或 Excel 转换为 PDF。这篇文章为您筛选了 5 个最常用的工具。要从存储介质恢复错误删除或丢失的 PDF 文档、Excel 电子表格、Word 文件或任何其他文件,您可以使用免费的数据恢复程序 …

vscode-启动cljs

打开vscode ,打开cljs项目文件 先npm installvscode安装插件Calva: Clojure & ClojureScript启动REPL 选择Start yout project with a REPL and connect(a.k.a. jack) 后选择shadow-cljs,然后选择shadow,如果需要选择build的话&#xf…

海外电子商务源代码跨境系统开发,Java现成代码全开源

海外电子商务跨境系统的开发是一个复杂的过程,而利用现成的Java代码进行开发可以节省时间和成本。下面是海外电子商务跨境系统开发的全开源步骤。 第一步:需求分析和规划 在开发海外电子商务跨境系统之前,需要进行需求分析和规划。这包括确定…

MySQL多表连接查询3

目录 表结构 创建表 表数据 查询需求: 1.查询student表的所有记录 2.查询student表的第2条到4条记录 3.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息 4.从s…

React使用antd的图片预览组件,点击哪个图片就预览哪个的设置

使用了官方推荐的相册模式的预览,但是点击预览之后,每次都是从图片列表的第一张开始预览,而不是点击哪张就从哪张开始预览: 所以这里我就封装了一下,对初始化预览的列表进行了逻辑处理: 当点击开始预览的…

竞赛项目 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习…

MongoDB 备份与恢复

1.1 MongoDB的常用命令 mongoexport / mongoimport mongodump / mongorestore 有以上两组命令在备份与恢复中进行使用。 1.1.1 导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项&#xff0c…

Java多线程(十)

目录 一、synchronized基本特点 二、synchronized加锁工作过程 2.1 无锁 2.2 偏向锁 2.3 轻量级锁 2.4 重量级锁 三、synchronized其他优化操作 3.1 锁消除 3.2 锁粗化 一、synchronized基本特点 开始是乐观锁,如果锁冲突频繁就会转换成悲观锁开始是轻量级锁&#x…

机器学习---梯度下降代码

1. 归一化 # Read data from csv pga pd.read_csv("pga.csv") print(type(pga))print(pga.head())# Normalize the data 归一化值 (x - mean) / (std) pga.distance (pga.distance - pga.distance.mean()) / pga.distance.std() pga.accuracy (pga.accuracy - pg…

MySQL 数据类型总结

整形数据类型 1字节 8bit 2^8256