Flink(⼀)Flink是什么,特点和优势,应⽤场景在当前数据量激增的时代,各种业务场景都有⼤量的业务数据产⽣,对于这些不断产⽣的数据应该如何进⾏有效的处理,成为当下⼤多数公司所⾯临的问题。⽬前⽐较流⾏的⼤数据处理引擎 Apache Spark,基本上已经取代了 MapReduce 成为当前⼤数据处理的标准。但对实时数据处理来说,Apache Spark 的 Spark-Streaming 还有性能改进的空间。对于Spark-Streaming 的流计算本质上还是批(微批)计算,Apache Flink 就是近年来在开源社区不断发展的技术中的能够同时⽀持⾼吞吐、低延迟、⾼性能的纯实时的分布式处理框架。
1. Flink 是什么?
1) Flink 的发展历史
在 2010 年⾄ 2014 年间,由柏林⼯业⼤学、柏林洪堡⼤学和哈索普拉特纳研究所联合发起名为“Stratosphere:Information Management on the Cloud”研究项⽬,该项⽬在当时的社区逐渐具有了⼀定的社区知名度。2014 年 4 ⽉,Stratosphere 代码被贡献给 Apache软件基⾦会,成为Apache基⾦会孵化器项⽬。初期参与该项⽬的核⼼成员均是Stratosphere曾经的核⼼成员,之后团队的⼤部分创始成员离开学校,共同创办了⼀家名叫 Data Artisans的公司,其主要业务便是将 Stratosphere,也就是之后的 Flink 实现商业化。在项⽬孵化期间,项⽬ Stratosphere 改名为 Flink。Flink 在德语中是快速和灵敏的意思,⽤来体现流式数据处理器速度快和灵活性强等特点,同时使⽤棕红⾊松⿏图案作为 Flink 项⽬的 Logo,也是为了突出松⿏灵活快速的特点,由此,Flink 正式进⼊社区开发者的视线。
2014 年 12 ⽉,该项⽬成为 Apache 软件基⾦会顶级项⽬,从 2015 年 9 ⽉发布第⼀个稳定版本 0.9,到⽬前为⽌已经发布到 1.9的版本,更多的社区开发成员逐步加⼊,现在 Flink在全球范围内拥有 350 多位开发⼈员,不断有新的特性发布。同时在全球范围内,越来越多的公司开始使⽤ Flink,在国内⽐较出名的互联⽹公司如阿⾥巴巴、美团、滴滴等,都在⼤规模使⽤ Flink 作为企业的分布式⼤数据处理引擎。
2) Flink 的定义
Apache Flink 是⼀个框架和分布式处理引擎,⽤于在⽆边界和有边界数据流上进⾏有状态的计算。Flink 能在所有常见集环境中运⾏,并能以内存速度和任意规模进⾏计算。
Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and any scale.
3) 有界流和⽆界流
任何类型的数据都可以形成⼀种事件流。信⽤卡交易、传感器测量、机器⽇志、⽹站或移动应⽤程序上的⽤户交互记录,所有这些数据都形成⼀种流。
⽆界流: 有定义流的开始,但没有定义流的结束。它们会⽆休⽌地产⽣数据。⽆界流的数据必须持续处理,即数据被摄取后需要⽴刻处理。我们不能等到所有数据都到达再处理,因为输⼊是⽆限的,在任何时候输⼊都不会完成。处理⽆界数据通常要求以特定顺序摄取事件,例如事件发⽣的顺序,以便能够推断结果的完整性。
有界流: 有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进⾏计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理
Apache Flink 擅长处理⽆界和有界数据集 精确的时间控制和状态化使得 Flink 的运⾏时(runtime)能够运⾏任何处理⽆界流的应⽤。有界流则由⼀些专为固定⼤⼩数据集特殊设计的算法和数据结构进⾏内部处理,产⽣了出⾊的性能。
4) 有状态的计算架构
数据产⽣的本质,其实是⼀条条真实存在的事件按照时间顺序源源不断的产⽣,我们很难在数据产⽣的过程中进⾏计算并直接产⽣统计结果,因为这不仅对系统有⾮常⾼的要求,还必须要满⾜⾼性能、⾼吞吐、低延时等众多⽬标。⽽有状态流计算架构(如图所⽰)的提出,从⼀定程度上满⾜了企业的这种需求,企业基于实时的流式数据,维护所有计算过程的状态,所谓状态就是计算过程中产⽣的中间计算结果,每次计算新的数据进⼊到流式系统中都是基于中间状态结果的基础上进⾏运算,最终产⽣正确的统计结果。基于有状态计算的⽅式最⼤的优势是不需要将原始数据重新从外部存储中拿出来,从⽽进⾏全量计算,因为这种计算⽅式的代价可能是⾮常⾼的。从另⼀个⾓度讲,⽤户⽆须通过调度和协调各种批量计算⼯具,从数据仓库中获取数据统计结果,然后再落地存储,这些操作全部都可以基于流式计算完成,可以极⼤地减轻系统对其他框架的依赖,减少数据计算过程中的时间损耗以及硬件存储。
2. 为什么要使⽤ Flink
可以看出有状态流计算将会逐步成为企业作为构建数据平台的架构模式,⽽⽬前从社区来看,能够满⾜的只有 Apache Flink。Flink 通过实现 Google Dataflow 流式计算模型实现了⾼吞吐、低延迟、⾼性能兼具实时流式计算框架。同时 Flink ⽀持⾼度容错的状态管理,防⽌状态在计算过程中因为系统异常⽽出现丢失,Flink 周期性地通过分布式快照技术Checkpoints 实现状态的持久化维护,使得即使在系统停机或者异常的情况下都能计算出正确的结果。
3. Flink 的应⽤场景
在实际⽣产的过程中,⼤量数据在不断地产⽣,例如⾦融交易数据、互联⽹订单数据、GPS 定位数据、传感器信号、移动终端产⽣的数据、通信信号数据等,以及我们熟悉的⽹络
流量监控、服务器产⽣的⽇志数据,这些数据最⼤的共同点就是实时从不同的数据源中产⽣,然后再传输到下游的分析系统。针对这些数据类型主要包括实时智能推荐、复杂事件处理、
实时欺诈检测、实时数仓与 ETL 类型、流数据分析类型、实时报表类型等实时业务场景,⽽Flink 对于这些类型的场景都有着⾮常好的⽀持。
(⼀)实时智能推荐
智能推荐会根据⽤户历史的购买⾏为,通过推荐算法训练模型,预测⽤户未来可能会购买的物品。对个⼈来说,推荐系统起着信息过滤的作⽤,对 Web/App 服务端来说,推荐系统起着满⾜⽤户个性化需求,提升⽤户满意度的作⽤。推荐系统本⾝也在飞速发展,除了算法越来越完善,对时延的要求也越来越苛刻和实时化。利⽤ Flink 流计算帮助⽤户构建更加实时的智能推荐系统,对⽤户⾏为指标进⾏实时计算,对模型进⾏实时更新,对⽤户指标进⾏实时预测,并将预测的信息推送给 Wep/App 端,帮助⽤户获取想要的商品信息,另⼀⽅⾯也帮助企业提升销售额,创造更⼤的商业价值。
(⼆)复杂事件处理
对于复杂事件处理,⽐较常见的案例主要集中于⼯业领域,例如对车载传感器、机械设备等实时故障检测,这些业务类型通常数据量都⾮常⼤,且对数据处理的时效性要求⾮常⾼。通过利⽤ Flink 提供的
CEP(复杂事件处理)进⾏事件模式的抽取,同时应⽤ Flink 的 Sql进⾏事件数据的转换,在流式系统中构建实时规则引擎,⼀旦事件触发报警规则,便⽴即将告警结果传输⾄下游通知系统,从⽽实现对设备故障快速预警监测,车辆状态监控等⽬的。
(三)实时欺诈检测
在⾦融领域的业务中,常常出现各种类型的欺诈⾏为,例如信⽤卡欺诈、信贷申请欺诈等,⽽如何保证⽤户和公司的资⾦安全,是来近年来许多⾦融公司及银⾏共同⾯对的挑战。随着不法分⼦欺诈⼿段的不断升级,传统的反欺诈⼿段已经不⾜以解决⽬前所⾯临的问题。以往可能需要⼏个⼩时才能通过交易数据计算出⽤户的⾏为指标,然后通过规则判别出具有欺诈⾏为嫌疑的⽤户,再进⾏案件调查处理,在这种情况下资⾦可能早已被不法分⼦转移,从⽽给企业和⽤户造成⼤量的经济损失。⽽运⽤ Flink 流式计算技术能够在毫秒内就完成对欺诈判断⾏为指标的计算,然后实时对交易流⽔进⾏规则判断或者模型预测,这样⼀旦检测出交易中存在欺诈嫌疑,则直接对交易进⾏实时拦截,避免因为处理不及时⽽导致的经济损失。
(四)实时数仓与 ETL
结合离线数仓,通过利⽤流计算诸多优势和 SQL 灵活的加⼯能⼒,对流式数据进⾏实时清洗、归并、结构化处理,为离线数仓进⾏补充和优化。另⼀⽅⾯结合实时数据 ETL 处理能⼒,利⽤有状态流式计
算技术,可以尽可能降低企业由于在离线数据计算过程中调度逻辑的复杂度,⾼效快速地处理企业需要的统计结果,帮助企业更好地应⽤实时数据所分析出来的结果。
(五)流数据分析
实时计算各类数据指标,并利⽤实时结果及时调整在线系统相关策略,在各类内容投放、⽆线智能推送领域有⼤量的应⽤。流式计算技术将数据分析场景实时化,帮助企业做到实时化分析 Web 应⽤或者 App 应⽤的各项指标,包括 App 版本分布情况、Crash 检测和分布等,同时提供多维度⽤户⾏为分析,⽀持⽇志⾃主分析,助⼒开发者实现基于⼤数据技术的精细化运营、提升产品质量和体验、增强⽤户黏性。
(六)实时报表分析
实时报表分析是近年来很多公司采⽤的报表统计⽅案之⼀,其中最主要的应⽤便是实时⼤屏展⽰。利⽤流式计算实时得出的结果直接被推送到前端应⽤,实时显⽰出重要指标的变换情况。最典型的案例便是淘宝的双⼗⼀活动,每年双⼗⼀购物节,除疯狂购物外,最引⼈注⽬的就是天猫双⼗⼀⼤屏不停跳跃的成交总额。在整个计算链路中包括从天猫交易下单购买到数据采集、数据计算、数据校验,最终落到双⼗⼀⼤屏上展现的全链路时间压缩在 5秒以内,顶峰计算性能⾼达数三⼗万笔订单/秒,通过多条链路流计算备份确保万⽆⼀失。⽽在其他⾏业,企业也在构建⾃⼰的实时报表系统,让企业能够
依托于⾃⾝的业务数据,快速提取出更多的数据价值,从⽽更好地服务于企业运⾏过程中。
4. Flink 的特点和优势
crash是什么意思1) Flink 的具体优势和特点有以下⼏点
(⼀)同时⽀持⾼吞吐、低延迟、⾼性能
Flink 是⽬前开源社区中唯⼀⼀套集⾼吞吐、低延迟、⾼性能三者于⼀⾝的分布式流式数据处理框架。像 Apache Spark 也只能兼顾⾼吞吐和⾼性能特性,主要因为在Spark Streaming 流式计算中⽆法做到低延迟保障;⽽流式计算框架 Apache Storm 只能⽀持低延迟和⾼性能特性,但是⽆法满⾜⾼吞吐的要求。⽽满⾜⾼吞吐、低延迟、⾼性能这三个⽬标对分布式流式计算框架来说是⾮常重要的。
(⼆)⽀持事件时间(Event Time)概念
在流式计算领域中,窗⼝计算的地位举⾜轻重,但⽬前⼤多数框架窗⼝计算采⽤的都是系统时间(Process Time),也是事件传输到计算框架处理时,系统主机的当前时间。Flink 能够⽀持基于事件时间(Event Time)语义进⾏窗⼝计算,也就是使⽤事件产⽣的时间,这种基于事件驱动的机制使得事件即使乱序到达,流系统也能够计算出精确的结果,保持了事件原本产⽣时的时序性,尽可能避免⽹络传输或硬件系统的影响。
(三)⽀持有状态计算
Flink 在 1.4 版本中实现了状态管理,所谓状态就是在流式计算过程中将算⼦的中间结果数据保存在内存或者⽂件系统中,等下⼀个事件进⼊算⼦后可以从之前的状态中获取中间结果中计算当前的结果,从⽽⽆须每次都基于全部的原始数据来统计结果,这种⽅式极⼤地提升了系统的性能,并降低了数据计算过程的资源消耗。对于数据量⼤且运算逻辑⾮常复杂的流式计算场景,有状态计算发挥了⾮常重要的作⽤。
(四)⽀持⾼度灵活的窗⼝(Window)操作
在流处理应⽤中,数据是连续不断的,需要通过窗⼝的⽅式对流数据进⾏⼀定范围的聚合计算,例如统计在过去的 1 分钟内有多少⽤户点击某⼀⽹页,在这种情况下,我们必须定义⼀个窗⼝,⽤来收集最近⼀分钟内的数据,并对这个窗⼝内的数据进⾏再计算。Flink 将窗⼝划分为基于 Time、Count、Session,以及 Data-driven 等类型的窗⼝操作,窗⼝可以⽤灵活的触发条件定制化来达到对复杂的流传输模式的⽀持,⽤户可以定义不同的窗⼝触发机制来满⾜不同的需求。
(五)基于轻量级分布式快照(CheckPoint)实现的容错
Flink 能够分布式运⾏在上千个节点上,将⼀个⼤型计算任务的流程拆解成⼩的计算过程,然后将 tesk
分布到并⾏节点上进⾏处理。在任务执⾏过程中,能够⾃动发现事件处理过程中的错误⽽导致数据不⼀致的问题,⽐如:节点宕机、⽹路传输问题,或是由于⽤户因为升级或修复问题⽽导致计算服务重启等。在这些情况下,通过基于分布式快照技术的 Checkpoints,将执⾏过程中的状态信息进⾏持久化存储,⼀旦任务出现异常停⽌,Flink 就能够从 Checkpoints 中进⾏任务的⾃动恢复,以确保数据在处理过程中的⼀致性(Exactly-Once)。
(六)基于 JVM 实现独⽴的内存管理
内存管理是所有计算框架需要重点考虑的部分,尤其对于计算量⽐较⼤的计算场景,数据在内存中该如何进⾏管理显得⾄关重要。针对内存管理,Flink 实现了⾃⾝管理内存的机制,尽可能减少 JVM GC 对系统的影响。另外,Flink 通过序列化/反序列化⽅法将所有的数据对象转换成⼆进制在内存中存储,降低数据存储的⼤⼩的同时,能够更加有效地对内存空间进⾏利⽤,降低 GC 带来的性能下降或任务异常的风险,因此Flink 较其他分布式处理的框架会显得更加稳定,不会因为 JVM GC 等问题⽽影响整个应⽤的运⾏。
(七)Save Points(保存点)
对于 7*24 ⼩时运⾏的流式应⽤,数据源源不断地接⼊,在⼀段时间内应⽤的终⽌有可能导致数据的丢失或者计算结果的不准确,例如进⾏集版本的升级、停机运维操作等操作。值得⼀提的是,Flink 通
过 Save Points 技术将任务执⾏的快照保存在存储介质上,当任务重启的时候可以直接从事先保存的 Save Points 恢复原有的计算状态,使得任务继续按照停机之前的状态运⾏,Save Points 技术可以让⽤户更好地管理和运维实时流式应⽤。
2) 流式计算框架的对⽐
Storm 是⽐较早的流式计算框架,后来⼜出现了 Spark Streaming 和 Trident,现在⼜出现了 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 的吞吐量是⽐较⾼的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论