参考官网: https://flink.apache.org/
1. 简单介绍
Flink 是Apache旗下的一个框架和分布式处理引擎。用于对无界和有界数据流进行有状态计算,核心目标是数据流上的有状态计算(Stateful Computations over Data Streams)。处理的是流式数据(Data Flow),数据流的含义就是数据并不是收集好的,而是像水流一样,逐个到来,逐个处理。所以Flink 适合的场景也就是需要实时处理数据流的场景。
Flink 被设计再常见的集群环境中运行,以内存执行速度和任意规模来执行计算。
框架处理流程图如下:
2.主要应用场景
1. 电商和市场营销
比如:实时数据报表、广告投放、实时推荐、PV(PageView)和UV(UserView-根据IP来筛选)统计等。
2. 物联网(IOT)
传感器实时数据采集和现实、实时报警、交通运输业
3. 物流配送和服务业
订单实时更新、通知信息推送
4. 银行和金融行业
实时结算和通知推送、实时检测异常行为。
3. 核心概念
1. 有界数据和无界数据
任何被处理的数据都可以被称为事件流。比如银行账单、机器日期、用户在网站的交互等。
无界数据:有明确的开始但是没有结束。无界数据能持续不断的被处理。
有界数据:有明确的开始和结束
2. 流处理和批处理
数据流:数据是一个一个来,是一组有序的数据序列。数据是来一个处理一个,这种处理模式就是流处理,也叫做实时处理。
批量数据(数据集):数据是一批同时到来,是一个有限的数据集。数据是读一批然后一起计算,这种方式叫做批处理,也叫做离线处理。
打个比喻:聊天和发信息。聊天就可以理解为数据流,信箱就可以理解为批量数据。聊天需要我们时刻关注新消息,会耗费大量精力,工作效率会受到影响。这也是传统的数据处理架构倾向于先收集数据再处理的原因。
3. 有状态的流处理
有状态的流处理:现实应用中,我们需要把一些数据保存到数据库或者其他地方进行处理(数据具有状态),处理完成只会更新状态,在传统的架构中,这个状态保存再数据库里,这就是所谓的有状态的流处理。
可以用下图表示:
我们需要保护本地状态,防止再处理过程中发生故障导致数据丢失。解决方法可以定期地将应用状态的一致性检查点(checkpoint)存盘,写入远程的持久化存储,遇到故障再去读取进行恢复,这样就保证了更好的容错性。
有状态的流处理一般有以下几种典型应用。
(1) 事件驱动型应用
从一个或多个事件读取数据,并根据到来的事件触发计算、状态更新或其他外部动作。比较典型的是以Kafka 为代表的消息队列。
(2) 数据分析型应用
从原始数据中提取信息和发掘规律。传统上是将数据复制到数据仓库,然后批量查询。如果数据有了更新,必须将数据添加到要分析的数据集中,然后重新查询或应用程序。现在的做法一般是将大量数据(日志文件)写入分布式文件系统(HDFS)或HBase 等批量存储数据库,以较低的成本进行大容量存储。 然后可以通过sql-on-hadoop 累的引擎查询和处理数据,比如Hive。这种处理方式就是典型的批处理。
(3)数据管道型应用
ETL也就是数据提取、转换、加载,是在存储系统之家转换和移动数据的常用方法。在数据分析的应用中,通常会定期触发ETL 任务,将数据从事务数据库系统复制到分析数据库或数据仓库。数据管道的作用于ETL类似。它们可以转换和扩展数据,也可以在存储系统之家移动数据。只不过流处理来搭建数据管道,这些工作可以连续运行,不需要再周期性触发。 比如:数据管道可以用来监控文件系统目录的新文件、将数据写入事件日志。ETL与数据管道区别如下:
4. 流处理-lambda 架构
对于有状态的流处理,当数据越来越多时,必须用分布式的集群架构来获取更大的吞吐量。分布式架构带来的问题就是如何保证数据处理的顺序。
批处理来说好处理,因为是一批一批处理,可以对一批进行选择、排序; 流处理是一条一条处理,所以比较复杂。因此出现了lambda 架构,lambda 架构可以理解为第一代流处理器和批处理器的简单合并:
批处理层由传统的批处理器和存储组成,实时层由流处理器实现。数据到达后,两层一起处理,一方面由流处理器实时处理,另一方面写入批处理存储空间,等待皮处理器批量计算。流粗利器快速计算出一个近似结果,将它们写入流处理表中;而皮处理器会定期处理存储中的数据,将准确的结果写入批处理表,并从流处理表中删除不正确的结果。最终,应用程序会合并快速表和批处理表中的结果,并展示出来。(我理解有点类似于分布式事务的最终一致性)。
5. 新一代流处理器-flink
先前的流处理器只能在高吞吐和低延迟中二选一,新一代设计兼顾两者。其具备如下特点:
(1) 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟
(2)结果的准确性:提供了事件时间和处理时间语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。
(3)精确一次的状态一致性保证
(4)可以连接常用的存储系统:kafka、es、jdbc、分布式文件系统(HDFS等)
(5)高可用。本身高可用的设置,加上与K8S、YARN等紧密集成
(6)能够更新应用程序代码并将作业迁移到不同的Flink 集群,而不丢失应用程序的状态.
4. Flink分层API
其整体API分层如下:
最高层:仅提供了有状态流,将处理函数嵌入到了DataStream API中。
TableAPI:以表为中心的声明式编程,其中表在表达流数据时会动态变化。遵循关系模型:二维数据结构(类似于关系库的表)。提供类似于select、join、group-by、aggregate 等操作。
DataStream、DataSet :核心的操作。我们可以在tableAPI与这两者之间切换。
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】