Flink 对实时任务研发提供了不同级别的抽象,如下图所示。
- 最低级别的抽象仅提供有状态和及时的流处理。它通过Process Function嵌入到DataStream API中。它允许用户自由地处理来自一个或多个流的事件,并提供一致、容错的状态。此外,用户可以注册事件时间和处理时间的回调,使程序能够实现复杂的计算。
- 在实践中,许多应用程序不需要上述低级别的抽象,而是可以使用核心API进行编程:DataStream API(有界/无界流)和DataSet API(有界数据集)。这些流畅的API提供了数据处理的常见构建块,如各种形式的用户指定的转换、连接、聚合、窗口、状态等。在这些API中处理的数据类型以各个编程语言中的类表示。低级别的Process Function与DataStream API集成,使得可以根据需要使用较低级别的抽象。DataSet API还提供了有界数据集的其他原语,如循环/迭代。
- Table API是围绕表的声明性DSL,可以表示动态更改的表(用于表示流)。Table API遵循(扩展的)关系模型:表附有模式(类似于关系数据库中的表),API提供类似的操作,如选择、投影、连接、分组、聚合等。Table API程序以声明方式定义应该执行的逻辑操作,而不是精确指定操作的代码。虽然Table API可以由各种类型的用户定义函数进行扩展,但它的表达能力较核心API更低,编写起来更简洁(代码更少)。此外,Table API程序在执行之前还要经过一个优化器应用优化规则。可以无缝地在表和DataStream/DataSet之间进行转换,允许程序将Table API与DataStream和DataSet API混合使用。
- Flink提供的最高级别的抽象是SQL。这个抽象在语义和表达能力上与Table API类似,但将程序表示为SQL查询表达式。SQL抽象与Table API密切交互,可以在Table API中定义的表上执行SQL查询。