0
点赞
收藏
分享

微信扫一扫

第12章 Flink

企业数据架构的演进:传统数据处理架构、大数据Lambda架构、流程处理架构。

Flink是一种具有代表性的开源流处理架构,它实现了Google Dataflow流计算模型,是一种兼具高吞吐、低延迟和高性能的实时流计算框架,并且同时支持批处理和流处理。

Flink的主要特性包括:批流一体化、精密的状态管理、事件时间支持以及精确一次(Exactly-once)的状态一致性保障等。

12.1 Flink简介

Flink是Apache软件基金会的一个顶级项目,是为分布式、高性能、随时可用和准确的流处理应用程序打造的开源流处理架构,同时支持实时计算和批量计算。

Flink源自Stratosphere项目,该项目是在2010年到2014年由柏林工业大学、柏林洪堡大学和哈索普拉特纳研究所联合开展的。

2014年4月,Stratosphere代码被贡献给Apache软件基金会,成为Apache软件基金会孵化器项目。团队大部分成员创办了一家Data Artisans的公司。在项目孵化期间,为了避免与另外一个项目发生重名,Stratosphere被重新命名为Flink。德语中,Flink是“快速和灵巧”的意思。项目使用一只棕色的松鼠图案作为标志。

2014年12月,Flink项目成为Apache软件基金会顶级项目。

12.2 为什么选择Flink

12.2.1 传统数据处理架构

传统数据处理架构的一个显著特点就是采用一个中心化的数据库系统来存储事务性数据。

借助关系数据库进行数据存储的数据仓库

12.2.2 大数据Lambda架构

基于Hadoop构建的数据仓库,利用MapReduce、Spark进行数据分析

基于Lambda架构的数据仓库;大数据Lambda架构主要包含两层,即批处理层和实时处理层,在批处理层中,采用MapReduce、Spark等技术进行批量数据处理,在实时处理层中,则采用Storm、Spark Streaming等技术进行数据实时处理。

12.2.3 流处理架构

 以流为基础的架构设计,让数据记录持续地从数据源流向应用程序,并在各个应用程序间持续流动。流处理架构不需要设置一个数据库来集中存储全局状态数据,取而代之 的是共享且永不停止的流数据,它是唯一正确的数据源,记录了业务数据的历史。

消息传输层从各种数据源采集连续事件产生的数据,并传输给订阅了这些数据的应用程序;流处理层会持续地将数据在应用程序和系统间移动,聚合并处理事件,并在本地维持应用程序的状态。这里所谓的“状态”就是计算过程中产生的中间计算结果,在每次计算中,新的数据进入流系统,都在中间状态结果的基础上进行计算,最终产生正确的计算结果。

流处理架构的核心是使各种应用程序互连在一起的消息队列,消息队列连接应用程序,并作为新的共享数据源,这些消息队列取代了从前的大型集中式数据库。

流处理架构正在逐步取代传统数据处理架构和Lambda架构,成为大数据处理架构的一种新的趋势。

(1)流处理架构中不存在一个大型集中式数据库,因此,避免了传统数据处理架构中存在的“数据库不堪重负”的问题

(2)流处理架构中,批处理被看成流处理的一个子集,因此,可以用面向流处理的框架进行批处理,即可以用一个流处理架构来统一处理流计算和批量计算,避免了Lambda架构中存在的“多个架构难管理”的问题。

12.2.4 Flink是理想的流计算框架

流处理架构的要求:低延迟、高吞吐、高性能

Strom:能做到低延迟,无法实现高吞吐,也不能在故障发生时准确地处理计算状态。

Spark Streaming:通过采用微批处理方法实现了高吞吐和容错性,但无法实现低延迟

Flink:实现了Google Dataflow流计算模型,兼顾高吞吐、低延迟和高性能,并同时支持批处理和流处理。此外,Flink支持高度容错的状态管理。

12.2.5 Flink的优势

1、同时支持高吞吐、低延迟、高性能

2、同时支持流处理和批处理

3、高度灵活的流式窗口

流计算以窗口为基本单元进行数据处理。窗口可以是时间驱动的(Time Window,例如每30秒),也可以是数据驱动的(Count Window,例如每100个元素)。窗口可以分为翻滚窗口(Tumbling Window,无重叠)、滚动窗口(Sliding Window,有重叠)和会话窗口(Session Window)

4、支持有状态计算

流计算分为无状态和有状态两种情况。无状态计算观察每个独立的事件,并根据最后一个事件输出结果,Storm就是无状态的计算框架,每一条消息来了以后,彼此都是独立的,和前后都没有关系。有状态计算则会基于多个事件输出结果。

5、具有良好的容错性

6、具有独立的内存管理

7、支持迭代和增量迭代

12.3 Flink应用场景

Flink常见的应用场景包括事件驱动型应用、数据分析应用和数据流水线应用。

12.3.1 事件驱动型应用

1、什么是事件驱动型应用

事件驱动型应用是一类具有状态的应用,它从一个或多个事件数据流中读取事件,并根据到来的事件做出反应,包括触发计算、状态更新或其他外部动作等。事件驱动型应用是在传统的应用设计基础上进化而来的。

 

事件驱动型应用是建立 在有状态流处理应用的基础之上的。在这种设计中,数据和计算不是相互独立的层,而是放在一起的,应用只需访问本地(内存或磁盘)即可获取数据。系统容错性是通过定期向远程持久化存储写入检查点来实现的。

典型的事件驱动型应用包括反欺诈、异常检测、基于规则的报警、业务流程监控、Web应用(社交网络)等。

2、事件驱动型应用的优势

事件驱动型应用访问本地数据,在吞吐量、低延迟方面可以获得更好的性能。

向一个远程的持久化存储周期性地写入检查点,可以采用异常和增量的方式来实现。因此,检查点对于常规的事件处理的影响是很小的。

每个事件驱动型应用都只需要考虑自身的数据,对数据表示方式的改变或者应用的升级,都只需要做很少的协调工作。

3、Flink是如何支持事件驱动型应用的

一个流处理器如何很好地处理时间和状态,决定了事件驱动型应用的局限性。Flink提供了丰富的状态操作原语,它可以管理大量的数据,并且可以确保“精确一次”的一致性。

Flink还支持事件时间、高度可定制的窗口逻辑和细粒度的时间控制。

Flink拥有一个复杂事件处理(Complex Event Processing,CEP)类库,可以用来检测数据流中的模式。

Flink中针对事件驱动应用的突出特性当属“保存点(Savepoint)”。保存点是一个一致性的状态镜像,它可以作为许多相互兼容的应用的一个初始化点。

12.3.2 数据分析应用

1、什么是数据分析应用

分析作业会从原始数据中提取信息,并得到洞察结果。

传统数据分析通常先对事件进行记录,然后在有界的数据集上进行批量查询。为了把新的数据融入查询结果中,必须把这些最新的数据添加到被分析的数据集中,然后重新运行查询。查询的结果会被写入一个存储系统中,或者形成报表。

高级的流处理引擎,可以支持实时的数据分析。获取实时事件流,并连续产生和更新查询结果。

Apache Flink同时支持批量分析及流式分析应用。

典型的数据分析应用包括电信网络质量监控、移动应用中的产品更新及实验评估分析、消费者技术中的实时数据即席分析、大规模图分析等。

2、流式分析应用的优势

(1)由于消除了周期性的导入和查询,因此从事件中获取洞察结果的延迟更低

(2)流式分析不需要处理输入数据中的人为产生的边界

(3)流式分析具有更加简单的应用架构

3、Flink是如何支持数据分析应用的

(1)Flink提供了一个符合ANSI规范的SQL接口,它可以为批处理和流处理提供一致的语义。

(2)Flink提供了丰富的用户自定义函数,使得用户可以在SQL查询中执行自定义代码。

(3)Flink的Gelly库为基于批量数据集的大规模、高性能的图分析提供了算法和构建模块支持。

12.3.3 数据流水线应用

1、什么是数据流水线

ETL是一个在存储系统之间转换和移动数据的常见方法。ETL作业会被周期性地触发,从而把事务型数据库系统中的数据复制到一个分析型数据库或数据仓库中。

数据流水线可以实现和TEL类似的功能,它们以一种连续的流模式来执行数据的转换、清洗数据,或者把数据从一个存储系统转移到另一个存储系统中,而不是周期性地触发。

典型的数据流水线应用包括电子商务中的实时查询索引构建、电子商务中的持续ETL等。

2、数据流水线的优势

连续的数据流水线的优势是减少了数据转移过程的延迟。此外,由于它能够持续消费和发送数据,因此用途更广,支持用户例更多。

3、Flink如何支持数据流水线应用

Flink的SQL接口以及丰富的用户自定义函数,可以解决许多常见的数据转换问题。

通过使用更具通用性的DataStream API,还可以实现具有更加强大功能的数据流水线。

Flink提供了大量的连接器,可以连接到各种不同类型的数据存储系统。

Flink提供了面向文件系统的连续型数据源,可用来监控目录变化,并提供了数据槽,支持以时间分区的方式写入文件。

12.4 Flink技术栈

Flink核心组件栈分为 三层:物理部署层、Runtime核心层和API&Libraries层。

1、物理部署层

Flink的底层是物理部署层。Flink可以采用Local模式运行,启动单个JVM,也可以采用Standalone集群模式运行,还可以采用YARN集群模式运行,或者也可以运行在谷歌云服务(GCE)和亚马逊服务(EC2)上。

2、Runtime核心层

该层主要负责对上层不同接口提供基础服务,也是Flink分布式计算框架的核心实现层。该层提供了两套核心的API:流处理(DataStream API)和批处理(DataSet API)

3、API&Libraries层

作为分布式数据库处理框架,Flink提供了支撑流计算和批计算的接口,同时,在此基础上抽象出不同的应用类型的组件库。如CEP(基于流处理的复杂事件处理库)、SQL&Table(即可以基于流处理,也可以基于批处理)、FlinkML(基于批处理的机器学习库)、Gelly(基于批处理的图计算库)等。

12.5 Flink体系架构

Flink体系架构主要由两个组件组成,分别为JobManager和TaskManager,Flink体系架构也遵循Master/Slave架构设计原则,JobManager为Master节点,TaskManager为Slave节点。

 

在执行Flink程序时,Flink程序需要首先提交给Job Client,然后,Job Client将作业提交给JobManager。JobManager负责协调资源分配和作业执行,它首先要做的是分配所需的资源。资源分配完成后,任务将提交给相应的TaskManager。在接收任务时,TaskManager启动一个线程以开始执行。执行到位时,TaskManager会继续向JobManager报告状态更改。作业可以有各种状态。作业执行完后,其结果将发送回客户端(Job Client)。

12.6 Flink编程模型

在Flink编程模型中,最低级的抽象接口是状态化的数据流接口。这个接口通过过程函数(Process Function)被集成到DataStream API中。该接口允许用户自由地处理来自一个或多个流中的事件,并使用一致的容错状态。另外,用户也可以通过注册事件时间并处理回调函数的方法来实现复杂的计算。

实际上,大多数应用并不需要上述的底层抽象,而只需针对核心AP (Core APIs)进行编程,比如DataStream API(有界或无界流数据)以及DataSet API(有界数据集)。这些API为数据处理提供了大量的通用模块,比如用户定义的各种各样的转换( Transformation)、连接(Join)、聚合(Aggregation)、窗口(Window)等。DataStream API集成了底层的处理函数,使得可以对一些特定的操作提供更低层次的抽象。DataSet API为有界数据集提供了额外的支持,例如循环与迭代。

Table API以表为中心,能够动态地修改表(在表达流数据时)。Table API是一种扩展的关系模型:表有二维数据结构(类似于关系数据库中的表),同时API提供可比较的操作,例如select、project、join、group-by、aggregate等。Table API程序定义的是应该执行什么样的逻辑操作,而不是直接准确地指定程序代码运行的具体步骤。尽管Table API可以通过各种各样的用户自定义函数(User Defined Function, UDF )进行扩展,但是它在表达能力上仍然比不上核心API,不过,它使用起来会更加简洁(代码量更少)。除此之外,Table API程序在执行之前会通过内置优化器进行优化。用户可以在表与DataStream/DataSet 之间无缝切换,以允许程序将Table API与DataStream API/DataSet API混合使用。

Flink提供的最高级接口是SQL。这一层抽象在语法与表达能力上与Table API类似,唯一的区别是通过SQL实现程序。SQL抽象与Table API交互密切,同时SQL查询可以直接在Table API定义的表上执行。

举报

相关推荐

0 条评论