一、Flink简介

1.1、Flink的定义

Apache Flink 是一个框架和分布式处理引擎,用于在无边界有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。

1.2、Flink的发展

Flink在德语中是快速和灵敏的意思,用来体现流式数据处理器速度快和灵活性强等特点,因此使用棕红色松鼠图案其Logo。

Flink在诞生在2010-2014 年间, 由柏林工业大学、 柏林洪堡大学和哈索普拉特纳研究所联合发起名为“Stratosphere:Information Management on the Cloud”研究项目。2014年4月,Stratosphere代码被贡献给Apache软件基金会, 成为Apache基金会孵化器项目, 由此,Flink 正式进入社区开发者的视线。

2014 年 12 月,该项目成为 Apache 软件基金会顶级项目,从2015年 9 月发布第一个稳定版本 0.9, 到目前为止已经发布到 1.9 的版本, 更多的社区开发成员逐步加入,现在Flink在全球范围内拥有350多位开发人员,不断有新的特性发布。同时在全球范围内,越来越多的公司开始使用Flink,在国内比较出名的互联网公司如阿里巴巴、美团、滴滴等,都在大规模使用 Flink 作为企业的分布式大数据处理引擎。

二、Flink的特点与优势

2.1、同时具备高吞吐、低延迟、高性能特性

Flink是目前开源社区中唯一套集高吞吐、低延迟、高性能三者于一身的分布式流式数据处理框架。像 Apache Spark 也只能兼顾高吞吐和高性能特性,主要因为在Spark Streaming 流式计算中无法做到低延迟保障;而流式计算框架 Apache Storm只能支持低延迟和高性能特性,但是无法满足高吞吐的要求。而满足高吞吐、低延迟、高性能这三个目标对分布式流式计算框架来说是非常重要的。

2.2、支持事件时间(Event Time)概念

在流式计算领域中, 窗口计算的地位举足轻重, 但目前大多数框架窗口计算采用的都是系统时间(Process Time),即事件传输到计算框架处理时,系统主机的当前时间。Flink 能够支持基于事件时间(Event Time)语义进行窗口计算,也就是使用事件产生的时间,这种基于事件驱动的机制使得事件即使乱序到达, 流系统也能够计算出精确的结果,保持了事件原本产生时的时序性,尽可能避免网络传输或硬件系统的影响。

2.3、支持有状态计算

Flink 在 1.4 版本中实现了状态管理,所谓状态就是在流式计算过程中将算子的中间结果数据保存在内存或者文件系统中, 等下一个事件进入算子后可以从之前的状态中获取中间结果中计算当前的结果, 从而无须每次都基于全部的原始数据来统计结果,
种方式极大地提升了系统的性能, 并降低了数据计算过程的资源消耗。 对于数据量大且运算逻辑非常复杂的流式计算场景,有状态计算发挥了非常重要的作用。

2.4、支持高度灵活的窗口(Window)操作

在流处理应用中, 数据是连续不断的, 需要通过窗口的方式对流数据进行一定范围的聚合计算,例如统计在过去的 1 分钟内有多少用户点击某一网页,在这种情况下,我们必须定义一个窗口, 用来收集最近一分钟内的数据, 并对这个窗口内的数据进行再计算。Flink 将窗口划分为基于 Time、Count、Session,以及 Data-driven 等类型的窗口操作, 窗口可以用灵活的触发条件定制化来达到对复杂的流传输模式的支持, 用户可以定义不同的窗口触发机制来满足不同的需求。

2.5、基于轻量级分布式快照(CheckPoint)实现的容错

Flink够分布式运行在上千个节点上,将一个大型计算任务的流程拆解成小的计算过程,然后将task分布到并行节点上进行处理。在任务执行过程中,能够自动发现 事件处理过程中的错误而导致数据不一致的问题,比如:节点宕机、网路传输问题,或是由于用户因为升级或修复问题而导致计算服务重启等。在这些情况下,通过基于分布式快照技术的Checkpoints,将执行过程中的状态信息进行持久化存储,一旦任务出现异常停止,Flink就能够从Checkpoints中进行任务的自动恢复,以确保数据在处理过 程中的一致性(Exactly-Once)

2.6、基于 JVM 实现独立的内存管理

内存管理是所有计算框架需要重点考虑的部分,尤其对于计算量比较大的计算场景,数据在内存中该如何进行管理显得至关重要。针对内存管理,Flink 实现了自身管理内存的机制,尽可能减少 JVM GC 对系统的影响。另外,Flink通过序列化/反序列化方法将所有的数据对象转换成二进制在内存中存储,降低数据存储的大小的同时,能够更加有效地对内存空间进行利用,降低 GC 带来的性能下降或任务异常的风险,因此Flink 较其他分布式处理的框架会显得更加稳定,不会因为 JVM GC 等问题而影响整个应用的运行。

2.7、Save Points(保存点)

对于 7*24 小时运行的流式应用,数据源源不断地接入,在一段时间内应用的终止有可能导致数据的丢失或者计算结果的不准确, 例如进行集群版本的升级、 停机运维操作等操作。值得一提的是Flink 通过 Save Points 技术将任务执行的快照保存在存储介质上,当任务重启的时候可以直接从事先保存的 Save Points 恢复原有的计算状态,使得任务继续按照停机之前的状态运行,Save Points 技术可以让用户更好地管理和运维实时流式应用。

三、为什么要使用Flink

常见流式计算框架的对比

产品

模型

API

保证次数

容错机制

状态管理

延时

吞吐量

Storm

Native

组合式(基础API)

At-least-once

Record  ACK




Trident

Micro-Batching

组合式

Exactly-Once

Record  ACK

基于操作,每次操作有一个状态

中等

中等

SparkStreaming

Micro-Batching

声明式高阶函数

Exactly-Once

基于RDD做Checkpoint

基于DStream

中等


Flink

Native

声明式

Exactly-Once

Checkpoint,Flink的一种快照

基于操作



模型:Storm 和 Flink 是真正的一条一条处理数据;而 Trident(Storm 的封装框架)和 Spark Streaming 其实都是小批处理,一次处理一批数据(小批量)。
API:Storm 和 Trident 都使用基础 API 进行开发,比如实现一个简单的 sum 求和操作;而 Spark Streaming 和 Flink 中都提供封装后的高阶函数,可以直接拿来使用,这样就比较方便了。
保证次数:在数据处理方面,Storm 可以实现至少处理一次,但不能保证仅处理一次,这样就会导致数据重复处理问题,所以针对计数类的需求,可能会产生一些误差;Trident 通过事务可以保证对数据实现仅一次的处理,Spark Streaming和Flink也是
如此。
容错机制:Storm和Trident可以通过ACK机制实现数据的容错机制, 而Spark Streaming和 Flink 可以通过 CheckPoint 机制实现容错机制。状态管理:Storm 中没有实现状态管理,Spark Streaming 实现了基于 DStream 的状态管理,而 Trident 和 Flink 实现了基于操作的状态管理。
延时:表示数据处理的延时情况, 因此 Storm 和 Flink 接收到一条数据就处理一条数据,其数据处理的延时性是很低的;而 Trident 和 Spark Streaming 都是小型批处理,它们数据处理的延时性相对会偏高。
吞吐量:Storm 的吞吐量其实也不低,只是相对于其他几个框架而言较低;Trident 属于中等;而 Spark Streaming 和 Flink 的吞吐量是比较高的。

综上,主要是因为Flink的高吞吐、低延迟、高性能等特性优于其它同类产品,使得越来越多的公司更青睐它。

四、 Flink的应用场景

在实际生产的过程中,大量数据在不断地产生,例如金融交易数据、互联网订单数据、GPS 定位数据、传感器信号、移动终端产生的数据、通信信号数据等,以及我们熟悉的网络流量监控、 服务器产生的日志数据, 这些数据最大的共同点就是实时从不同的数据源中产生,然后再传输到下游的分析系统。针对这些数据类型主要包括实时智能推荐、复杂事件处理、实时欺诈检测、实时数仓与 ETL 类型、流数据分析类型、实时报表类型等实时业务场景,而Flink 对于这些类型的场景都有着非常好的支持。

4.1、实时智能推荐

智能推荐会根据用户历史的购买行为, 通过推荐算法训练模型, 预测用户未来可能会购买的物品。对个人来说,推荐系统起着信息过滤的作用,对 Web/App 服务端来说,推荐系统起着满足用户个性化需求,提升用户满意度的作用。推荐系统本身也在飞速发展,除了算法越来越完善, 对时延的要求也越来越苛刻和实时化。 利用 Flink 流计算帮助用户构建更加实时的智能推荐系统,对用户行为指标进行实时计算,对模型进行实时更新,对用户指标进行实时预测,并将预测的信息推送给 Wep/App 端,帮助用户获取想要的商品信息,另一方面也帮助企业提升销售额,创造更大的商业价值。

4.2、复杂事件处理

对于复杂事件处理,比较常见的案例主要集中于工业领域,例如对车载传感器、机械设备等实时故障检测, 这些业务类型通常数据量都非常大, 且对数据处理的时效性要求非常高。通过利用 Flink 提供的 CEP(复杂事件处理)进行事件模式的抽取,同时应用 Flink 的 Sql进行事件数据的转换,在流式系统中构建实时规则引擎,一旦事件触发报警规则,便立即将告警结果传输至下游通知系统,从而实现对设备故障快速预警监测,车辆状态监控等目的。

4.3、实时欺诈检测

在金融领域的业务中,常常出现各种类型的欺诈行为,例如信用卡欺诈、信贷申请欺诈等,而如何保证用户和公司的资金安全,是来近年来许多金融公司及银行共同面对的挑战。随着不法分子欺诈手段的不断升级,传统的反欺诈手段已经不足以解决目前所面临的问题。以往可能需要几个小时才能通过交易数据计算出用户的行为指标, 然后通过规则判别出具有欺诈行为嫌疑的用户,再进行案件调查处理,在这种情况下资金可能早已被不法分子转移,从而给企业和用户造成大量的经济损失。 而运用 Flink 流式计算技术能够在毫秒内就完成对欺诈判断行为指标的计算, 然后实时对交易流水进行规则判断或者模型预测, 这样一旦检测出交易中存在欺诈嫌疑, 则直接对交易进行实时拦截, 避免因为处理不及时而导致的经济损失。

4.4、实时数仓与 ETL

结合离线数仓, 通过利用流计算诸多优势和 SQL 灵活的加工能力, 对流式数据进行实时清洗、归并、结构化处理,为离线数仓进行补充和优化。另一方面结合实时数据 ETL 处理能力, 利用有状态流式计算技术, 可以尽可能降低企业由于在离线数据计算过程中调度逻辑的复杂度, 高效快速地处理企业需要的统计结果, 帮助企业更好地应用实时数据所分析出来的结果。

4.5、流数据分析

实时计算各类数据指标, 并利用实时结果及时调整在线系统相关策略, 在各类内容投放、无线智能推送领域有大量的应用。 流式计算技术将数据分析场景实时化, 帮助企业做到实时化分析 Web 应用或者 App 应用的各项指标,包括 App 版本分布情况、Crash 检测和分布等,同时提供多维度用户行为分析, 支持日志自主分析, 助力开发者实现基于大数据技术的精细化运营、提升产品质量和体验、增强用户黏性。

4.6、实时报表分析

实时报表分析是近年来很多公司采用的报表统计方案之一, 其中最主要的应用便是实时大屏展示。 利用流式计算实时得出的结果直接被推送到前端应用, 实时显示出重要指标的变换情况。最典型的案例便是淘宝的双十一活动,每年双十一购物节,除疯狂购物外,最引人注目的就是天猫双十一大屏不停跳跃的成交总额。 在整个计算链路中包括从天猫交易下单购买到数据采集、数据计算、数据校验,最终落到双十一大屏上展现的全链路时间压缩在5秒以内,顶峰计算性能高达数三十万笔订单/秒,通过多条链路流计算备份确保万无一失。而在其他行业,企业也在构建自己的实时报表系统,让企业能够依托于自身的业务数据,快速提取出更多的数据价值,从而更好地服务于企业运行过程中。