附上官网链接Apache Flink: Stateful Computations over Data Streams
官方对于flink的解释是:Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。
无边界指的是源源不断地有数据传输过来,有界指得是数据量已知。比如说游戏服务器,他会7*24小时接收来自玩家产生地数据,这算无界流;有界流就比如说我们的读取本地文件,读取mysql中这样已经保存好的数据,读取完成后就停止任务
同样都是流处理,我们不免要比较spark streaming和flink的区别
1、flink是属于事件驱动,而spark streaming是属于时间驱动
(flink读取到一条数据就会开始计算,而sparkstreaming是根据提前设置好的时间间隔触发计算,是一段一段的微批处理)
2、flink支持多种时间机制(处理时间、事件时间、注入时间),sparkstreaming只支持处理时间
3、flink和spark streaming都支持checkpoint,都保证了任务处理了可以从上次失败的地方重启,但是flink还提供了2段提交协议保证exactly once()
flink的api
Flink 为流式/批式处理应用程序的开发提供了不同级别的抽象。
1、Process Function是 最底层的API用户可以在此层抽象中注册事件时间(event time)和处理时间(processing time)回调方法,从而允许程序可以实现复杂计算。
2、Flink API 第二层是 Core API。实际上,许多应用程序不需要使用到上述最底层抽象的 API,而是可以使用 Core API 进行编程:其中包含 DataStream API(应用于有界/无界数据流场景)和 DataSet API(应用于有界数据集场景)两部分。
3、Flink API 第三层是 Table API。Table API 是以表(Table)为中心的声明式编程(DSL)API,与spark sql 类似拥有schema,提供了非常方便的DSL语句。并且,Table API 程序在执行之前还会使用优化器对用户编写的表达式进行优化。Table API与 DataStream/DataSet 可以进行无缝切换
4、Flink API 最顶层抽象是 SQL。这层抽象在语义和程序表达式上都类似于 Table API,但是其程序实现都是 SQL 查询表达式,我们可以通过flink sql构建动态的一张表,也可以通过catalog与hive进行整合
你可以把flink的代码分为3个部分,一部分是读取数据的source,一个是最终结果写某个位置的sink,以及中间的transformation操作(通过算子,对数据内容,数据时间进行操作)
连接选项(包括但不限于下面的), 官网提供了相当多的模板使用,你也可以使用自定义的连接方法:
flink的强大之处还体现在以下的四点,我们在学习的时候需要理解下面的四部分
checkpoint:分布式快照机制,我们在flink代码中可以指定checkpoint的位置,任务失败之后,可以在提交任务的命令后面加上checkpoint的位置,这样可以从上次失败的地方再次运行任务
state:状态(常用的ValueState,ListState等),在使用的时候,使用状态计算可以避免全局聚合,提升效率
time:flink中包含了多种时间(Event Time(数据产生附带的时间)、Ingestion TIme(我们通过source读取到的时间)、Processing TIme(数据被算子处理时的时间)),针对event time还提出了watermarks处理乱序数据
window:常见的窗口有3种,timeWindow(包括滑动、滚动窗口,里面又可以分为事件时间和处理时间)、countWindow(同样是有滑动、滚动之分,计数窗口是根据我们设置好的大小,比如说设置窗口的size为10,这样相同的key出现10次后触发计算),sessionWindow(会话窗口,我们指定窗口为5s,如果5s没有接收数据,就开始计算前面的数据)
这篇文章的state说的非常好,可以去看一看这篇文章: