0


flink知识点

Flink知识点_上 - 概念和基础

1.流处理、批处理、微批处理的区别是什么?
流处理(Stream Processing):
流处理是一种实时处理数据的方式,数据以流的形式持续进入系统,系统即时对这些数据进行处理和分析,并生成实时结果,如flink。
典型的流处理系统会保持持续连接以接收数据,然后在数据到达时立即对其进行处理。这样的系统通常用于需要实时响应的应用程序,如实时监控、实时分析和实时警报。

批处理(Batch Processing):
批处理是一种离线处理数据的方式,数据以批的形式进行处理,通常在固定的时间间隔内收集一定数量或一定时间范围内的数据,然后对这些数据进行处理,如hive离线处理。
典型的批处理系统会将数据收集起来,直到数据量达到一定的阈值或者达到某个时间点,然后在进行处理。这样的系统通常用于不需要即时结果的应用程序,如数据分析、报表生成等。

微批处理(Micro-batch Processing):
微批处理是流处理和批处理的一种折衷方式,它将数据分成小批次进行处理,每个批次的数据量通常比批处理小得多,但处理过程类似于批处理,如Spark Streaming。
微批处理系统会定期收集一小段时间内的数据,然后将这些数据分成小批次进行处理。这样的系统在某种程度上结合了流处理和批处理的优点,可以提供更接近实时的结果,同时又具有批处理系统的简单性和稳定性。

总的来说,流处理适用于需要实时响应的应用场景,批处理适用于不需要即时结果的离线处理场景,而微批处理则提供了两者之间的一种折衷方案,适用于需要在较短时间内获得结果但又不需要严格的实时性的场景。

2.Flink 和 Spark Streaming 的优劣势对比?

3.流处理是一次处理一条数据吗?
不完全是。流处理通常处理数据流中的数据,这可能包括单个数据记录,也可能是数据的小批次。流处理系统通常按需处理数据,而不是等待大批数据一起处理。因此,虽然流处理系统能够处理单个数据记录,但也可以处理数据的小批次,这取决于系统的配置和实现方式。

4.JobManager 和 TaskManager 分别负责什么工作?
在Apache Flink中,JobManager和TaskManager是两个核心组件,它们分别负责不同的工作。

JobManager(作业管理器):
JobManager是Flink集群中的主节点,负责协调整个作业的执行过程。
它接收客户端提交的作业,并将其转换为执行图(Execution Graph),然后将执行图分配给TaskManager进行实际执行。
JobManager负责调度任务、协调任务的执行顺序、监控任务的执行状态以及处理失败的情况。
在高可用配置中,JobManager还负责协调主备份JobManager之间的状态同步和故障转移。
总之,JobManager是Flink作业的控制中心,负责整个作业的管理和调度。

TaskManager(任务管理器):
TaskManager是Flink集群中的工作节点,负责实际执行作业中的任务。
每个TaskManager可以执行多个任务(Task),每个任务通常对应作业中的一个算子(Operator)。
TaskManager负责接收由JobManager分配的任务,执行任务所需的计算并处理输入数据,并将结果发送回JobManager或者其他TaskManager。
TaskManager还负责管理和维护任务执行所需的资源,如内存、CPU等,并负责处理本地状态和检查点(Checkpointing)。
在高可用配置中,TaskManager也参与故障恢复,可以重新执行丢失的任务。
总的来说,JobManager负责作业的管理和调度,而TaskManager负责实际执行作业中的任务,并管理任务执行所需的资源。这两者共同协作,构成了Flink分布式流处理引擎的核心架构。

5.JobManager 的容错是怎么做的?
Flink的JobManager(作业管理器)具有强大的容错机制,它可以确保作业在发生故障时能够进行恢复并保持状态的一致性。下面是Flink JobManager容错机制的主要方面:

检查点(Checkpointing):
Flink通过定期生成检查点来实现容错。检查点是作业状态的一致性快照,包含了作业中所有算子的状态信息。
当生成检查点时,TaskManager会将当前状态保存到持久化存储(如分布式文件系统)中,并将检查点元数据发送给JobManager。
JobManager会将接收到的检查点元数据协调起来,形成一个全局一致的作业状态快照。

恢复策略:
当作业中的某个任务失败时,Flink会根据检查点来进行故障恢复。它会首先确定最近的一个成功的检查点,并将作业状态恢复到该检查点的状态。
然后,Flink会重新启动失败的任务,并从故障点之后的数据重新处理,以保证计算结果的正确性。

增量式检查点:
Flink支持增量式检查点,这意味着在生成检查点时只保存自上次检查点以来发生变化的状态,而不需要保存整个作业状态。
这种方式可以减少检查点的生成时间和占用的存储空间,提高容错性能。

多副本存储:
Flink通常会将检查点和元数据保存到分布式文件系统(如HDFS、S3等)中,并采用多副本存储来提高数据的可靠性和容错性。
总的来说,Flink的JobManager通过检查点机制来实现作业的容错,保证作业在发生故障时能够快速恢复并保持计算结果的一致性。这种容错机制能够有效地应对各种故障情况,并确保作业的稳定运行。

6.Flink 调度作业的流程?
Flink调度作业的流程可以概括如下:
1)作业提交:
用户编写Flink作业代码并打包成可执行的JAR文件。
用户通过Flink客户端或者REST API向Flink集群提交作业,并指定作业的配置参数和资源需求。

2)JobManager接收作业:
作业提交后,JobManager接收到作业的描述信息。
JobManager根据作业的描述信息构建作业执行图(Execution Graph)。

3)作业执行图构建:
作业执行图是Flink作业的逻辑表示,它包含了作业中的所有算子(Operators)以及它们之间的数据流依赖关系。
JobManager会将作业描述信息转换为执行图,并进行优化和分析以提高执行效率。

4)任务调度:
一旦作业执行图构建完成,JobManager会将执行图中的任务(Tasks)分配给各个TaskManager执行。
JobManager根据任务之间的数据流依赖关系和各个TaskManager的资源情况,决定任务的部署位置和执行顺序。

5)任务执行:
TaskManager接收到来自JobManager的任务分配后,会启动对应的任务执行。
每个任务会处理接收到的输入数据,并根据算子的逻辑进行计算和转换。
任务执行过程中,TaskManager会不断向JobManager报告任务的执行状态和进度。

6)状态管理和容错:
在任务执行过程中,Flink会定期生成检查点(Checkpoint)来保存作业的状态信息。
检查点是作业状态的一致性快照,可以用于故障恢复和保证结果的一致性。

7)任务完成和结果输出:
当作业中的所有任务都成功完成时,作业执行结束。
JobManager会收集并汇总各个任务的计算结果,并将结果输出到指定的外部系统(如文件、数据库、消息队列等)。

8)监控和管理:
在整个作业执行过程中,Flink会提供监控和管理功能,用户可以通过Flink的Web界面或者命令行工具查看作业的执行状态、性能指标等信息,并进行必要的管理操作。
总的来说,Flink调度作业的流程涵盖了作业提交、作业执行图构建、任务调度、任务执行、状态管理和容错、结果输出等多个阶段,其中JobManager和TaskManager共同协作,构成了整个作业执行的核心

7.Task 之间是如何传输数据?
在Apache Flink中,任务(Task)之间通过网络进行数据传输。具体来说,数据在任务之间通过网络通信以流的形式进行传输,这种方式被称为网络数据流(Network Stream)。
任务之间的数据传输主要涉及以下几个方面:

1)数据分区:
1.在Flink作业中,数据通常被划分为多个分区,每个分区包含一部分数据。
2.任务之间的数据传输通常以分区为单位进行,每个任务负责处理其中一个或多个分区的数据。

2)网络通信:
1.当一个任务需要将数据发送给另一个任务时,它会通过网络将数据发送给目标任务所在的TaskManager。
2.Flink使用基于Netty的网络通信框架来实现任务之间的数据传输,Netty提供了高性能的网络通信能力,支持异步、非阻塞的IO操作。

3)数据序列化和反序列化:
1.在数据传输过程中,数据会被序列化成字节流并通过网络发送,接收方会将接收到的字节流反序列化成原始数据。
2.Flink使用自定义的序列化器(Serializer)来实现数据的序列化和反序列化,以提高性能和减少网络传输开销。

4)数据缓冲和流控制:
1.为了提高网络传输的效率,Flink会对数据进行缓冲,并通过流控制机制来控制数据的发送和接收速率,以防止数据发送方过快导致接收方无法及时处理数据而出现溢出或阻塞的情况。

5)数据路由和分发:
1.在数据传输过程中,JobManager负责确定数据的发送和接收方,以及数据的路由和分发策略,确保数据能够按照预期的方式传输到目标任务。
总的来说,Flink任务之间的数据传输是通过网络通信实现的,它涉及数据分区、网络通信、数据序列化和反序列化、数据缓冲和流控制等多个方面,以实现高效、可靠的数据传输。

8.Slot 这个概念怎么理解?
在Apache Flink中,一个Slot代表着一个TaskManager上的可用资源单元。TaskManager是Flink集群中的工作节点,而Slot则是在TaskManager上分配的资源单位,它用于执行一个并发任务或子任务。理解Slot的概念涉及到以下几个关键点:
1)任务并行度(Parallelism):
1.Flink应用程序中的任务可以被并行执行,这意味着一个任务可能会被分成多个子任务同时在不同的Slot上执行,从而提高整体处理能力。
2.Slot的数量决定了在一个TaskManager上可以并行执行的任务或子任务的数量。

2)资源隔离:
1.每个Slot都代表一定的计算资源和内存资源。通过将任务分配到不同的Slot上,可以实现任务之间的资源隔离,防止彼此之间相互影响。
2.这有助于提高系统的稳定性和可靠性,因为一个任务的异常不太可能影响到其他任务。

3)任务调度和分配:
1.Flink的任务调度器(Scheduler)负责将应用程序中的任务分配到可用的Slot上。调度器会考虑任务的并行度以及Slot的可用性来做出合理的分配决策。
2.Slot的概念使得Flink能够在集群中充分利用资源,实现任务的高效执行。

4)共享资源:
1.多个任务可能共享同一个Slot上的资源。这种共享可以是在任务并行度较小时,多个任务共享一个Slot,或者是在资源有限的情况下,一个任务占用多个Slot的资源。

总的来说,Slot是在Flink集群中分配的资源单元,用于执行并发任务或子任务。理解Slot的概念有助于理解Flink的并行计算模型、任务调度机制以及资源管理策略。

Flink 知识点_中- 窗口机制和原理

1.Flink 的三种时间语义是什么?
1)Event Time (事件生成时间):这是指事件产生的时间,通常由事件中的某个时间戳字段来表示。例如,在用户登录日志中,用户登录的时间就是一个时间戳字段。
2)Ingestion Time (事件接入时间):这是指事件进入 Flink 中的时间。在 Flink 中,数据流最早进入 Flink 的那个时间点被称为 Ingestion Time。
3)Processing Time (事件处理时间):这是指时间被处理时的当前系统时间。在 Flink 中,所有的基于时间的操作(比如时间窗口)都是使用 Processing Time。例如,一个长度为1个小时的窗口将会包含 Processing Time 表示的1个小时内所有的数据。

这三种时间语义各有优缺点,选择哪种时间语义取决于具体的应用场景和需求。例如,如果需要保证数据的实时性,通常会使用 Event Time。如果需要处理分布式和异步的环境,可能会使用 Processing Time,因为它提供了最好的性能和最低的延迟,但可能无法保证确定性。如果存在多个 Source Operator,每个 Source Operator 可以使用自己本地系统时钟指派 Ingestion Time,这在某些情况下可能更为方便。

3.Watermark 怎么理解?
Watermark是Apache Flink提出的一种用来解决乱序、延迟数据等情况的解决方案,通常和窗口结合使用。例如在一个窗口内,对于延迟数据,我们不能一直无限期等待所有延迟数据到来后才触发窗口计算,因此提出了Watermark机制,由用户来决定等待延迟数据多久后触发计算。本质上来说Watermark就是单调递增的时间戳,来控制等待延迟数据的最大时长。对于watermark,可以在flink应用程序中两个地方使用:
1.直接在数据源上使用。该方式相对会比较好,因为数据源可以利用 watermark 生成逻辑中有关分片/分区(shards/partitions/splits)的信息。使用这种方式,数据源通常可以更精准地跟踪 Watermark,整体Watermark生成将更精确。
2.在操作算子上使用。当无法在数据源上使用时,则可以在算子操作上进行使用。

4.Watermark 是怎么生成的?
在Apache Flink中,Watermark是一种用于处理事件时间(Event Time)的机制,用于衡量事件流中的事件是否已经达到了一定的时间边界。Watermark用于解决事件时间处理中的乱序数据和延迟数据的问题。
Watermark是由数据源或转换算子生成的特殊数据记录,它包含了一个时间戳(timestamp),表示该时间戳之前的所有事件已经全部到达。换句话说,Watermark提供了一个逻辑上的时间线,表示在这个时间之前的所有数据都已经到达了系统。

生成Watermark的常见方式包括:
1)周期性生成:在Flink中,一些数据源或转换算子会周期性地生成Watermark。它们根据接收到的事件中的时间戳来生成Watermark,并将其发送到下游操作符。生成Watermark的频率通常由用户指定,比如每隔一定时间间隔生成一个Watermark。
2)数据驱动生成:有些情况下,Watermark的生成可能是根据数据流中的某些特殊事件触发的。比如,当某个数据源或者某个处理算子检测到一定的事件数量或者一定的事件间隔时,就会生成一个Watermark。
3)内置生成器:Flink提供了一些内置的Watermark生成器,比如BoundedOutOfOrdernessTimestampExtractor。这些生成器可以基于事件数据中的时间戳信息以及用户指定的最大乱序等待时间来自动地生成Watermark。

在Flink的数据流处理中,Watermark的生成对于实现基于事件时间的窗口操作(如滚动窗口、滑动窗口)以及处理乱序数据都是非常重要的。Watermark的生成机制确保了数据流处理的正确性和准确性,使得窗口操作能够在事件时间上得到正确的触发和计算。

5.不同场景下该如何设置 Watermark?
设置Watermark的方式会根据不同的场景和需求而有所不同。以下是一些常见的设置Watermark的场景和对应的方式:
1)固定延迟(Fixed Delay):
在某些情况下,可以简单地设置固定延迟作为Watermark。例如,如果知道数据流中的事件产生后,数据不会再有延迟到达,则可以设置一个固定的延迟时间作为Watermark。这样可以确保所有事件在一定延迟之后都已经到达,从而保证窗口操作的正确性。

2)乱序事件(Out-of-Order Events):
当数据流中存在乱序事件时,通常需要根据实际情况设置Watermark。一种常见的方式是基于事件的时间戳来计算Watermark,然后根据乱序程度设置一个合理的延迟。比如,可以根据数据流中的时间戳和当前时间来计算出一个合理的Watermark,然后再加上一个固定的乱序等待时间。

3)动态延迟(Dynamic Delay):
在某些情况下,数据流中的事件可能会有不同的延迟时间,这时需要动态地调整Watermark。例如,可以根据数据流中的一些特征或者指标来动态地计算Watermark。比如,可以根据数据流中的平均处理时间、数据量、延迟分布等信息来动态地调整Watermark。

4)数据源特性(Source Characteristics):
数据源本身的特性也会影响Watermark的设置。例如,如果数据源本身就是有序的,那么可以简单地根据事件的时间戳来设置Watermark;如果数据源本身就是存在一定延迟的,那么可以根据数据源的延迟特性来设置Watermark。

5)自定义逻辑(Custom Logic):
在一些特殊情况下,可能需要根据业务逻辑或者特定需求来自定义Watermark的生成逻辑。这时可以根据实际情况编写自定义的Watermark生成器,来满足特定的需求。

总的来说,设置Watermark需要考虑数据流中的特性、延迟情况、乱序程度以及业务需求等因素。根据不同的场景和需求,可以选择合适的方式来设置Watermark,以保证数据流处理的正确性和准确性。

6.Tumbling / Sliding / Session Window 的定义是什么?
根据分配数据的规则,窗口的具体实现可以分为 4 类:滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)、会话窗口(Session Window),以及全局窗口(Global Window)
1)滚动窗口(Tumbling Windows)
  滚动窗口有固定的大小,是一种对数据进行均匀切片的划分方式。窗口之间没有重叠,也不会有间隔,是“首尾相接”的状态。滚动窗口可以基于时间定义,也可以基于数据个数定义;需要的参数只有一个,就是窗口的大小(window size)。
2)滑动窗口(Sliding Windows)
  与滚动窗口类似,滑动窗口的大小也是固定的。区别在于,窗口之间并不是首尾相接的,而是可以“错开”一定的位置。如果看作一个窗口的运动,那么就像是向前小步“滑动”一样。定义滑动窗口的参数有两个:除去窗口大小(window size)之外,还有一个滑动步长(window slide),代表窗口计算的频率。
3)会话窗口(Session Windows)
  借用会话超时失效的机制来描述窗口简单来说,就是数据来了之后就开启一个会话窗口,如果接下来还有数据陆续到来,那么就一直保持会话;如果一段时间一直没收到数据,那就认为会话超时失效,窗口自动关闭。与滑动窗口和滚动窗口不同,会话窗口只能基于时间来定义,而没有“会话计数窗口”的概念。
4)全局窗口(Global Windows)
  这种窗口全局有效,会把相同 key 的所有数据都分配到同一个窗口中;说直白一点,就跟没分窗口一样。无界流的数据永无止尽,所以这种窗口也没有结束的时候,默认是不会做触发计算的。如果希望它能对数据进行计算处理,还需要自定义触发器(Trigger)

7.Watermark 和窗口中 AllowLateness 机制的区别是什么?
watermark 通过additional的时间戳来控制窗口激活的时间,主要是为了解决数据乱序到达的问题,
allowedLateness 用来控制窗口的销毁时间,解决窗口触发后数据迟到后的问题。
在flink中我们经常使用watermark、allowedLateness 、 sideOutputLateData结合的方式处理数据保证窗口数据不丢失

8.Sliding Window 中 State 是如何存储的?
对于 Sliding Window,State 的存储主要涉及到以下两个方面:
1)Keyed State:
Sliding Window 中的状态通常是与键(key)相关联的。Keyed State 是在 KeyedStream 上维护的状态,它与窗口函数的 Key 相关。窗口函数计算时会使用 Keyed State 来存储窗口计算的中间状态。
在 Sliding Window 中,Keyed State 存储的信息可能包括窗口内的元素、累加器值、以及其他与窗口计算相关的信息。

2)窗口的存储结构:
窗口的存储结构是与具体的窗口函数和触发器相关的。窗口可能需要存储窗口内的元素,以便进行聚合计算。这些元素可能存储在状态中,但具体实现可能会根据窗口函数和触发器的性质而有所不同。
有些窗口函数可能使用状态后端(State Backend)将状态存储在持久化存储系统中,例如 RocksDB。而有些窗口函数可能使用内存中的状态。
总的来说,在 Sliding Window 中,State 的存储通常包含两个层面:Keyed State 用于存储与键相关的状态信息,窗口的存储结构则用于存储与具体窗口函数相关的计算中间状态。具体的实现会根据使用的窗口函数、触发器以及配置的状态后端而有所不同。

9.Session Window 的使用场景?
用户将APP打开,进行一系列操作(浏览、点击、收藏等),是将事件聚合到会话窗口中(一段用户持续活跃的周期),由非活跃的间隙分隔开。计算每个用户在活跃期间总共购买的商品数量,如果用户30秒没有活动则视为会话断开。

Flink 知识点_下 - Checkpoint和State

1.Checkpoint 的流程是什么?
chechpoint 在执行过程中,可以简化为以下四大步:
1)在数据流中插入 checkpoint barrier;
2)每执行到当前算子时,对算子 state 状态进行同步快照与异步上传;
3)当算子是多输入时,要进行 barrier 对其操作;
4)所有算子状态都已上传,确认 checkpoint 完成;

2.Checkpoint 和 Savepoint 的区别?
1)Checkpoint是为runtime准备的,Savepoint 是为用户准备的。
2)Checkpoint 机制的目标在于保证Flink作业意外崩溃重启不影响exactly once 准确性,通常用于系统容错。
而Savepoint的目的在于在Flink作业维护(比如更新作业代码)时将作业状态写到外部系统,以便维护结束后重新提交作业可以到恢复原本的状态。
3)Checkpoint异常恢复,保证可用性,在任务发生故障时,为任务提供给自动恢复机制;Savepoint需手动备份、恢复暂停作业的方法。
4)Checkpoint 被设计成轻量和快速恢复数据的机制,Savepoint 更多地关注数据的可移植性,并支持对作业做任何更改而状态能保持兼容
5)Checkpoint 是自动和定期的,它们由 Flink 自动地周期性地创建和删除,无需用户的交互。
相反,Savepoint 是由用户手动地管理(调度、创建、删除)的。
总的来说,1.目的:checkpoint重点是在于自动容错,savepoint重点在于程序修改或者更新后从状态中恢复
2.触发者:checkpoint是flink自动触发,而savepoint是用户主动触发
3.状态文件保存:checkpoint一般都会自动删除;savepoint一般都会保留下来,除非用户去做相应的删除操作。

3.Checkpoint 提供了哪些一致性语义?
4.Checkpoint Exactly-Once 语义是怎么实现的?
5.StateBackend 有什么类型?
6.如何根据业务场景选型 StateBackend?
7.FsStateBackend 的异步原理是什么?
8.RocksDBStateBackend 的异步原理是什么?
9.StateBackend 的 TTL 原理?
10.RocksDBStateBackend 的引用计数法实现文件过期?
11.RocksDBStateBackend 增量快照的原理?

标签: flink 大数据

本文转载自: https://blog.csdn.net/qq_32278923/article/details/136333832
版权归原作者 Stupid阳光 所有, 如有侵权,请联系我们删除。

“flink知识点”的评论:

还没有评论