前言:Flink自2014年开源以来,网上对Flink的介绍不可胜数;作为一个灵活的实时计算框架,Flink到底能用来做什么?笔者通过总结在工作中的Flink使用经验和对Flink的特性理解,整理了一份Flink的应用介绍思考,希望能对在大数据领域耕耘的朋友起到参考作用。
本文从Flink数据处理思想,Flink的应用场景两方面,尽量用通俗易懂的方式讲解,使用Flink能干什么。
Flink作为第三代实时计算框架,刚问世的时候经常和Spark-Streaming做对比;经过几年的发展,在实时流处理领域,Flink基本已经成为标准的技术方案,其对流数据处理的高性能、稳定性、内部状态支撑、轻量级快照、时间语义、高度灵活性等特性,让其在解决应用需求的时候,有极其丰富的实用性。
在计算机科学中,有一个默认常识是无法同时满足CAP(一致性、可用性和分区容错性)这三个特性;类比其他的流处理计算框架,Flink在流数据处理领域,不光做到了一致性的保障,还有更优的可用性和容错性,是如何做到的呢?
在Flink的世界观里,它把数据描述成一条跟着一条的数据流,用三个阶段去定义整个处理过程,如下图所示:数据读取数据阶段、数据处理阶段,数据处理完成写入阶段。我们把这个过程想象成一个源源不断的河流,数据就是河道中的水;首先,河道的上游有一个水库(消息队列Source),我们可用通过对水库的监控,管理河道的水流;然后在河道中修建一些工厂,对水进行管理,可以做水净化、水加工、水流量计算等具体的操作(计算算子data operation);最后对处理或加工后的水,导入下游,或者将对水监控的状态,通过汇总记录,记录到其他其他地方(sink)。在整个处理过程中,有高吞吐、准确性、实时性和容错等需求,Flink是如何保障的呢?
Flink在数据流场景的基础上引入了四个基础概念:checkpoint、时间(time)、窗口(windows)、状态(state)。有了这四个东西,就可以保障Flink流式处理的性能和特性了。
跟着数据的视角体验一下:
1.当一条Source的数据进入Flink的时候,Flink在这条数据之后加入了一个Flink自己的间隔标识(barrier),固定时间再去加入这样一条标识,这样是不是就能区分两个间隔标识之间的数据了,就有了一批数据伙伴,这就是flink的checkpoint机制,后续的所有操做状态,都会按照checkpoint的间隔机制做内存或磁盘保存;
2.数据已经从源头被划分为逻辑上的时间间隔的数据批次;如果不做数据处理,可以直接将数据写入sink,当sink写入完成,flink自己的标识也被sink捕捉,它就可以通知Source,这一个时间间隔内的数据写入完成,可以记录状态了;这样在任务下线或失败之后,是不是就能保障数据准确了。
3.如果做数据处理,就又有一些新的问题,如何保障数据的划分,没有时间概念,就可以通过每条数据的标识(key),将数据分到不同的河道做处理,然后分类处理(统计类),然后导入sink,中间会按照checkpoint间隔,对每个算子的状态做保存(state);这样就能在sink感知一个时间间隔处理完成后,从source更新数据处理情况;有时间状态,每条读入Flink的数据,会根据时间(time),将数据划分到时间窗口(windows)内,然后再对窗口内的批次数据做单独处理,在一个窗口周期的数据,会按照checkpoint间隔和窗口状态记录到内存,这就是flink在流处理过程中对算子的状态记录。
以上就是Flink数据流处理的基本流程和Flink性能和特性的保障机制。
Flink官网对Flink应用场景做了一个总结:
在实际的生产过程中,数据不断的产生:
例如主机操作日志、中间件操作日志、各类业务数据、传感器数据、移动端数据、网络数据、业务流量数据等;
这些数据都是源源不断地产生,都可以实时传入下游做处理和应用。
数据采集和数据ETL标准化场景,比如从kafka将数据清洗过后写入Kafka、ES、Hbase、Doris等中间件,
基于Flink分出来的FlinkCdc社区,从mysql、MongoDb等中间件将数据迁移到OLAP数据库;
对于结构化或非结构化数据,都可以通过FLink做两个中间件之间的桥梁(智能运维分析)。
应用总结:可以做实时数据清洗、实时详情搜索构建。
对生产实时产生地数据,可以做实时监控告警,对各个风险点都可以适用规则构建告警驱动,将捕捉到的风险操作,以数据的形式传入系统做数据驱动;
有FlinkCep这个单独地模块就是对异常操作地风险管理;
可用Flink的事实处理能力,将事件分类,做做智能推荐,比如Flink+Hbase+ES的千人千面的实时推荐。
应用总结:实时欺诈检测、对安全的实时风控、复杂事件规则告警、实时智能推荐等
实时分析是大数据应用场景里使用最广能力;对于实际生产中产生的数据,笔者做过的一些实时分析如下:
面对主机操作:做实事大屏;
面对中间件:做各种中间件的慢查询报表、TP99/90/50分析;
面对市场业务:做各类业务的实时驾驶舱报表;
面对职能业务:做多种业务系统的流量实时分析报表;
面对移动端数据:做实时用户分析、设备分析等处理;
面对终端设备:做过终端管理和终端实时分析报表;
应用总结:面对不同的需求场景,只要数据是实时产生的,就可以构建起实时分析模型,提供实时分析能力。
1.flinkML可以基于特征工程做一些基础算法能力:做算法方式的异常检测、分类、聚类、预测等功能;
2.Flink自身的特性,配合一些存储组件,可以打造定制化的计算引擎:
比如1:使用Flink+Redis,对每一条数据做处理,可以做特定场景的实时自定义分析能力;
比如2:使用FLink+HDFS+Kafka,对非结构化数据可以做定制化的处理能力,(zib包上传到Hdfs,元数据写入Kafka,构造日均10TP级的对象处理能力)
比如3:使用Flink+Kakfa,打造自动分发到不同Topic的计算引擎;
比如4:开源FlinkCdc,就是基于Flink做的定制化计算引擎,在Flink的基础上,做到了mysql/MongoDb一些中间件的整库同步能力(笔者在2022年初,就利用Flink实现了类似能力);
例如等等;
水无常势,兵无常形。Flink本身的特性是非常灵活的,基于这些性能和特性,不要局限于固定的应用场景;大胆想象,利用Flink去实现、优化需求,可能会有意想不到的好效果。