无状态计算:每次数据计算只考虑当前数据,不使用之前数据的计算结果。
[Flink 基石]
目前的共识是,Flink之所以如此受欢迎,离不开它最重要的四个基础:检查点、状态、时间和窗口。
首先是Flink最重要的特性:检查点机制。 Flink 实现了分布式一致性快照,从而提供了Once-once 语义。 Flink之前的流计算系统并没有很好地解决这个问题。
所有具有一定复杂程度的流处理应用程序都是有状态的。在提供一致的语义之后,Flink 引入了托管状态,并提供了API 接口,可以让用户在编程时轻松管理状态,感觉就像使用集合类一样。
流处理的一个重要方面是应用程序如何测量时间,即如何区分事件时间和处理时间。 Flink 实现了水印机制来解决基于事件时间处理时数据混乱和滞后的问题。
最后,由于流计算通常是基于窗口进行计算的,因此Flink 提供了一组现成的窗口操作,包括滚动窗口、滑动窗口和会话窗口。它还支持高度灵活的自定义窗口,以满足特殊要求。业务需求。
02 Flink核心架构
Flink 采用分层架构设计,明确各层的功能和职责。如图所示,从上到下依次为API库层、运行时核心层、物理部署层。
【API Libraries 层】
该层主要提供编程API和顶级类库。
编程API : 用于流处理的DataStream API 和用于批处理的DataSet API。
顶级类库:包括用于复杂事件处理的库、用于结构化数据查询的SQL表库、基于批处理的机器学习库和图形处理库。
【Runtime 核心层】
该层是Flink分布式计算框架的核心实现层,包括作业转换、任务调度、资源分配、任务执行等功能,并且基于该层的实现,流处理程序可以同时执行。流引擎和批处理程序。
【 物理部署层】
Flink的物理部署层用于支持各种平台上的应用部署。 Flink可以运行在YARN、Kubernetes等多种资源管理框架上,同时支持裸机集群上的独立部署。启用高可用性选项可以消除单点故障。 Flink 已被证明可以扩展到数千个核心,其状态可以达到TB 级别,同时保持高吞吐量和低延迟。
03 Flink分层API
在上面介绍的API库层面,Flink做了更具体的划分。
根据图中所示的层次结构,API一致性自下而上递增,接口性能能力自下而上递减。每层的核心功能是:
【SQL Table API】
Flink 提供的最高抽象级别是SQL。
Flink 支持两种关系型API:Table API 和SQL。这两个API都是批处理和流处理的统一API。这意味着关系API 对于无限的实时数据流和有限的历史数据流使用相同的语义进行查询并产生相同的结果。支持用户定义标量、聚合和表值函数,满足各种查询需求。
【DataStream API】
DataStream DataSet API支持Java或Scala语言调用,提供数据读取、数据转换、数据输出等一组常用操作的封装。
DataStream API 为许多常见的流处理操作提供了处理原语。这些操作包括窗口和每条记录的转换操作、处理事件时的外部数据库查询以及预定义函数,例如map()、reduce()和aggregate()。您可以扩展和实现预定义的接口或使用lambda 表达式来实现自定义函数。
【ProcessFunction】
ProcessFunction 是Flink 提供的最具表现力的接口,允许您处理来自一个或两个输入数据流的单个事件,或在特定窗口中分组的多个事件。您可以精确控制时间和状态。开发人员可以基于单个事件任意更改状态并实现复杂的业务逻辑,这在许多有状态事件驱动的应用程序中都是必需的。
04 Flink 核心组件
Flink核心架构的第二层是运行时层,其中包括两个重要角色:作业管理器和任务管理器。这是典型的主/从架构。 JobManager 是主设备,TaskManager 是从设备。他们的特点是:
(1) 作业管理器(JVM 进程)
负责集群范围内的资源管理和任务调度。集群中只能运行(活动)一个作业管理器。如果是HA集群,其他作业管理器就会处于待命状态。
(1)资源管理。当集群启动时,任务管理器向作业管理器注册当前节点的资源信息。一旦所有任务管理器都注册完毕,集群就会成功启动。此时作业管理器会根据集群中的资源情况,为当前应用程序分配任务槽资源。
(2)任务调度。作业执行过程中,作业管理器根据配置的策略触发检查点,向客户端反馈作业执行信息,并释放资源。
(2)任务管理器(JVM进程)
(1)负责执行当前节点上的任务和管理资源。 TaskManager资源按TaskSlot划分。例如,具有三个插槽的任务管理器将其管理的内存资源分为每个插槽的三个相等的部分。
(2)负责任务管理器之间的数据交换。
05 Flink应用场景
世界各地许多要求严格的流处理应用程序都在Flink 上运行。接下来我们将介绍一些常见的应用:事件驱动应用、数据分析应用、数据管道应用。
【事件驱动型应用】
事件驱动应用程序是一种有状态应用程序,它从一个或多个事件流中提取数据,并根据传入事件触发计算、状态更新或其他外部操作。
传统架构要求应用程序读取和写入远程事务数据库。相反,事件驱动的应用程序是从计算和存储分离并基于有状态流处理的传统应用程序发展而来的。在这种设计中,数据和计算没有分离,应用程序只需要在本地(内存或磁盘)访问数据。实现系统容错依赖于定期将检查点写入远程持久存储。下图说明了传统应用程序架构和事件驱动应用程序架构之间的区别。
事件驱动的应用程序不需要查询远程数据库,本地数据访问可以提高吞吐量并减少延迟。常见应用示例:欺诈预防、异常检测、基于规则的警报、业务流程监控等。
【数据分析应用】
数据分析任务需要从原始数据中提取有价值的信息和指标。传统的分析方法通常是通过使用批量查询或日志事件并基于它们构建应用程序来实现的。要获得最新的数据分析结果,必须首先将数据添加到分析数据集中,重新运行查询或运行应用程序,然后将结果写入存储系统。
借助一些先进的流处理引擎还可以实时进行数据分析。与读取有限数据集的传统模式不同,流式查询访问实时事件流,并在事件被消耗时不断生成和更新结果。该结果数据可以写入外部数据库系统或以内部状态的形式维护。
如图所示,Flink 很好地支持连续流式分析和批量分析。具体来说,其内置的SQL 接口集成了批处理和流式查询语义。无论您使用的是记录事件的静态数据集还是实时事件流,相同的SQL 查询都会产生一致的结果。典型应用示例包括:电信网络中的质量监控、移动应用中的产品更新和实验评估分析、消费技术中的实时数据临时分析和大规模图形分析等。
【数据管道应用】
提取、转换和加载(ETL) 是在存储系统之间转换和迁移数据的常用方法。 ETL 作业通常会定期触发,以将数据从事务数据库复制到分析数据库或数据仓库。
数据管道和ETL 作业具有类似的目的,即转换、丰富数据并将数据从一个存储系统移动到另一个存储系统。但是,数据管道以连续流模式运行,而不是定期触发。因此,支持从不断产生数据的源读取记录并将其移动到低延迟的端点。例如,您可以使用数据管道来监视文件系统目录中的新文件并将该数据写入事件日志。此外,另一个应用程序可以将事件流具体化到数据库中,或者增量地构建和优化查询索引。
如图所示,与定期ETL 作业相比,连续数据管道可以显着减少将数据移动到目的地的延迟。此外,数据可以连续消耗和传输,使其更加通用并支持更多用例。许多常见的数据转换和扩展操作都可以使用Flink的接口和用户自定义函数来解决。典型应用示例:电子商务中的实时查询索引构建、电子商务中的连续ETL等。
06 Flink的优势与挑战
【Flink 的优点】
基于上面的介绍,我们总结一下Flink的好处。
1)Flink是一个事件驱动的应用程序,可以同时支持流处理和批处理,并且可以与Watermark结合处理乱序数据。
2) 同时支持高吞吐量、低延迟和高性能。
3) 基于内存的计算可确保高吞吐量和低延迟,从而实现卓越的性能。
4)支持once-once语义,充分保证一致性和正确性。
5)支持有状态计算,可以将状态存储在内存或RocksDB中。
6) 分层API。它可以满足您任何级别的开发需求。
7) 支持高可用配置和保存点机制,保证安全稳定。
8) 支持多种部署方式,本地、远程、云端等多种部署方案。
9)具有水平扩展架构,可根据用户需求动态扩展。
10) 有非常活跃的社区和完整的生态系统的支持。
【Flink面临的挑战】
Flink目前的流计算模型已经比较成熟和先进,并且已经被各个公司量产验证。它属于大数据生态系统的计算环节,只进行计算,不进行存储。然而,在现实工作中,仅使用Flink 通常是不够的。比如数据从哪里读取、计算后数据存放在哪里、数据如何使用、如何使用Flink完成特定垂直领域的特殊任务等。
同时,使用Flink 执行其他场景(机器学习、交互式分析等)变得更加复杂,用户体验仍有很大的改进空间。这些都有上下游关系,需要强大的生态系统来完成。这正是Flink生态面临的挑战。
版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。