目录
Flink 是什么-架构
Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。Flink 被设计为在所有常见的集群环境中运行,以内存中的速度和任何规模执行计算。
处理无界和有界数据
任何类型的数据都是作为事件流产生的。信用卡交易、传感器测量、机器日志或网站或移动应用程序上的用户交互,所有这些数据都以流的形式生成。
数据可以作为无界或有界流进行处理。
- 无界流有一个开始但没有定义的结束。它们不会终止并在生成数据时提供数据。必须连续处理无界流,即事件必须在被摄取后立即处理。不可能等待所有输入数据到达,因为输入是无界的并且不会在任何时间点完成。处理无限数据通常需要以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。
- 有界流具有定义的开始和结束。可以通过在执行任何计算之前摄取所有数据来处理有界流。处理有界流不需要有序摄取,因为始终可以对有界数据集进行排序。有界流的处理也称为批处理。
**Apache Flink 擅长处理无界和有界数据集。**对时间和状态的精确控制使 Flink 的运行时能够在无限流上运行任何类型的应用程序。有界流由专门为固定大小的数据集设计的算法和数据结构在内部进行处理,从而产生出色的性能。
随处部署应用程序
Apache Flink 是一个分布式系统,需要计算资源才能执行应用程序。Flink 集成了所有常见的集群资源管理器,如Hadoop YARN、Apache Mesos和Kubernetes ,但也可以设置为作为独立集群运行。
Flink 旨在很好地工作于前面列出的每个资源管理器。这是通过特定于资源管理器的部署模式实现的,该模式允许 Flink 以惯用的方式与每个资源管理器进行交互。
在部署 Flink 应用程序时,Flink 会根据应用程序配置的并行度自动识别所需资源,并向资源管理器请求。在失败的情况下,Flink 通过请求新资源来替换失败的容器。提交或控制应用程序的所有通信都是通过 REST 调用发生的。这简化了 Flink 在许多环境中的集成。
以任何规模运行应用程序
Flink 旨在以任何规模运行有状态的流应用程序。应用程序被并行化为可能在集群中分布和并发执行的数千个任务。因此,应用程序可以利用几乎无限量的 CPU、主内存、磁盘和网络 IO。而且,Flink 很容易维护非常大的应用程序状态。其异步和增量检查点算法确保对处理延迟的影响最小,同时保证精确一次的状态一致性。
用户报告了在其生产环境中运行的 Flink 应用程序的可扩展性数据,例如
- 应用程序每天处理数万亿个事件,
- 维护多个 TB 状态的应用程序
- 在数千个内核上运行的应用程序。
利用内存性能
有状态的 Flink 应用程序针对本地状态访问进行了优化。任务状态始终保存在内存中,或者如果状态大小超过可用内存,则保存在访问高效的磁盘数据结构中。因此,任务通过访问本地(通常是在内存中)状态来执行所有计算,从而产生非常低的处理延迟。Flink 通过定期和异步检查本地状态到持久存储来保证在发生故障时的一次性状态一致性。
Flink 是什么-应用
Apache Flink 是一个用于对无界和有界数据流进行状态计算的框架。Flink 提供多种不同抽象级别的 API,并为常见用例提供专用库。
在这里,我们展示了 Flink 易于使用且富有表现力的 API 和库。
流应用程序的构建块
可以使用流处理框架构建和执行的应用程序类型由框架控制流、状态和时间的程度来定义。在下文中,我们将描述流处理应用程序的这些构建块,并解释 Flink 处理它们的方法。
流
显然,流是流处理的一个基本方面。但是,流可以具有不同的特性,这些特性会影响流的处理方式和应该如何处理。Flink 是一个通用的处理框架,可以处理任何类型的流。
- 有界和无界流:流可以是无界或有界的,即固定大小的数据集。Flink 具有处理无界流的复杂功能,但也有专门的运算符来有效地处理有界流。
- 实时和记录流:所有数据都以流的形式生成。有两种处理数据的方法。在生成流时对其进行实时处理或将流持久化到存储系统(例如文件系统或对象存储),然后再对其进行处理。Flink 应用程序可以处理记录的或实时的流。
状态
每个重要的流应用程序都是有状态的,即只有对单个事件应用转换的应用程序才不需要状态。任何运行基本业务逻辑的应用程序都需要记住事件或中间结果,以便在稍后的时间点访问它们,例如在接收到下一个事件时或在特定持续时间之后。
应用程序状态是 Flink 中的一等公民。通过查看 Flink 在状态处理上下文中提供的所有功能,您可以看到这一点。
- 多状态原语:Flink 为不同的数据结构提供状态原语,例如原子值、列表或映射。开发人员可以根据函数的访问模式选择最有效的状态原语。
- 可插拔状态后端:应用程序状态由可插拔状态后端管理和检查点。Flink 具有不同的状态后端,将状态存储在内存或RocksDB中,这是一种高效的嵌入式磁盘数据存储。也可以插入自定义状态后端。
- Exactly-once 状态一致性:Flink 的检查点和恢复算法保证了应用程序状态在发生故障时的一致性。因此,故障被透明地处理并且不影响应用程序的正确性。
- 超大状态:由于其异步和增量检查点算法,Flink 能够维持数 TB 大小的应用程序状态。
- 可扩展的应用程序:Flink 通过将状态重新分配给更多或更少的工作人员来支持有状态应用程序的扩展。
时间
时间是流应用程序的另一个重要组成部分。大多数事件流具有固有的时间语义,因为每个事件都是在特定时间点产生的。此外,许多常见的流计算都是基于时间的,例如窗口聚合、会话化、模式检测和基于时间的连接。流处理的一个重要方面是应用程序如何测量时间,即事件时间和处理时间的差异。
Flink 提供了丰富的时间相关特性。
- 事件时间模式:处理具有事件时间语义的流的应用程序根据事件的时间戳计算结果。因此,无论是处理记录的事件还是实时事件,事件时间处理都允许获得准确和一致的结果。
- 水印支持:Flink 使用水印来推断事件时间应用程序中的时间。水印也是一种灵活的机制,可以权衡结果的延迟和完整性。
- 后期数据处理:在事件时间模式下处理带有水印的流时,可能会发生计算在所有相关事件到达之前已经完成。此类事件称为延迟事件。Flink 具有多种处理延迟事件的选项,例如通过侧输出重新路由它们和更新之前完成的结果。
- 处理时间模式:除了它的事件时间模式,Flink 还支持处理时间语义,它执行由处理机器的挂钟时间触发的计算。处理时间模式可以适用于具有严格低延迟要求的某些应用程序,这些应用程序可以容忍近似结果。
分层 API
Flink 提供了三层 API。每个 API 在简洁性和表达性之间提供不同的权衡,并针对不同的用例。
过程函数
ProcessFunctions是 Flink 提供的最具表现力的函数接口。Flink 提供 ProcessFunctions 来处理来自一个或两个输入流的单个事件或在一个窗口中分组的事件。ProcessFunctions 提供对时间和状态的细粒度控制。ProcessFunction 可以任意修改其状态并注册将来会触发回调函数的计时器。因此,ProcessFunctions 可以实现许多有状态事件驱动应用程序所需的复杂的每个事件的业务逻辑。
数据流 API
DataStream API为许多常见的流处理操作提供原语,例如窗口化、一次记录转换以及通过查询外部数据存储来丰富事件。DataStream API 可用于 Java 和 Scala,并且基于函数,例如map()
、reduce()
和aggregate()
。函数可以通过扩展接口或 Java 或 Scala lambda 函数来定义。
SQL & Table API
Flink 有两个关系 API,Table API 和 SQL。两种 API 都是用于批处理和流处理的统一 API,即查询以相同的语义对无界的实时流或有界的记录流执行并产生相同的结果。Table API 和 SQL 利用Apache Calcite进行解析、验证和查询优化。它们可以与 DataStream 和 DataSet API 无缝集成,并支持用户定义的标量、聚合和表值函数。
Flink 的关系 API 旨在简化数据分析、数据管道和 ETL 应用程序的定义。
以下示例显示了用于会话化点击流并计算每个会话的点击次数的 SQL 查询。这与 DataStream API 示例中的用例相同。
SELECT userId, COUNT(*)
FROM clicks
GROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId
类库
Flink 具有几个用于常见数据处理用例的库。这些库通常嵌入在 API 中,而不是完全独立的。因此,它们可以从 API 的所有功能中受益并与其他库集成。
- 复杂事件处理 (CEP):模式检测是事件流处理的一个非常常见的用例。Flink 的 CEP 库提供了一个 API 来指定事件的模式(想想正则表达式或状态机)。CEP 库与 Flink 的 DataStream API 集成,以便在 DataStreams 上评估模式。CEP 库的应用包括网络入侵检测、业务流程监控和欺诈检测。
- DataSet API:DataSet API 是 Flink 用于批处理应用的核心 API。DataSet API 的原语包括map、 reduce、(外)join、 co-group和iterate。所有操作都由算法和数据结构支持,这些算法和数据结构对内存中的序列化数据进行操作,如果数据大小超过内存预算,则会溢出到磁盘。Flink 的 DataSet API 的数据处理算法受到了传统数据库运算符的启发,例如混合哈希联接或外部合并排序。
- Gelly:Gelly 是一个用于可扩展图形处理和分析的库。Gelly 在 DataSet API 之上实现并与它集成。因此,它受益于其可扩展且强大的运营商。Gelly 具有内置算法,例如标签传播、三角形枚举和页面排名,但还提供了一个Graph API可以简化自定义图形算法的实现。
Flink 是什么-操作
Apache Flink 是一个用于对无界和有界数据流进行状态计算的框架。由于许多流应用程序旨在以最少的停机时间连续运行,因此流处理器必须提供出色的故障恢复,以及在应用程序运行时监控和维护应用程序的工具。
Apache Flink 非常关注流处理的操作方面。在这里,我们解释了 Flink 的故障恢复机制,并展示了它的特性来管理和监督正在运行的应用程序。
24/7 不间断运行您的应用程序
机器和流程故障在分布式系统中无处不在。像 Flink 这样的分布式流处理器必须从故障中恢复,以便能够 24/7 全天候运行流应用程序。显然,这不仅意味着在失败后重新启动应用程序,而且要确保其内部状态保持一致,以便应用程序可以继续处理,就好像故障从未发生过一样。
Flink 提供了几个特性来确保应用程序保持运行并保持一致:
- 一致性检查点:Flink 的恢复机制基于应用程序状态的一致性检查点。如果发生故障,应用程序将重新启动并从最新的检查点加载其状态。结合可重置的流源,这个特性可以保证exactly-once的状态一致性。
- 高效的检查点:如果应用程序维护 TB 级的状态,对应用程序的状态进行检查点可能会非常昂贵。Flink 可以执行异步和增量检查点,以保持检查点对应用程序延迟 SLA 的影响非常小。
- End-to-End Exactly-Once:Flink 为特定存储系统提供事务接收器,保证数据只写出一次,即使发生故障。
- 与集群管理器集成:Flink 与集群管理器紧密集成,例如Hadoop YARN、Mesos或Kubernetes。当一个进程失败时,会自动启动一个新进程来接管它的工作。
- 高可用性设置:Flink 具有高可用性模式,可消除所有单点故障。HA 模式基于Apache ZooKeeper,这是一种经过实战验证的可靠分布式协调服务。
更新、迁移、暂停和恢复您的应用程序
需要维护为关键业务服务提供支持的流媒体应用程序。需要修复错误并需要实施改进或新功能。但是,更新有状态的流应用程序并非易事。通常人们不能简单地停止应用程序并重新启动一个固定或改进的版本,因为我们不能承受丢失应用程序的状态。
Flink 的Savepoints是一个独特而强大的功能,它解决了更新有状态应用程序的问题和许多其他相关挑战。保存点是应用程序状态的一致快照,因此与检查点非常相似。然而,与检查点相比,保存点需要手动触发,并且不会在应用程序停止时自动删除。保存点可用于启动与状态兼容的应用程序并初始化其状态。保存点启用以下功能:
- 应用程序进化:保存点可用于进化应用程序。可以从从应用程序的先前版本获取的保存点重新启动应用程序的固定或改进版本。也可以从较早的时间点启动应用程序(假设存在这样的保存点)以修复有缺陷的版本产生的不正确结果。
- 集群迁移:使用保存点,可以将应用程序迁移(或克隆)到不同的集群。
- Flink 版本更新:可以使用保存点迁移应用程序以在新的 Flink 版本上运行。
- 应用程序缩放:保存点可用于增加或减少应用程序的并行度。
- A/B 测试和假设情景:可以通过从同一保存点启动所有版本来比较应用程序的两个(或多个)不同版本的性能或质量。
- 暂停和恢复:可以通过获取保存点并停止它来暂停应用程序。在以后的任何时间点,都可以从保存点恢复应用程序。
- 存档:可以存档保存点,以便能够将应用程序的状态重置为更早的时间点。
监视和控制您的应用程序
就像任何其他服务一样,持续运行的流媒体应用程序需要受到监督并将其集成到组织的运营基础设施中,即监控和日志服务。监控有助于预测问题并提前做出反应。日志记录使根本原因分析能够调查故障。最后,易于访问的界面来控制正在运行的应用程序是一项重要功能。
Flink 很好地集成了许多常见的日志记录和监控服务,并提供了一个 REST API 来控制应用程序和查询信息。
- Web UI:Flink 提供了一个 Web UI 来检查、监控和调试正在运行的应用程序。它还可以用于提交执行或取消执行。
- 日志:Flink 实现了流行的 slf4j 日志接口,并与日志框架log4j或logback集成。
- Metrics:Flink 具有复杂的指标系统来收集和报告系统和用户定义的指标。指标可以导出到多个报告器,包括JMX、Ganglia、Graphite、Prometheus、StatsD、Datado和Slf4j。
- REST API:Flink 公开了一个 REST API 来提交一个新的应用程序,获取一个正在运行的应用程序的保存点,或者取消一个应用程序。REST API 还公开元数据和收集的正在运行或已完成的应用程序的指标。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY