文章目录
前言
仍然是学概念,以下大部分是对官方doc的翻译,但是也会有些个人的理解(主要是对比Spark),以及查找的一些解决自己的一些疑惑相关资料。
从Flink 的数据流编程模型和分布式运行环境的基本概念开始学习会对您了解其他部分的文档有帮助,包括安装以及编程指南。强烈推荐先阅读这两部分文档。
数据流编程模型
抽象级别
Flink提供了不同的抽象级别以支持开发流式、批处理等应用。
- 最底层级的抽象仅仅提供了有状态流处理。通过过程函数(Process Function)将底层抽象嵌入到DataStream API中。它允许用户自由地处理来自一个或多个流数据的事件,并使用一致、容错的状态。除此之外,用户可以注册事件时间和处理事件回调,从而使程序可实现复杂的计算。
- 实际上,大多数应用并不需要上面所说的最底层抽象,而是针对 核心API(Core APIs) 进行编程,比如DataStream API(有界或无界流数据)以及DataSet API(有界数据集)。这些流畅的API为数据处理提供了通用的构建模块,比如由用户定义的多种形式的转换(transformations),连接(joins),聚合(aggregations),窗口操作(windows),状态(state)等等。这些API处理的数据类型以类(classes)的形式由各自的编程语言所表示。
- Table API 是以表为中心的声明式DSL,其中表可能会动态变化(在表达流数据时)。Table API遵循(扩展的)关系模型:表具有附加的模式(类似于关系数据库中的表),同时API提供可比较的操作,例如select、project、join、group-by、aggregate等。 尽管Table API可以通过多种类型的用户定义的函数进行扩展,其仍不如 核心API 更具表达能力,但是使用起来却更加简洁(代码量更少)。此外,Table API程序还会通过优化程序,在执行之前应用一些优化规则。
【暂时理解为SQL优化?比如Hive中的SQL优化?】【TODO:哪些优化?】 可以在表和DataStream / DataSet之间无缝转换,允许程序混合Table API以及DataStream和DataSet API。
补充: 与常规SQL语言中将查询指定为字符串不同,Table API查询是以Java或Scala中的语言嵌入样式来定义的,