Flink的定义
- Apache Flink是一个分布式处理引擎,用于处理 无边界数据流, 有边界数据流上金秀贤有状态的计算。Flink能在所有常见的集群环境中运行,并能以内存速度和任意规模进行计算
- 如下Flink官网的一张图
Flink 与Spark的区别
- Flink 中处理所有事件都可以看成是流事件,批数据可以看成是一种特殊的流数据,即有边界数据流
- Spark计算框架则相反,Spark中批处理是基本操作,流处理可以划分为一小批一小批数据进行微批处理,以此达到实时的效果
无界流 & 有界流
- 无界流:有定义流的开始,但是没有定义流的结果,他会无休止的产生数据,无界流的数据必须持续处理,即数据被社区后要立刻处理掉。不可能等所有数据到达后在一次性批处理,因为输入是无限的,任何时候都不会完成,比如用户行为数据
- 有界流:有定义流的开始,也有定义流的结束。有界流可以在的到所有数据之后在统一处理计算。有界流所有数据可以被排序,所以并不需要有序的获取,有界流通畅被称为批处理。
数据架构演变
业务处理-单体架构
- 传统单体架构,初期效率高,后期业务多了,系统复杂庞大,越来越难维护,并且不同业务系统之间可能有一些共同模块,做不到复用。因此演化出微服务
业务处理-微服务架构
- 每一个服务都拆解成不同模块单独部署,独立存储,利用RestApi通讯
- 微服务架构存储上缺点:要做OLAP业务操作的时候,我们需要对企业内部进行数据分析(OLAP)或者数据挖掘之类的应用,需要从n多个不同微服务的DB里面抽数据,将不同数据周期性同步到仓库统一清洗分析处理,最终给结果提供给不同的数据集市场和应用
数据分析-大数据Lambda架构
- 离线数据处理:基于大数据平台构建数据仓库的过程,数据一般周期性同步到大数据平台,完成一系列ETL转换操作后,最终形成数据提供给数据集市展示使用,这就是通常说的离线数分析
- 实时数据处理:对于事实数据处理,例如报表要求是实时性高,必须有非常低的延时统计结果,这就是我们说的事实数据分析
- Lambda 架构缺点:框架太多导致平台复杂性高,运维成本高,例如离线计算用Hive,MapReduce离线计算框架,事实计算需要使用Storm,对应用开发者和运维来说成本很高。
有状态流计算架构
- 基于有状态计算的方式最大的优势是不需要将原市数据重新从外部存储拿出来,从而进行全量计算。例如数据流中的数据都对A进行操作,每一条数据进入操作后都存储中间状态K,之后的操作都以为K为基础计算,结果赋值给K,利用动态规划的思想完成流式计算。K可以存储在内存
- Apache Flink就是有状态流计算框架,通过实现Google DataFlow 流式计算模型实现了高吞吐,低延迟,高性能兼具的事实计算框架,同Flink 海支持高度容错状态管理,防止异常情况的数据丢失。Flink通过分布式快照技术CheckPoint 实现状态持久化维护即使在系统停机或者异常情况最终也能计算出结果
Flink 核心特性
流批一体化
- Flink可以在底层用同样数据抽象和计算模型来进行批处理和流处理。也就是我们定义一套POJO对象,以及POJO对象的计算逻辑,同时应用在批处理和流处理上。这样Flink能帮我们去掉各种流处理,批处理框架,大大降低了架构设计,开发,运维复杂度,可以节省大量人力成本。
同时支持高吞吐,低延迟,高性能
- Apache Spark也只能兼顾高吞吐 和 高性能特性,主要因为在SparkStreaming流式计算中无 法做到低延迟保障
- Apache Storm 只能支持低延迟 和 高性能,但是无法满足高吞吐
- Apache Flink 是唯一能支持 高吞吐,低延迟,高性能三个目标的流式计算框架。
支持事件时间(Event Time)概念
- 流式计算中窗口计算的功能非常重要,大多数框架窗口计算实现用的是系统的时间(Process Time),也就是事件传输到计算框架处理的时间。
- Flink 能支持基于事件时间(Event Time) 语义进行窗口计算,也就是使用事件产生的时间。这种机制使的即使是乱序到达的事件,流系统也能计算出精确结果,比如给A数据改状态,我们就必须按顺序来计算,利用滑动窗口,一个窗口内的数据安EventTime排序来做流式计算,避免了硬件,网络带来的影响
支持有状态计算
- Flink在1.4版本实现状态管理,就是流式计算的过程中将中间结果数据保存在内存或者文件系统中,等下一个事件到来后可以从之前的状态中获取中间结果,从而做到无需每次都基于全部数据统计结果来进行计算,极大提升系统性能。
支持高度灵活的窗口(Window)操作
- 流处理中,数据大多不连续,要通过窗口对一定时间范围内数据进行聚合
- 例如统计过去1分钟多少用户点击网页,我们可以不同维护划分窗口:基于Time,Count,Session,以及Data-driven等类型的窗口操作。可以定义不同窗口出触发机制来满足不同的需求
基于轻量级分布式快照(Snapshot)实现容错
- Flink能分布式运行在上千个节点上,将一个大型计算任务流程拆开成小的计算过程,然后将task粉不到并行节点上进行处理。
- 在任务执行过程中,能够自动发现事件处理过程中的错误而导致数 据不一致的问题,比如:节点宕机、网路传输问题,或是由于用户因为升级或修复问题而导致计算服 务重启等。在这些情况下,通过基于分布式快照技术的Checkpoints,将执行过程中的状态信息进行 持久化存储,一旦任务出现异常停止,Flink就能够从Checkpoints中进行任务的自动恢复,以确保 数据在处理过程中的一致性(Exactly-Once)。
基于JVM实现独立的内存管理
- Flink实现了自身管理内存的机制,尽可能减少JVM GC对系统的影响
- Flink 通过序列化/反序列化方法将所有数据对象转换成二进制在内存中存储,降低数据存储大小同时,能更加有效的对内存空间进行利用,降低GC带来的性能下降或者任务异常的风险,因此Flink更稳定
Save Point(保存点)
- 对于7*24小时运行的流式计算应用,数据源源不断,一段时间内应用重启可能导致数丢失或者计算结果异常。例如进行集群版本升级等停机维护。
- Flink通过SavePints机制,将执行任务快照保存到存储中。任务重启的时候,可以直接从事先保存的SavePoints回复原有的计算状态,使得任务继续按照停机之前的状态运行,SavePoints技术让用户更好管理流式应用
多层级API
- Flink提供多个层级API,用户可以根据自己表达力和易用性的需求来选择,不同API层级可以混用以实现复杂的业务逻辑。
Flink 应用场景
实时智能推荐
- 根据用户历史行为,通过智能推荐算法训练模型,预测用户未来可能做的事件。
复杂事件处理
- 复杂事件处理意义在于,我们需要从多个行为事件触发后的到一个异常的事件结果,也就是当发生了A,B,C,D的时候,我们得出结论E,根据E来做决策,通常这种事件的实时性要求高,我们可以应用Flink SQL进行事件数据的转换
实时欺诈检测
- 金融领域业务,出现各种类型欺诈,例如信用卡盗刷欺诈,贷款申请等,这种以前都需要按小时计算来的的到的数据分析结论显然是无法阻止事件的发生,
- 运用Flink流式计算技术能在几毫秒内完成对欺诈判断,实时对交易流水进行规则判断或者模型预测,这样一旦出现交易存在欺诈,则直接拦截,避免因处理不及时导致经济损失
实时数仓库与ETL
- 对流式数据进行实时清洗,归并,结构化处理,为离线数仓进行补充和优化
流数据分析
- 实时计算各类数据指标,并利用实时结果及时调整在线系统相关策略,在各类内容投放、无线智能推 送领域有大量的应用。流式计算技术将数据分析场景实时化,帮助企业做到实时化分析Web应用或 者App应用的各项指标,包括App版本分布情况、Crash检测和分布等,同时提供多维度用户行为分 析,支持日志自主分析,助力开发者实现基于大数据技术的精细化运营、提升产品质量和体验、增强 用户黏性。
实时报表分析
- 实时报表是很多公司采用的报表统计方案之一,其中最主要的应用便是实时大屏展示。利 用流式计算实时得出的结果直接被推送到前端应用,实时显示出重要指标的变换情况。最典型的案例 便是淘宝的双十一活动的成交额