Flink应用场景

Apache Flink是一款非常适合做流批处理的计算框架,适用于以下场景:

  • 事件驱动类型,比如:信用卡交易、刷单、监控等;
  • 数据分析类型,比如:库存分析、双11大屏等;
  • 数据管道类型,也就是ETL场景,比如一些日志的解析等;

事件驱动应用程序

任何类型的数据都是作为事件流产生的。信用卡交易、传感器测量、机器日志、网站或移动应用程序上的用户交互,所有这些数据都以流的形式生成。

事件驱动的应用程序是一个有状态的应用程序,它从一个或多个事件流中摄取事件,并通过触发计算、状态更新或外部操作来响应传入的事件。

事件驱动的应用程序是传统应用程序(具有独立的计算层和数据存储层)设计的演化。在这种传统体系结构中,应用程序从远程事务数据库读取数据并将数据持久存储。

而事件驱动的应用程序基于有状态流来处理应用程序。在这种设计中,数据和计算是共存的,从而产生本地(内存或磁盘)数据访问。通过定期将检查点写入远程持久存储,可以实现容错。下图描述了传统应用程序体系结构和事件驱动应用程序之间的区别。

事件驱动的应用程序访问本地数据,而不是查询远程数据库,从而在吞吐量和延迟方面获得更好的性能。远程持久存储的定期检查点可以异步和增量地完成。因此,检查点对常规事件处理的影响非常小。然而,事件驱动的应用程序设计提供的好处不仅仅是本地数据访问。在分层体系结构中,多个应用程序共享同一个数据库是很常见的。因此,需要协调数据库的任何更改,例如由于应用程序更新或扩展服务而更改数据布局。由于每个事件驱动的应用程序都负责自己的数据,因此对数据表示的更改或应用程序的扩展需要较少的协调

事件驱动应用程序的限制由流处理器处理时间和状态的能力来定义。Flink的许多突出特性都围绕这些概念。Flink提供了一组丰富的状态原语,这些原语可以管理非常大的数据量(最多可达几TB),并且具有严格的精确一次性的一致性保证。此外,Flink支持事件时间、高度可定制的窗口逻辑以及ProcessFunction提供的对时间的细粒度控制,从而支持高级业务逻辑的实现。此外,Flink还提供了一个用于复杂事件处理(Complex Event Processing,CEP)的库,用于检测数据流中的模式。

对于事件驱动的应用程序,Flink的突出特性是保存点(savepoint)。保存点是一个一致的状态镜像,可以用作兼容应用程序的起点。给定一个保存点,应用程序可以更新或调整其规模,或者可以启动应用程序的多个版本进行A /B测试。

典型的事件驱动程序包括:

  • 欺诈检测
  • 异常检测
  • 基于规则的提醒
  • 业务流程监控
  • Web应用程序(社交网络)

数据分析应用程序

分析工作从原始数据中提取信息和洞察力。传统上,分析是作为对记录事件的有界数据集的批处理查询或应用程序执行的。为了将最新的数据合并到分析结果中,必须将其添加到分析的数据集中,然后重新运行查询或应用程序。结果被写入存储系统或作为报告发出。

使用复杂的流处理引擎,还可以实时执行分析。流查询或应用程序不是读取有限的数据集,而是摄入实时事件流,并随着事件被消费而不断生成和更新结果。结果要么写入外部数据库,要么作为内部状态维护。例如,Dashboard应用程序可以从外部数据库读取最新结果,也可以直接查询应用程序的内部状态。

Apache Flink支持流以及批处理分析应用程序,如下图所示:

与批处理分析相比,连续流分析的优势并不仅仅在于低延迟(由于消除了周期性导入和查询执行,从事件到洞察的延迟要低得多),另一个方面是更简单的应用程序架构。批处理分析管道由几个独立组件组成,用于定期调度数据摄入和查询执行。可靠地运行这样的管道并不简单,因为一个组件的故障会影响管道的后续步骤。相比之下,流分析应用程序运行在复杂的流处理器(如Flink)上,它包含从数据摄取到连续结果计算的所有步骤。因此,它可以依靠引擎的故障恢复机制。

Flink为连续流和批处理分析提供了非常好的支持。具体来说,它具有一个符合ANSI的SQL接口,具有用于批处理和流查询的统一语义。无论SQL查询是在记录事件的静态数据集上运行,还是在实时事件流上运行,它们都计算相同的结果。对用户定义函数的丰富支持确保可以在SQL查询中执行定制代码。如果需要更多的定制逻辑,Flink的DataStream API或DataSet API提供了更多的底层控制。此外,Flink的Gelly库为批量数据集的大规模和高性能图分析提供了算法和构建块。

典型的数据分析应用程序包括:

  • 电信网络质量监控
  • 移动应用程序中的产品更新及用户体验分析
  • 消费者技术中实时数据的Ad-hoc分析
  • 大规模图分析

数据管道应用程序

提取-转换-加载(Extract-transform-load, ETL)是在存储系统之间转换和移动数据的常用方法。ETL作业通常定期触发,以便将数据从事务性数据库系统复制到分析数据库或数据仓库。

数据管道的作用类似于ETL作业。它们转换和丰富数据,并能将数据从一个存储系统移动到另一个存储系统。然而,它们以连续流模式运行,而不是周期性地触发。因此,它们能够从不断产生数据的源读取记录,并以较低的延迟将其移动到目标。例如,数据管道可以监视文件系统目录中的新文件,并将其数据写入事件日志。另一个应用程序可能将事件流物化到数据库,或者增量地构建和细化搜索索引。

下图描述了周期性ETL作业和连续数据管道之间的区别:

与定期ETL作业相比,连续数据管道的明显优势是减少了将数据移动到其目的地的延迟。此外,数据管道更加通用,可以用于更多的用例,因为它们能够持续地消费和发出数据。

Flink的SQL接口(或Table API)及其对用户定义函数(UDF)的支持可以解决许多常见的数据转换任务。使用更加通用的DataStream API可以实现具有更高要求的数据管道。Flink为各种存储系统(如Kafka、Kinesis、Elasticsearch和JDBC数据库系统)提供了一组丰富的连接器。它还为文件系统提供了连续源,用于监视以时间间隔方式写文件的目录和接收器。

典型的数据管道应用程序包括:

  • 电子商务中的实时搜索索引构建
  • 电子商务中的持续ETL

《PySpark原理深入与编程实战》