如何高效接入 Flink:Connecter / Catalog API 核心设计与社区进展_百 ...
发布网友
发布时间:2024-10-23 22:50
我来回答
共1个回答
热心网友
时间:2024-11-06 09:51
为了高效接入 Flink,理解其核心设计与社区进展至关重要。本文将分层次介绍 Flink API 的核心内容,从 DataStream API 到 Table 和 SQL API,再到 Connector 和 Catalog API。
首先,DataStream API 是基础,针对 Java 开发者,通过实现 Source 和 Sink API 来直接构建 Stream 算法。为了支持 Table 和 Catalog,需要在 Source 和 Sink 的基础上,针对 Connector 提供的 API 进行二次开发。
在 Source API 部分,从 Flink 1.12 开始引入,逐渐稳定并标记为 Public,取代了之前的 InputFormat 和 SourceFunction。设计上采用主从结构,类似 Flink 集群,分为 SplitEnumerator 和 SourceReader。SplitEnumerator 负责枚举分片,而 SourceReader 以 Subtask 级别并发执行,通过 RPC 与 Enumerator 通信,封装 SourceEvent 协调工作。为了简化开发,引入了 SourceReaderBase 和 SplitReader,将外部系统交互与 Flink 协作分离,减轻开发者负担。
在开发 Source 时,需注意与外部系统和 Flink 之间交互的分离,避免影响主线程和 Checkpoint 运行。利用 SourceReaderBase 和 SplitReader,可以复用现有逻辑,降低开发复杂度。
为了满足更多需求,Flink 在最近版本中引入了 Hybrid Source,它允许在不同 Source 之间切换,如从文件系统切换到消息队列。通过封装现有 Enumerator 和 Reader,提供切换能力,确保数据流平滑过渡。
Watermark Alignment 机制解决了不同 Source 间进度差异导致的下游算子等待问题,通过 CoordinatorStore 交换 Watermark 信息,确保进度同步。
SinkAPI 设计相对简单,Sink 作为工厂类构建拓扑,核心组件是 SinkWriter 负责数据序列化和外部系统输出。对于 Exactly-once 和第二阶段提交的需求,引入 SinkCommitter 组件。Async Sink 基类提供通用的异步输出逻辑,内置异常重试,实现 at-least-once 语义,简化开发。
集成至 Table/SQL API 时,Source 和 Sink 需实现 DynamicTableSource 和 DynamicTableSink 接口,提供对 Planner 的兼容性和配置构建。LookupTableSource 支持外部系统查询,通过 LookupFunction 实现点查逻辑。Sink 的实现同样依赖于 DynamicTableSink 接口。
为了简化用户配置和管理,Catalog API 提供外部系统信息的统一抽象,包括 Database、Table 等概念的映射。它能够简化配置,降低使用门槛,并支持血缘信息管理,通过 Catalog Modification Listener 监听表的增删操作。
实现自己的 Connector 时,首先接触的是 Source 和 Sink API,这是构建 Stream 算法的基础。为了支持 SQL 和 Table 生态,需实现 DynamicTableSource 和 DynamicTableSink。通过对接 Catalog API,可以利用外部系统的概念,简化用户操作,降低使用成本,并获得血缘管理能力。