SeaTunnel 现在已经有了 Transform 插件目录页,也有 Transform 通用参数页,但还缺一篇从系统视角解释 Transform 位于整条链路哪里、共享哪些契约、贡献者该如何理解这一层的文档。
这篇文档补的就是这部分。
Transform 位于 Source 和 Sink 之间,作用对象是 SeaTunnel 自己的行模型与表模型:
Source -> Transform Chain -> Sink
在实际作业里,Transform 块是可选的,但以下场景通常都会依赖它:
SeaTunnel 通过 plugin_output 注册中间数据集,通过 plugin_input 消费一个或多个上游数据集。因此 transform 链路可以表达成逻辑图,而不只是死板的单链路。
从系统角度看,Transform 不只是字段映射,它主要承担以下职责:
这也是为什么 Transform 层在批处理和 CDC 链路里都非常重要。
Transform 体系主要围绕下面这些契约构建:
SeaTunnelTransform:基础运行时契约SeaTunnelMapTransform:一进一出的行转换SeaTunnelFlatMapTransform:一进零到多出的行转换TableTransform:用于创建运行时 transform 实例的包装层TableTransformFactory:基于 SPI 的工厂入口TableTransformFactoryContext:向工厂传递 ReadonlyConfig、类加载器和上游 CatalogTable 元数据的上下文之所以这样拆,是因为 SeaTunnel 希望 Transform 插件同时满足:
相关文档:
从高层看,Transform 的准备流程大致如下:
TableTransformFactoryCatalogTable 元数据放入 transform factory context关键设计点在于:Transform 插件首先作用于 SeaTunnel 自己的契约,Flink、Spark 或 Zeta 的适配发生在后面。
当前 Transform 生态已经比较丰富,但大致可以归为几类:
这类插件主要用于把上游字段整理成下游期望的 schema。
这类插件负责决定哪些记录或哪些逻辑表继续沿链路流动。
当转换逻辑更适合用声明式方式表达,而不是自定义代码时,这类插件会更合适。
这类插件在 CDC 链路里尤为关键,因为它们能把变化语义保留下来,或者改造成下游更容易消费的形态。
这类插件适用于需要更复杂业务逻辑、外部模型或可编程处理能力的场景。
新增或评审 Transform 插件时,建议先检查这些点:
Option 与 OptionRule 定义用户可见参数一般来说,Transform 层应该负责行数据与 schema 的改写,而不是外部提交语义或引擎运行时细节。
并不是。很多作业里真正的业务映射、schema 对齐和 CDC 适配都发生在 Transform 层。
也不对。特别是在多表和 CDC 场景下,很多 transform 同时需要保留或改写 schema 与元数据。
可移植性是设计目标,不是自然副作用。贡献者仍然需要避免引擎特定假设,并遵守 SeaTunnel 的 API 契约。