一、首先看下整个互联网行业所有产品的本质需求:

        存储:大量数据的存储,对应的产品和组件如下,HDFS、HBASE、MySql、Redis、MongoDB、es、时序数据库、图数据库、对象数据库、数据湖

取:单点取(例如MySql中select * from table where id =1)、批量取(类似HBase的范围查询)、全量取(文件上传下载,例如HDFS的文件操作)

分析(计算):计算引擎(MapReduce、Spark、Flink、stom)、分析性数据库(phoenix、hive、OLAP体系)

其他的都是衍生需求,完善政改革体系,保障整个架构平稳安全高效运行的,为业务提供服务,真正的需求是包含在上面三个里面。

二、Flink 设计目的和初衷:

         Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速计算。

flink cdc 读取mysql 库 flink从数据库读取数据_big data

 

      无界数据流:无界数据流有一个开始但是没有结束,它们不会在生成时终止并提供数据,必须连续处理无界流,也就是说必须在获取后立即处理event。对于无界数据流我们无法等待所有数据都到达,因为输入是无界的,并且在任何时间点都不会完成。处理无界数据通常要求以特定顺序(例如事件发生的顺序)获取event,以便能够推断结果完整性,无界流的处理称为流处理。
无界流有一个开始,但没有定义的结束。它们不会在生成数据时终止并提供数据。必须连续处理无边界流,即,事件在被摄入后必须立即处理。等待所有输入数据到达是不可能的,因为输入是无界的,并且不会在任何时间点完成。处理无界数据通常需要以特定的顺序接收事件,例如事件发生的顺序,以便能够推断出结果的完整性。
一种不断增长的,本质上无限的数据集。这些通常被称为“流数据”。然而,当应用于数据集时,术语流或批量是有问题的,这种数据往往意味着使用某种类型的执行引擎来处理这些数据集。两种类型的数据集之间的关键区别在于现实中它们的有限性,因此最好用表示这种区别的术语来表述它们。因此,我将无限的“流”数据集称为无限数据,有限的“批处理”数据集作为有限数据。
有界数据流和无界数据流的区别:
一种持续的数据处理模式,适用于无限数据流。低延迟,近似和/或推测结果通常与流式引擎联系在一起。事实上,批处理系统传统上没有实现低延迟或推测性的结果。
从这里开始,任何时候使用术语“流”,意思都是设计用于无限数据集的执行引擎。当没有附加任何其他术语时,将明确表示无限数据,无限数据处理或低延迟/近似/推测结果。这些是在Google Dataflow中采用的术语。

三、Flink是如何设计来支持各种场景的

        首先来看工作流图

flink cdc 读取mysql 库 flink从数据库读取数据_数据_02

       

        flink可以连接各种数据源,这里即flink的source,通过流或者批的形式将数据接入到flink进行处理。在处理过程中,flink通过有状态(State)的计算,可以将状态进行保存(checkpoint),这里的过程可以是通过时间驱动、事件驱动,而不是像sparkstreaming一样以微批的形式,即自定义一个个微小的批,按照处理时间进行处理,这就是flink的计算过程。计算完成后,flnk将数据写到的下游,这个下游支持很多组件,最佳实践可以结合kafka、hdfs等组件。flink可以部署在不同的环境下,支持大量的业务场景。

四、事件驱动的业务意义

        事件驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。事件驱动型应用是在计算存储分离的传统应用基础上进化而来。在传统架构中,应用需要读写远程事务型数据库。相反,事件驱动型应用是基于状态化流处理来完成。在该设计中,数据和计算不会分离,应用只需访问本地(内存或磁盘)即可获取数据。系统容错性的实现依赖于定期向远程持久化存储写入 checkpoint。下图描述了传统应用和事件驱动型应用架构的区别。

flink cdc 读取mysql 库 flink从数据库读取数据_flink_03

         事件驱动型应用无须查询远程数据库,本地数据访问使得它具有更高的吞吐和更低的延迟。而由于定期向远程持久化存储的 checkpoint 工作可以异步、增量式完成,因此对于正常事件处理的影响甚微。事件驱动型应用的优势不仅限于本地数据访问。传统分层架构下,通常多个应用会共享同一个数据库,因而任何对数据库自身的更改(例如:由应用更新或服务扩容导致数据布局发生改变)都需要谨慎协调。反观事件驱动型应用,由于只需考虑自身数据,因此在更改数据表示或服务扩容时所需的协调工作将大大减少。

        事件驱动型应用会受制于底层流处理系统对时间和状态的把控能力,Flink 诸多优秀特质都是围绕这些方面来设计的。它提供了一系列丰富的状态操作原语,允许以精确一次的一致性语义合并海量规模(TB 级别)的状态数据。此外,Flink 还支持事件时间和自由度极高的定制化窗口逻辑,而且它内置的 ProcessFunction 支持细粒度时间控制,方便实现一些高级业务逻辑。同时,Flink 还拥有一个复杂事件处理(CEP)类库,可以用来检测数据流中的模式。

Flink 中针对事件驱动应用的明星特性当属 savepoint。Savepoint 是一个一致性的状态映像,它可以用来初始化任意状态兼容的应用。在完成一次 savepoint 后,即可放心对应用升级或扩容,还可以启动多个版本的应用来完成 A/B 测试。