Flink基础汇总

目录

二、一些面试题整理


Flink 核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。

Flink充分考虑事件的时间属性,通过WaterMark等机制,可以实时准确地完成流式计算,轻松实现CEP等功能,把批计算当成流计算的一种特例。

Flink像Spark一样,也可以部署到Yarn上,可以用HDFS作为分布式存储。

提供API:

  1. DataSet API 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用 Flink 提供的各种操作符对分布式数据集进行处理,支持 Java、Scala和 Python。
  2. DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用 户可以方便地对分布式数据流进行各种操作,支持 Java 和 Scala。
  3. Table API,对结构化数据进 行查询操作,将结构化数据抽象成关系表,并通过类 SQL的 DSL 对关系表进行各种查询操作,支 持 Java 和 Scala。

TaskSlot:Flink中每个 TaskManager 是一个 JVM 的进程, 可以在不同的线程中执行一个或多个子任务,为了控制一个 worker 能接收多少个 task。worker 通过 task slot(任务槽)来进行控制(一个 worker 至少有一个 task slot)。

二、一些面试题整理

1、Flink和sparkstreaming对比

  1. 架构模型上:Spark Streaming 在运行时的主要角色包括:Master、Worker、Driver、Executor,Flink 在运行时主要包含:Jobmanager、Taskmanager和Slot。
  2. Spark Streaming 是微批处理,运行的时候需要指定批处理的时间,每次运行 job 时处理一个批次的数据;Flink 是基于事件驱动的,事件可以理解为消息。事件驱动的应用程序是一种状态应用程序,它会从一个或者多个流中注入事件,通过触发计算更新状态,或外部动作对注入的事件作出反应。
  3. 任务调度上:Spark Streaming 的调度分为构建 DGA 图,划分 stage,生成 taskset,调度 task 等步骤,而 Flink 首先会生成 StreamGraph,接着生成 JobGraph,然后将 jobGraph 提交 给 Jobmanager 由它完成 jobGraph 到 ExecutionGraph 的转变,最后由 jobManager 调度执行。
  4. 时间机制上:Spark Streaming 只支持处理时间,Structured streaming 则支持了事件时 间和 watermark 机制。flink 支持三种时间机制事件时间,注入时间,处理时间,同时支持watermark 机制处理滞后数据
  5. 容错机制上:二者保证 exactly-once 的方式不同。spark streaming 通过保存 offset 和事务的方式;Flink 则使用两阶段提交协议来解决这个问题。

2、Flink集群有哪些角色?各自有什么作用?

TaskManager,JobManager,Client三种。

JobManagerMaster角色。集群的协调者,负责接收Flink Job,协调检查点,Failover 故障恢复等,同时管理Flink集群中从节点TaskManager。

TaskManger实际负责计算的worker。在其上执行Flink Job的一组Task,每个TaskManager负责管理其所在节点上的资源信息,包括磁盘、网络等。在启动的时候将资源的状态向JobManager汇报。Flink 运行时至少会存在一个 worker 处理器。

Client是Flink程序提交的客户端,当用户提交一个Flink程序时,会首先创建一个Client,该Client首先会对用户提交的Flink程序进行预处理,并建立到 JobManager 的连接,提交到Flink集群中处理。

3、Flink并行度

Flink中的任务被分成多个并行任务,每个并行的实例处理一部分数据,这些并行实例的数量被称为并行度。可以从四个不同层面设置并行度:

操作算子、执行环境、客户端、系统层面。优先级依次降低。

4、Flink三种时间语义?

event time:事件创建

ingestion time:数据进入flink的时间

processing time:进入具体算子的时间。

4、Flink状态机制

Fink在做计算的过程中经常需要存储中间状态,来避免数据丢失和状态恢复。选择的状态存储策略不同,会影响状态持久化如何和 checkpoint 交互

三种状态存储方式:MemoryStateBackend、FsStateBackend、RocksDBStateBackend

4.1 flink中的状态

由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态。

可以认为状态就是一个本地变量(一般放在本地内存,本地内存读取修改什么的都比较快),可以被任务的业务逻辑访问。

flink状态管理:状态一致性、故障处理以及高效存储和访问等。

状态始终与特定算子相关联跟特定的任务绑定在一起的

无状态的算子:不依赖于其它的数据,也不依赖于之前的结果。如map、fliter、flatmap等。

有状态算子:需要依赖于之前计算的结果,如window、reduce、聚合等。

总的来说,有两种类型的状态:
算子状态(Operator State):算子状态的作用范围限定为算子任务

键控状态(Keyed State):根据输入数据流中定义的键(key)来维护和访问

(1)算子状态

        1)算子状态的作用范围限定为算子任务,由同一并行任务所处理的所有数据都可以访问到相同的状态。
        2)状态对于同一子任务而言是共享的(一个Task里所有数据都共享这个状态)。
        3)算子状态不能由相同或不同算子的另一个子任务访问(即使两个task是一个算子的两个子任务,也不能互相访问)。
        4)只要在同一个分区,不管key相不相同,访问的都是一个状态。

算子状态数据结构:

1)列表状态(List state)
将列表表示为一组数据的列表(在故障恢复之后,可能会发生并行度的调整,如果要进行聚合还好说,如果要拆分就不容易去拆分)

2)联合列表状态(Union list state)
也将状态表示为数据的列表。它与常规列表状态的区别在于,在发生故障时,或者从保存点(savepoint)启动应用程序时如何恢复。

3)广播状态(Broadcast state)
如果一个算子有多项任务,而它的每项任务状态又都相同,那么这种特殊情况最适合应用广播状态。
 

(2)键控状态

1)键控状态是根据输入数据流中定义的键(key)来维护和访问的。
2)Flink 为每个键值Key维护一个状态实例,并将具有相同键的所有数据,都分区到同一个算子任务中,这个任务会维护和处理这个 key 对应的状态。
3)当任务处理一条数据时,它会自动将状态的访问范围限定为当前数据的 key。
因此,具有相同 key 的所有数据都会访问相同的状态。

键控状态数据结构
1)值状态(Value state):将状态表示为单个的值。
2)列表状态(List state):将状态表示为一组数据的列表。
3)映射状态(Map state):将状态表示为一组Key-Value对
4)聚合状态(Reducing & Aggregating State):将状态表示为一个用于聚合操作的列表

4、Flink? 支持哪几种重启策略?分别如何配置? 重启策略种类

固定延迟重启策略(Fixed Delay Restart Strategy):尝试一个给定的次数来重启 Job,如果超过了最大的重启次数,Job 最终将失败。在连续的两次重启尝试之间,重启策略会等待一个固定的时间。

故障率重启策略(Failure Rate Restart Strategy):在 Job 失败后会重启,但是超过失败率后,Job 会最终被认定失败。在两个连续的重启尝试之间,重启策略会等待一个固定的时间。

无重启策略(No Restart Strategy):Job 直接失败,不会尝试进行重启。

Fallback 重启策略(Fallback Restart Strategy)

5、Flink 在使用 Window 时出现数据倾斜,有什么解决办法?

 window 产生的数据倾斜指的是不同的窗口内积攒的数据量不同,主要是由源头 数据的产生速度导致的差异。核心思路:1.重新设计 key 2.在窗口计算前做预聚合

6、Flink任务 delay极高 怎么调优

首先要确定问题产生的原因,找到最耗时的点,确定性能瓶颈点。比如任务频繁反压,找到 反压点。主要通过:资源调优、作业参数调优。

资源调优即是对作业中的 Operator 的并发数 (parallelism)、CPU(core)、堆内存(heap_memory)等参数进行调优。作业参数调优包括:并行度的设置,State 的设置,checkpoint 的设置。

7、Flink内存管理

Flink 并不是将大量对象存在堆上,而是将对象都序列化到一个预分配的内存块上。此外,Flink 大量的使用了堆外内存。如果需要处理的数据超出了内存限制,则会将部分数据存储到硬盘上。Flink 为了直接操作二进制数据实现了自己的序列化框架。

6、Flink如何支持批流一体

不是很了解,就直接简单一句话:

Flink 的开发者认为批处理是流处理的一种特殊情况。批处理是有限的流处理。Flink 使用一个引擎支持了 DataSet API 和 DataStream API。

原文参考:https://blog.csdn.net/yunweijie_cn/article/details/123421456

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值