Apache Flink 社区正在积极准备 Flink 2.0,这是自 Flink 1.0 发布 8 年以来的首次大版本发布。作为一个重要的里程碑,Flink 2.0 将引入许多激动人心的功能和改进,以及一些不兼容的破坏性变更。为了促进用户和上下游项目(例如,连接器)尽早适配这些变更,提前尝试这些令人兴奋的新功能同时收集反馈,我们现在提供了 Flink 2.0 的预览版本。
注意: Flink 2.0 预览版不是稳定版本,请不要应用于生产环境。虽然这个预览版包含了 Flink 2.0 中绝大部分影响兼容性的变更,但 2.0 正式版仍可能引入额外的非兼容改动。
非兼容变更
API
以下 API 已被完全移除:
-
DataSet API : 请迁移到 DataStream API, 或 Table API/SQL。 详见 如何从 DataSet 迁移到 DataStream。
-
Scala DataStream 和 DataSet API : 请迁移到 Java DataStream API。
-
SourceFuction, SinkFunction 和 Sink V1 : 请迁移到 FLIP-27 Source和 Sink V2。
-
TableSoure 和 TableSink : 请迁移到 DynamicTableSource和 DynamicTableSink. 详见 User-defined Sources & Sinks。
-
TableSchema, TableColumn 和 Types : 请分别迁移到 Schema, Column和 DataTypes。
同时,DataStream API 以及 REST API 中部分废弃的方法和字段也已经被移除。
注意: 您可能会发现一些已移除的 API 仍然存在于代码库中,但被移动到了和原来不同的包路径下。它们现在仅供内部使用,并且可能随时发生更改或移除。请 不要再使用 它们.
连接器适配计划
由于 SourceFunction, SinkFunction 和 SinkV1 API 被移除,依赖这些 API 的现有连接器将无法在 Flink 2.x 版本工作,需要进行针对性适配。以下是具体的适配计划:
-
Flink 2.0 预览版发布后会尽快发布与之适配的 Kafka 连接器新版本。
-
JDBC 和 ElasticSearch 连接器将在 Flink 2.0 的正式版本中适配。
-
我们计划在接下来的 3 个版本(即截止到 Flink 2.3)中逐步适配剩余的连接器。
配置
符合以下标准的配置项已被移除:
-
被标注为
@Public
并且已弃用至少2个版本。 -
被标注为
@PublicEvolving
并且已弃用至少1个版本。
在 Flink 2.x 中,不再支持旧的配置文件 flink-conf.yaml
, 请改用符合标准 YAML 格式的 config.yaml
。我们提供了一个迁移工具,用于将旧的 flink-conf.yaml
转换为新的 config.yaml
。详见 从 flink-conf.yaml 迁移到 config.yaml。
在程序中使用硬编码的方式进行配置会带来诸多弊端,因此 StreamExecutionEnvironment
和 ExecutionConfig
中与配置相关的 API 不再允许直接传入 Java 对象作为参数。你现在应该通过 Configuration
和 ConfigOption
来进行相应的配置。
为了避免暴露过多的内部接口,用户自定义函数(UDF) 不再对 ExecutionConfig
具有完整的访问权限。相应地,你现在可以直接从 RuntimeContext
中访问这些必要的函数,例如 createSerializer()
, getGlobalJobParameters()
和 isObjectReuseEnabled()
。
其它
-
1.x 到 2.x 的升级不保证 状态兼容性。
-
不再支持 Java 8: Java 11 是目前支持的最低 Java 版本。
-
旧的 Hybrid Shuffle 模式 已经被完全移除。
重要新特性
存算分离状态管理
过去十年间 Flink 的部署模式、工作负载和硬件的架构都发生了很大的改变。我们已经从计算-存储紧密耦合的 map-reduce 时代,进入到了以 Kubernetes 容器化部署为标准的云原生世界。为了 Flink 在云原生时代的未来,我们在 Flink 2.0 中引入了基于远程存储的存算分离状态管理。
存算分离架构的引入使得 Flink 向云原生领域更进一步。新架构主要解决了以下问题:
-
容器化环境下计算节点受本地磁盘大小限制的问题
-
由于RocksDB中LSM结构的周期性 Compaction 导致计算资源尖峰的问题
-
大规模状态快速扩缩容的挑战
-
原生的轻量级和快速检查点
受限于 Flink 中现有的阻塞式同步执行模型,仅仅将状态存储扩展到从远程 DFS 读写是不够的。在 Flink 2.0 中,我们提出了异步执行模型,并为此引入了 ForStDB,这是一种分离的状态后端解决方案。
在当前预览版本下,我们使用: NexmarkQ20 完成了一个端到端的示例。 其中包括:
-
异步化执行:完整的状态异步访问的API,以及检查点支持
-
异步化SQL Join算子:基于异步化状态 API实现
-
同步/异步混合式执行:基于混合式SQL Plan,支持同步算子与异步算子在一个作业内共存
-
性能:在直接写入存算分离后的远端存储的场景下,提供了不错的性能
物化表
在 Flink 1.20 中,我们以最简可行产品(Minimum Viable Product) 的形式引入了物化表功能。物化表是 Flink SQL 中的一种创新型表类型,旨在进一步简化流和批作业的数据处理流程,同时提供统一的开发体验。在即将发布的 Flink 2.0 中,我们正在增强物化表所支持的功能,包括与主流的湖格式进行集成以及生产就绪的调度器实现。
批作业的自适应执行
此外,Flink 正在不断提升其自适应批处理能力。即将发布的 Flink 2.0 将具备基于作业已完成的阶段所提供的信息,对逻辑计划和物理计划进行动态优化的能力。初步支持的策略包括动态应用 Broadcast Join 以及对数据倾斜的 Join 进行优化。
流式湖仓
以 Apache Flink 和 Apache Paimon 的集成为代表的流式湖仓架构将湖仓范式中统一的数据存储、开放格式和成本效益扩展到了实时领域。即将发布的 Flink 2.0 在 Flink 和 Paimon 的集成方面迈出了重要一步:Flink 和 Paimon 社区正在密切合作,充分结合彼此的优势以及核心功能,带来了诸多重要改进,包括但不限于:使用 Paimon 丰富的合并引擎进行 SQL 执行计划优化、大幅提升 Lookup-Join 的性能、支持 Flink 物化表、以及对自适应批处理和推测执行的支持。