Flink是一个框架和分布式流处理引擎,用于对无界和有界数据流进行有状态计算。
Flink的主要应用场景包括:
- 电商和市场营销。如实时数据报表、广告投放、实时推荐等;
- 物联网。如传感器实时数据采集和显示、实时报价,交通运输业等;
- 物流配送和服务业。如订单状态实时更新,通知信息推送等;
- 银行和金融业。实时结算和通知推送,实时监测异常行为;
流处理与批处理。spark是典型的批处理,即便是spark streaming,streaming也只是更小的batch。
Lambda 架构主体是传统批处理架构的增强。它的“批处理层”(Batch Layer)就是由传统的批处理器和存储组成,而“实时层”(Speed Layer)则由低延迟的流处理器实现。数据到达之后,两层处理双管齐下,一方面由流处理器进行实时处理,另一方面写入批处理存储空间,
等待批处理器批量计算。流处理器快速计算出一个近似结果,并将它们写入“流处理表”中。而批处理器会定期处理存储中的数据,将准确的结果写入批处理表,并从流处理表中删除不准确的结果。最终,应用程序会合并流处理表和批处理表中的结果,并展示出来。
Lambda 架构的优点非常明显,它兼具了批处理器和第一代流处理器的特点,同时保证了低延迟和结果的准确性。而它的缺点同样非常明显。首先,Lambda 架构本身就很难建立和维护;而且,它需要我们对一个应用程序,做出两套语义上等效的逻辑实现,因为批处理和流处理是两套完全独立的系统,它们的 API 也完全不同。为了实现一个应用,付出了双倍的工作量,这对程序员显然不够友好。
新一代流处理器:Flink。流批一体。
Flink 的核心特性:
- 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。
- 结果的准确性。Flink 提供了事件时间(event-time)和处理时间(processing-time)语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。
- 精确一次(exactly-once)的状态一致性保证。
- 可以连接到最常用的存储系统,如 Apache Kafka、Apache Cassandra、Elasticsearch、JDBC、Kinesis 和(分布式)文件系统,如 HDFS 和 S3。
- 高可用。本身高可用的设置,加上与 K8s,YARN 和 Mesos 的紧密集成,再加上从故障中快速恢复和动态扩展任务的能力,Flink 能做到以极少的停机时间实现 7×24 全天候运行。
- 能够更新应用程序代码并将作业(jobs)迁移到不同的 Flink 集群,而不会丢失应用程序的状态。
Flink分层API:
Flink运行时架构
Flink 的运行时架构中,最重要的就是两大组件:作业管理器(JobManger)和任务管理器(TaskManager)。对于一个提交执行的作业,JobManager 是真正意义上的“管理者”(Master),负责管理调度,所以在不考虑高可用的情况下只能有一个;而 TaskManager 是“工作者”(Worker、Slave),负责执行任务处理数据,所以可以有一个或多个。Flink 的作业提交和任务处理时的系统如图 4-1 所示。
作业提交流程
如上图,具体步骤如下:
(1)一般情况下,由客户端(App)通过分发器提供的REST接口,将作业提交给JobManager;
(2)由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给JobMaster;
(3)JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求任务槽资源(slots);
(4)资源管理器判断当前是否由足够的可用资源;如果没有,启动新的 TaskManager;
(5)TaskManager 启动之后,向 ResourceManager 注册自己的可用任务槽(slots);
(6)资源管理器通知 TaskManager 为新的作业提供 slots;
(7)TaskManager 连接到对应的 JobMaster,提供 slots;
(8)JobMaster 将需要执行的任务分发给 TaskManager;
(9)TaskManager 执行任务,互相之间可以交换数据。