得益于其强大的可扩展性,Apache Flink 在开发并运行各种不同类型的应用方面都是一个不错的选择,这些特性包括:
- 对流处理与批处理的支持
- 复杂状态管理
- 事件-时间型的处理方法
- 状态的持续唯一性保证
不仅如此,Flink 还可以部署在各种各样的资源管理平台,如YARN、Apache Mesos 以及 Kubernetes,同时也支持在逻辑上独立运行为一个集群。即便是高可用方面,Flink 也无可挑剔。事实证明,Flink 可以扩展到成千上万个内核,处理TB量级的应用状态,高吞吐,低时延,同时能够hold得住世上大部分流处理应用。
接下来,我们会探索基于Flink 实现的最常见的几种应用,并给一些真实的案例。
- 事件驱动型应用(Event-Driven Applications)
- 数据分析型应用(Data Analytics Applications)
- 数据流水线型应用(Data Pipeline Applications)
事件驱动型应用(Event-driven Applications)
什么是事件驱动型应用?
一个事件驱动型应用往往是一个有状态的应用,该应用从一个或多个事件流源接受事件,并且通过进行相应的计算、状态变更以及其他操作来对这些事件做出响应。
相比传统的应用设计,事件驱动型应用无疑是一个革命。在传统场景中,计算和存储是分开的,应用程序从远程事务数据库读取数据并将数据持久化到该数据库。而事件驱动型应用恰恰相反,它基于一些有状态的流处理应用,数据和计算资源位于一处,从而可以实现本地数据访问(从内存或本地磁盘)。在处理期间,会周期性的拉取本地状态并同步写入远端一个位置来实现容错性这一特征。下面的图表揭示了传统型架构与事件驱动型应用架构的不同:
事件驱动型应用的好处?
高吞吐、低时延:相比传统方式中先存到远程数据库,再读取进行处理,事件驱动型应用直接本地访问事件,并直接处理,从而带来更好的表现。
容错性设计:周期性检查本地任务状态并异步、增量地更新到远端持久层。因此,检查点对常规事件处理的影响非常小。
事件驱动型应用的好处不仅是提供本地数据访问这一点,在传统架构中,多个应用往往共享一个数据库实例,因此每当有数据结构变更时,其他服务往往都需要做一定的配合,或者实例扩容情况出现时,其他服务访问数据库也会受到一定的性能影响。然而,本地化的数据访问模式,使得事件驱动型应用只需要负责自己的数据即可,数据结构的变更以及本应用的扩容操作也只需要较少的协同操作。
Flink 是如何支持事件驱动型应用的?
事件驱动应用程序的限制由流处理器处理时间和状态的能力来定义。Flink的许多突出特征都集中在这些概念上。Flink提供了一组丰富的状态原语,可以管理非常大的数据卷(最多可达几TB),并且精确地保证了一致性。此外,Flink支持事件时间、高度可定制的窗口逻辑和ProcessFunction提供的细粒度时间控制,从而实现了高级业务逻辑。此外,Flink还提供了一个用于复杂事件处理(CEP)的库,用于检测数据流中的模式。
然而,Flink对于事件驱动应用程序的突出特性是savepoint。保存点是一个一致的状态镜像,可以用作兼容应用程序的起点。给定一个保存点,应用程序可以更新或调整其规模,或者可以启动多个应用程序版本以进行A/B测试。
数据分析型应用(Data-Analytics Applications)
什么是数据分析型应用?
分析工作从源数据中抽取并洞察信息。在传统架构中,分析工作往往是基于一个有限的数据集来做批量查询。如果想要得到最新数据的结果,需要不断地把新数据增量加进去再做分析工作。结果会写到存储系统中,或者生成报告。
但是,借助一复杂流处理引擎,分析工作可以实时运行。在这种模式下,应用接收实时数据,并且随着新数据被消费,持续产生新的结果。这些结果要么写到一个外部数据库,要么以内部状态被维护起来。报表应用可以直接从外部数据库或者从本地应用读取最新的数据。Apache Flink 同时支持批处理分析以及流处理分析:
流分析应用的好处是什么?
批处理架构往往由几个独立的组件组成:
- 周期性拉取数据
- 执行查询操作
这些操作带来了时间开销,一旦某个环节出错就会影响整体。而基于复杂流处理引擎(如:Flink )的应用把所有步骤合并到一起:数据抓取、持续结果计算,因此避开了各出错环节,同时可以依赖引擎的错误恢复机制。
Flink 是如何支持数据分析应用型应用的?
Flink 对持续的流处理以及批处理都支持得很好。具体来说,它具有一个符合ANSI标准的SQL接口,该接口具有用于批处理和流式查询的统一语义。不管是查询静态事件记录数据集,还是查询实时事件流,该接口都能计算出相同的结果。丰富的自定义函数使得用户能够在SQL查询中执行自己的代码。如果需要更加定制化的处理逻辑,Flink 的DataStream API 或者DataSet API 也能够提供初级的控制支持。此外,Flink的Gelly库为批量数据集的大规模和高性能图形分析提供了算法和构建块。
数据流水线型应用(Data Pipeline Applications)
什么是数据流水线?
ETL是一种常见的在不同存储系统之间转换、迁移数据的方法。通常来说,他的工作就是周期性的触发数据拷贝动作,从一个关系型数据库,到一个分析型数据库,或者数据仓库。
数据流水线跟ETL的目的是一样的,都是在不同存储系统之间转换、加工、迁移数据,然而他是以一种持续六的模式运行,而不是周期性的触发,因此,它可以从那些持续产生数据的源读取并迁移数据,同时在较低时延的情况下写入另一个数据源。比如说,一个数据流水线可以监控某个文件系统目录中新文件的生成,并且将写入一个事件日志流内,另一个应用就能基于此事件流实现一个增量型的文件搜索引擎。
下面的表格解释了周期性ETL以及持续数据流水线应用的区别:
数据流水线的好处是什么?
最明显的一个好处就是低时延,其次,由于这种模式能够持续的消费并产生数据,因此有更广阔的应用场景。
Flink 是如何支持数据流水线的?
很多常见的数据转换或者加工任务都可以通过Flink 的SQL接口来达成,它也支持自定义处理函数。用户还可以使用DataStream PI来实现更高级的数据流水线需求。Flink 提供了相当丰富的存储系统连接器,如:Kafka、Kinesis、Elasticsearch以及JDBC数据库系统。他也为那些监控文件目录的系统以及以时间桶形式写文件的系统提供持续的数据源支持。