在实践练习章节阐述了 Flink API 中 有状态实时流处理的基本概念,并且举例说明了在应用程序中如何应用这些机制。 Data Pipelines & ETL
章节介绍了有状态流处理的概念,并且在 Fault Rolerance
章节做了深入的介绍。Streaming Analytics
章节介绍了实时流处理的概念。
本章对Flink 架构 和 运行时 如何实现这些概念做了深入的讲解。
Flink 中的 API
Flink 为 流式和批 处理应用程序的开发提供了不同级别的抽象。
- Flink API 最底层的抽象仅仅提供了有状态实时流处理。并且通过
Process Function
把它嵌入到了 DataStream API中。它允许用户在应用程序中自由地处理来自单流或多流的事件(数据),并提供具有全局一致性和容错保障的状态。此外,用户可以在此层抽象中注册事件时间(event time)和处理时间(processing time)回调方法,从而允许程序可以实现复杂计算。
- 实际上,许多应用程序不需要使用到上述最底层抽象的 API,而是可以使用Core APIs进行编程:其中包含DataStream API(应用于有界/无界数据流场景)和DataSet API(应用于有界数据集场景)两部分。Core APIs 提供的流式 API(Fluent API)为数据处理提供了通用的模块组件,例如各种形式的用户自定义转换(transformations)、联接(joins)、聚合(aggregations)、窗口(windows)和状态(state)操作等。此层 API 中处理的数据类型在每种编程语言中都有其对应的类。Process Function这类底层抽象和DataStream API的相互集成使得用户可以选择使用更底层的抽象 API 来实现自己的需求。DataSet API还额外提供了一些原语,比如循环/迭代(loop/iteration)操作。
- Table API是以表(Table)为中心的声明式编程(DSL)API,例如在流式数据场景下,它可以表示一张正在动态改变的表。Table API遵循(扩展)关系模型:即表拥有 schema(类似于关系型数据库中的 schema),并且 Table API 也提供了类似于关系模型中的操作,比如 select、project、join、group-by 和 aggregate 等。Table API 程序是以声明的方式定义应执行的逻辑操作,而不是确切地指定程序应该执行的代码。尽管 Table API 使用起来很简洁并且可以由各种类型的用户自定义函数扩展功能,但还是比 Core API 的表达能力差。此外,Table API 程序在执行之前还会使用优化器中的优化规则对用户编写的表达式进行优化。表和DataStream/DataSet可以进行无缝切换,Flink 允许用户在编写应用程序时将Table API与DataStream/_DataSet_API 混合使用。
- Flink API 最顶层抽象是SQL。这层抽象在语义和程序表达式上都类似于Table API,但是其程序实现都是 SQL 查询表达式。SQL抽象与 Table API 抽象之间的关联是非常紧密的,并且 SQL 查询语句可以在Table API中定义的表上执行。