一、什么是Flink?
Flink是目前流行的分布式流式处理引擎,是Apache的顶级项目。Flink支持高吞吐、低延迟、高性能、Exactly-Once语义等特性,同时其基于"批是特殊的流"的理念,既实现了流式处理计算,又实现了批处理计算,达到了真正意义上的批流统一。
Flink具备极高的处理能力,集群可达数千服务器的规模。目前在国内已经被广泛接受,一些著名的互联网公司,如阿里巴巴、美团、滴滴、今日头条等,都在大规模使用Flink,其中阿里巴巴还基于Flink进行深度定制,提供了Blink版本,将将其一些新特性贡献给了开源社区。
可以说,Flink是未来流式计算的闪耀之星。
二、Flink应用场景
所有的软件都要有好的应用场景才能够被不断优化,向前发展。既然Flink具备高性能的流式处理能力,那么实际可以应用到哪些方面呢?
在实际的生产应用环境中,涉及到流式的计算实际上是非常多的,因为各个系统都在不断地产生大量数据,例如用户购买数据、用户行为数据、系统运行日志数据、交易统计数据等,这些场景下都会涉及大量的计算工作,传统地处理方式更多是离线批量地处理,实效性上比较差,难以适应现在业务发展的需要,而Flink天生适合这种应用场景。
2.1 实时推荐
收集用户行为数据,进行实时计算,将计算结果更新到推荐模型中,然后反过来对用户的喜爱进行实时预测,然后将推荐数据展示给用户,提高用户对商品的匹配度。用户行为的数据是十分巨大的,而快速计算实时反馈又是十分必要的,因为用户的浏览购买行为是有时间限制的,类似这种场景,高吞吐、高性能的FLink正好排上用场。
2.2 实时反欺诈行为检测
在金融领域中,为保障安全和减少损失,反欺诈系统是必不可少的。传统的反欺诈手段需要较长的时间,大部分只能提供事后的追查,而无法提前规避。使用Flink能够实时完成反欺诈规则的过滤和判断,快速给出结果,提前对信用卡申请欺诈行为、交易欺诈行为等进行防堵。
2.3 实时报表
传统的数据报表都是T+N的模式,例如T+2日出账单,T+1日出结算报表等,整体时效性比较差,用户体验也不够好,在信息化的今天,实时的数据报表已经是十分常见的需求了。使用FLink采集来自多个系统的数据源进行数据的清洗,按照一定的规则实时出数据报表,这是一件很自然的事情。
2.4 实时大屏
实时大屏是目前最广泛的一个应用了,典型的代表就是淘宝双11的监控大屏,据报道其计算性能达到超过30万笔/秒。Flink的高性能适合这种大流量的流失处理场景,并且其提供的Window、Time等功能,能够轻松地应付诸如1分钟内交易笔数、5分钟交易金额这类统计需求。
2.4 系统监控分析
使用Flink流式计算对各类服务、app运行的相关指标数据、用户行为数据进行数据分析,实时提供相关的监控和哦统计数据,为发现服务异常、市场广告决策等提供参考。
以上是一些场景的Flink的应用场景,当然Flink的应用绝不仅仅如此,所有需要高性能的、高吞吐、低延迟的流式计算场景,都可以考虑使用Flink。
三、同类比较
说到流式计算,大家一定会想到Apache Storm、Spark Streaming,这两个也是开源界中流式计算十分热门的产品,那么与Flink有什么异同点呢?在实际技术选型的时候应该选择哪一种呢,下面我们来对这几个流式处理框架进行一下比较。
从以上对比来看,如果应用场景下需要同时支持批处理计算和流处理计算、需要支持Exactly-Once语义或者需要有状态的流计算,那么可以可以排除Storm,选择Flink或者Spark Streaming。
若是只需要进行基于无状态的流式计算,且对吞吐量没有太高要求,并且对于低延迟要求较高,那么可以考虑选择Storm或者Flink,Storm目前成熟度更高,且在行业内应用更加广泛,出现问题更加方便定位。
在Flink和Spark Streaming的选择上,Flink明显在有状态的计算以及延时方面优于Spark Streaming,两者对于批和流的理念是完全不一样的,Flink将批当作特殊的流,其对于流的支持的原生的,其延时达到毫秒级,而Spark Streaming认为流是特殊的批,是将流当作微批来处理,所以在延时上一般是在秒级。
当然目前来看Spark Streaming的成熟度会优于Flink,但是Flink目前发展势头强劲,国内多家互联网巨头已经在尝试往Flink转型,社区的成熟度也越来越高,Flink的发展是势不可挡的。
三、Flink的技术架构
3.1 软件技术栈
Flink的软件技术栈如下图所示,遵循的是分层的架构,从上到下分别是API和Libraries层、Runtime核心层和物理部署层。
- API和Libraries层 Flink提供了DataStream API用于支持流式计算,提供了DataSet API用于支持批处理计算。另外为了方便用户的使用提供更加高层的功能,基于DataStream API之上构建了CEP(复杂事件处理库)和Table API以及SQL(用于流),基于DataSet API之上提供了FlinkML机器学习库、Gelly图像处理库、Table API和SQL(用于批)。这里也体现出了Flink API的完善,为不同的需要提供了不同粒度的API,如Table API和SQL使用简单,但是可定制化弱,功能较单一,DataStream API以及更加底层的API则提供更加丰富的功能,但是更加复杂。
- Runtime核心层Runtime核心层是Flink计算框架的核心实现部分,作业提交、任务调度、状态收集、容错恢复等功能都与这一层相关。
- 物理部署层物理部署层提供了不同形式的部署支持,例如本地单机部署,基于YARN的集群部署,云版本等。
3.2 逻辑架构
Flink逻辑架构如下如所示,Flink采用Master-Slave的架构,JobManager作为Master角色,整个集群中只能有一个活跃的Master(JobManager),TaskManager作为Slave角色(Worker),集群中TaskManager的数量可达数千台。
- JobMangerJobManager负责整个Flink集群的任务调度和资源管理,负责与TaskManager交互,为应用分配Task Slot资源,并通知TaskManager启动应用,任务完成以后也会将状态返回给Client。另外JobManager还负责Checkpoint的管理,出发TaskManager执行Checkpoint操作,以便于故障恢复。
- TaskManagerTaskManager负责具体节点的资源申请和管理,接收JobManager的命令进行相应的任务操作。TaskManager使用心跳机制保持与JobManager的感知,定期汇报资源、状态统计信息到JobManager。当Client提交一个任务时,JobManager根据TaskManager汇报的资源情况选择某一个具体执行任务的TaskManager,将任务分配给它执行。TaskManager之间可以通过数据流的方式进行数据交互。
- Actor System负责JobManager和TaskManager之间的通讯,Actor是Akka Framework的一个角色,Akka是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用,常用于分布式高并发的场景下。
- Client客户端用于提交任务到Flink集群,其仍然是通过Akka Framework构建网络连接。Flink程序会通过Optimizer和Graph Builder生成JobGraph,通过Client提交到JobManager。