分层 api
最底层级的抽象仅仅提供了有状态流,它将通过过程函数( Process Function) 被嵌入到 DataStream API 中。底层过程函数(Process Function) 与 DataStream API 相集成,使其可以对某些特定的操作进行底层的抽象,它允许用户可以自由地处理 来自一个或多个数据流的事件,并使用一致的容错的状态。除此之外,用户可以注 册事件时间并处理时间回调,从而使程序可以处理复杂的计算。
实际上, 大多数应用并不需要上述的底层抽象, 而是针对核心 API(Core APIs) 进行编程,比如 DataStream API (有界或无界流数据) 以及 DataSet API (有界数据 集)。这些 API 为数据处理提供了通用的构建模块, 比如由用户定义的多种形式的转换(transformations),连接(joins),聚合(aggregations),窗口操作(windows) 等等。
DataSet API 为有界数据集提供了额外的支持, 例如循环与迭代。这些 API 处理的数据类型以类(classes)的形式由各自的编程语言所表示。
Table API 是以表为中心的声明式编程, 其中表可能会动态变化(在表达流数据 时) 。Table API 遵循(扩展的) 关系模型: 表有二维数据结构(schema) (类似于 关系数据库中的表), 同时 API 提供可比较的操作, 例如 select、project、join、group-by、 aggregate 等。 Table API 程序声明式地定义了什么逻辑操作应该执行, 而不是准确地 确定这些操作代码的看上去如何。
尽管 Table API 可以通过多种类型的用户自定义函数( UDF)进行扩展, 其仍不 如核心 API 更具表达能力, 但是使用起来却更加简洁(代码量更少) 。除此之外, Table API 程序在执行之前会经过内置优化器进行优化。
你可以在表与 DataStream/DataSet 之间无缝切换,以允许程序将 Table API 与 DataStream 以及 DataSet 混合使用。
Flink 提供 的最 高层 级 的抽 象 是 SQL 。这 一层抽 象在语法 与表达 能 力上 与 Table API 类似, 但是是以 SQL 查询表达式的形式表现程序。 SQL 抽象与 Table API 交互密切,同时 SQL 查询可以直接在 Table API 定义的表上执行。
目前 Flink 作为批处理还不是主流, 不如 Spark 成熟, 所以 DataSet 使用的并不 是很多。 Flink Table API 和 Flink SQL 也并不完善, 大多都由各大厂商自己定制。所以学习 DataStream API 的使用是重要的。实际上 Flink 作为最接近 Google DataFlow 模型的实现,是流批统一的观点,所以基本上使用 DataStream 就可以了。
Flink 几大模块
⚫ Flink Table & SQL(还没开发完)
⚫ Flink Gelly(图计算)
⚫ Flink CEP(复杂事件处理)