[Flink]Flink实时框架介绍

目录

 

架构

应用

状态

时间

分层API

 运维


架构

Flink是一个分布式数据流处理引擎,用于处理带状态的有边界或无边界数据流。可以部署在通用的分布式集群上,实现海量数据在内存上快速计算。

无边界数据流:数据有产生标志但是没有结束标志。数据持续产生,因此需要连续地处理,只能通过一定的方法根据事件的产生和结束进行分割处理。

有边界数据流:数据可以明确的产生开始和结束标志,处理时一般不需要顺序处理,因为有边界数据流一般是按顺序产生的,可以用批处理的方法进行处理。

 

  Flink通过精确的控制状态和时间实现对无边界数据流的处理;通过内部处理算法和数据结构,灵活控制固定数据集的大小实现对有边界数据流的处理。

  Flink 是分布式系统,运行时需要计算资源,可以部署在Hadoop YARN, Apache Mesos, Kubernetes上,同时也可以以standalone的方式单独部署。

有状态Flink应用程序针对本地状态访问进行了优化。 任务状态始终保持在内存中,或者,如果状态大小超出可用内存,则始终保持在访问有效的磁盘数据结构中。 因此,任务通过访问本地(通常在内存中)状态执行所有计算,从而产生非常低的处理延迟。 Flink通过定期将本地状态异步指向持久性存储来确保出现故障时一次状态的一致性。

 

 

应用

Flink是用于无限制和有限制的数据流上的有状态计算的框架。 Flink在不同的抽象级别提供了多个API,并为常见用例提供了专用的库。以下描述数据流处理中基本的术语定义

流是流处理的基本方面。 但是,流可能具有不同的特性,这些特性会影响流的处理方式。 Flink是一个通用的处理框架,可以处理任何类型的流。如有边界或无边界流,实时流和记录

状态

每个非普通的流应用程序都是有状态的,即,仅对各个事件应用转换的应用程序不需要状态。 任何运行基本业务逻辑的应用程序都需要记住事件或中间结果,以便在以后的某个时间点访问它们,例如,在收到下一个事件时或在特定的持续时间之后。

应用程序状态是Flink中的一等公民。 通过查看Flink在状态处理上下文中提供的所有功能,您可以看到这一点。

多个状态原语:Flink为不同的数据结构(例如原子值,列表或映射)提供状态原语。开发人员可以根据功能的访问模式选择最有效的状态原语。

可插拔状态后端:在可插拔状态后端中管理应用程序状态,并由该点检查点。 Flink具有不同的状态后端,这些后端将状态存储在内存或RocksDB(一种高效的嵌入式磁盘数据存储)中。自定义状态后端也可以插入。

严格一次状态一致性:Flink的检查点和恢复算法可确保发生故障时应用程序状态的一致性。因此,可以透明地处理故障,并且不会影响应用程序的正确性。

非常大状态:Flink由于具有异步和增量检查点算法,因此能够保持大小为数TB的应用程序状态。

可扩展的应用程序:Flink通过将状态重新分配给更多或更少的工作程序来支持有状态应用程序的扩展。

 

时间

时间是流应用程序的另一个重要组成部分。大多数事件流具有固有的时间语义,因为每个事件都是在特定的时间点产生的。此外,许多常见的流计算都是基于时间的,例如窗口聚合,会话化,模式检测和基于时间的联接。流处理的一个重要方面是应用程序如何测量时间,即事件时间与处理时间之差。

Flink提供了一组丰富的与时间相关的功能。

事件时间模式:使用事件时间语义处理流的应用程序根据事件的时间戳计算结果。因此,无论是处理记录的事件还是实时事件,事件时间处理都可以提供准确一致的结果。

水印支持:Flink在事件时间应用程序中使用水印推理时间。水印还是一种权衡结果的延迟和完整性的灵活机制。

后期数据处理:在带有水印的事件时间模式下处理流时,可能会发生所有相关事件到达之前已经完成计算的情况。这种事件称为迟发事件。 Flink具有多个选项来处理较晚的事件,例如通过侧面输出重新路由它们并更新先前完成的结果。

处理时间模式:除事件时间模式外,Flink还支持处理时间语义,该语义执行由处理机的挂钟时间触发的计算。处理时间模式可能适合具有严格的低延迟要求的某些应用程序,这些应用程序可以忍受近似结果。

分层API

Flink提供了三层API。 每个API在简洁性和表达性之间提供了不同的权衡,并且针对不同的用例。

 

1、过程函数(The ProcessFunctions):

ProcessFunctions是Flink提供的最具表现力的功能接口。 Flink提供ProcessFunctions来处理来自一个或两个输入流或在一个窗口中分组的事件的单个事件。 ProcessFunctions提供对时间和状态的细粒度控制。 ProcessFunction可以任意修改其状态并注册计时器,这些计时器将来会触发回调函数。 因此,ProcessFunctions可以根据许多有状态事件驱动的应用程序的需要,实现复杂的每事件业务逻辑。

2、DataStream API

DataStream API 为许多通用的流处理操作提供了处理原语。这些操作包括窗口、逐条记录的转换操作,在处理事件时进行外部数据库查询等。DataStream API 支持 Java 和 Scala 语言,预先定义了例如map()、reduce()、aggregate() 等函数。你可以通过扩展实现预定义接口或使用 Java、Scala 的 lambda 表达式实现自定义的函数。

3、SQL & Table API

Flink 支持两种关系型的 API,Table API 和 SQL。这两个 API 都是批处理和流处理统一的 API,这意味着在无边界的实时数据流和有边界的历史记录数据流上,关系型 API 会以相同的语义执行查询,并产生相同的结果。Table API 和 SQL 借助了 Apache Calcite 来进行查询的解析,校验以及优化。它们可以与 DataStream 和 DataSet API 无缝集成,并支持用户自定义的标量函数,聚合函数以及表值函数。

4、库

Flink 具有数个适用于常见数据处理应用场景的扩展库。这些库通常嵌入在 API 中,且并不完全独立于其它 API。它们也因此可以受益于 API 的所有特性,并与其他库集成。

复杂事件处理(CEP):模式检测是事件流处理中的一个非常常见的用例。Flink 的 CEP 库提供了 API,使用户能够以例如正则表达式或状态机的方式指定事件模式。CEP 库与 Flink 的 DataStream API 集成,以便在 DataStream 上评估模式。CEP 库的应用包括网络入侵检测,业务流程监控和欺诈检测。

DataSet API:DataSet API 是 Flink 用于批处理应用程序的核心 API。DataSet API 所提供的基础算子包括map、reduce、(outer) join、co-group、iterate等。所有算子都有相应的算法和数据结构支持,对内存中的序列化数据进行操作。如果数据大小超过预留内存,则过量数据将存储到磁盘。Flink 的 DataSet API 的数据处理算法借鉴了传统数据库算法的实现,例如混合散列连接(hybrid hash-join)和外部归并排序(external merge-sort)。

Gelly: Gelly 是一个可扩展的图形处理和分析库。Gelly 是在 DataSet API 之上实现的,并与 DataSet API 集成。因此,它能够受益于其可扩展且健壮的操作符。Gelly 提供了内置算法,如 label propagation、triangle enumeration 和 page rank 算法,也提供了一个简化自定义图算法实现的 Graph API。

 运维

1、7 * 24小时稳定运行

在分布式系统中,服务故障是常有的事,为了保证服务能够7*24小时稳定运行,像Flink这样的流处理器故障恢复机制是必须要有的。显然这就意味着,它(这类流处理器)不仅要能在服务出现故障时候能够重启服务,而且还要当故障发生时,保证能够持久化服务内部各个组件的当前状态,只有这样才能保证在故障恢复时候,服务能够继续正常运行,好像故障就没有发生过一样。

Flink通过几下多种机制维护应用可持续运行及其一致性:

检查点的一致性: Flink的故障恢复机制是通过建立分布式应用服务状态一致性检查点实现的,当有故障产生时,应用服务会重启后,再重新加载上一次成功备份的状态检查点信息。结合可重放的数据源,该特性可保证精确一次(exactly-once)的状态一致性。

高效的检查点: 如果一个应用要维护一个TB级的状态信息,对此应用的状态建立检查点服务的资源开销是很高的,为了减小因检查点服务对应用的延迟性(SLAs服务等级协议)的影响,Flink采用异步及增量的方式构建检查点服务。

端到端的精确一次: Flink 为某些特定的存储支持了事务型输出的功能,及时在发生故障的情况下,也能够保证精确一次的输出。

集成多种集群管理服务: Flink已与多种集群管理服务紧密集成,如 Hadoop YARN, Mesos, 以及 Kubernetes。当集群中某个流程任务失败后,一个新的流程服务会自动启动并替代它继续执行。

内置高可用服务: Flink内置了为解决单点故障问题的高可用性服务模块,此模块是基于Apache ZooKeeper 技术实现的,Apache ZooKeeper是一种可靠的、交互式的、分布式协调服务组件

2、Flink能够更方便地升级、迁移、暂停、恢复应用服务

驱动关键业务服务的流应用是经常需要维护的。比如需要修复系统漏洞,改进功能,或开发新功能。然而升级一个有状态的流应用并不是简单的事情,因为在我们为了升级一个改进后版本而简单停止当前流应用并重启时,我们还不能丢失掉当前流应用的所处于的状态信息。

而Flink的Savepoint 服务就是为解决升级服务过程中记录流应用状态信息及其相关难题而产生的一种唯一的、强大的组件。一个 Savepoint,就是一个应用服务状态的一致性快照,因此其与checkpoint组件的很相似,但是与checkpoint相比,Savepoint 需要手动触发启动,而且当流应用服务停止时,它并不会自动删除。Savepoint 常被应用于启动一个已含有状态的流服务,并初始化其(备份时)状态。Savepoint 有以下特点:

便于升级应用服务版本: Savepoint 常在应用版本升级时使用,当前应用的新版本更新升级时,可以根据上一个版本程序记录的 Savepoint 内的服务状态信息来重启服务。它也可能会使用更早的 Savepoint 还原点来重启服务,以便于修复由于有缺陷的程序版本导致的不正确的程序运行结果。

方便集群服务移植: 通过使用 Savepoint,流服务应用可以自由的在不同集群中迁移部署。

方便Flink版本升级: 通过使用 Savepoint,可以使应用服务在升级Flink时,更加安全便捷。

增加应用并行服务的扩展性: Savepoint 也常在增加或减少应用服务集群的并行度时使用。

便于A/B测试及假设分析场景对比结果: 通过把同一应用在使用不同版本的应用程序,基于同一个 Savepoint 还原点启动服务时,可以测试对比2个或多个版本程序的性能及服务质量。

暂停和恢复服务: 一个应用服务可以在新建一个 Savepoint 后再停止服务,以便于后面任何时间点再根据这个实时刷新的 Savepoint 还原点进行恢复服务。

归档服务: Savepoint 还提供还原点的归档服务,以便于用户能够指定时间点的 Savepoint 的服务数据进行重置应用服务的状态,进行恢复服务

3、监控和控制应用服务

如其它应用服务一样,持续运行的流应用服务也需要监控及集成到一些基础设施资源管理服务中,例如一个组件的监控服务及日志服务等。监控服务有助于预测问题并提前做出反应,日志服务提供日志记录能够帮助追踪、调查、分析故障发生的根本原因。最后,便捷易用的访问控制应用服务运行的接口也是Flink的一个重要的亮点特征。

Flink与许多常见的日志记录和监视服务集成得很好,并提供了一个REST API来控制应用服务和查询应用信息。具体表现如下:

Web UI方式: Flink提供了一个web UI来观察、监视和调试正在运行的应用服务。并且还可以执行或取消组件或任务的执行。

日志集成服务:Flink实现了流行的slf4j日志接口,并与日志框架log4j或logback集成。

指标服务: Flink提供了一个复杂的度量系统来收集和报告系统和用户定义的度量指标信息。度量信息可以导出到多个报表组件服务,包括 JMX, Ganglia, Graphite, Prometheus, StatsD, Datadog, 和 Slf4j.

标准的WEB REST API接口服务: Flink提供多种REST API接口,有提交新应用程序、获取正在运行的应用程序的Savepoint服务信息、取消应用服务等接口。REST API还提供元数据信息和已采集的运行中或完成后的应用服务的指标信息。

猜你喜欢

转载自blog.csdn.net/henku449141932/article/details/109983749