SeaTunnel 现有文档已经说明了 connector 怎么配置、二进制包里的依赖隔离目录怎么放,但还缺一个“从作业配置到插件实例”的运行时总览。
这篇文档解释的就是这条路径:
SeaTunnel 要支持大量 source、sink、transform、format 插件,运行时必须可靠地回答下面这些问题:
如果没有插件发现与类加载这一层,connector 数量一多,很快就会出现依赖冲突和启动脆弱性问题。
一个插件从配置到执行,通常会经过下面这条链路:
作业配置 -> 解析插件名 -> 发现 factory -> 校验 options -> 定位 connector jar 与隔离依赖 -> 创建插件 classloader -> 实例化 source / sink / transform -> 在引擎运行时中执行
每一步的作用都不同:
运行时 SeaTunnel 会用一个逻辑标识来区分插件,通常会包含:
这个标识会被用于:
大多数用户可见插件都是通过 factory 接口创建的。实际运行时,SeaTunnel 主要依赖 Java SPI 和 factory discovery 工具,去加载 META-INF/services 下声明的实现。
典型例子包括:
TableSourceFactoryTableSinkFactory这也是为什么 connector 开发文档里会要求补 factory 注册与 service 元数据。
相关文档:
SeaTunnel 会把插件实现 jar 与 connector 专属的第三方依赖分开管理。
典型布局如下:
SEATUNNEL_HOME/ connectors/ connector-jdbc-<version>.jar plugins/ connector-jdbc/ dependency-a.jar dependency-b.jar
插件名与依赖目录之间的映射关系由 plugin-mapping.properties 管理。
这种设计带来两个直接收益:
相关文档:
不同 connector 很可能依赖同一个第三方库的不同版本。如果所有 jar 都进入一个扁平 classpath,那么一个版本冲突就可能影响同一作业里的其他 connector。
类加载隔离主要在这三处体现价值:
目前最重要的实践差异是:SeaTunnel Engine(Zeta)对 connector 依赖隔离支持更强。现有隔离依赖文档已经明确提到,Spark 和 Flink 在运行期 classpath 共享更紧,因此混合版本场景风险更高。
这在下面几类问题里尤其关键:
ClassNotFoundException 或 NoSuchMethodError插件发现不只是为了实例化运行时对象,它同时也支撑了元数据能力,例如通过 REST API 或 Web UI 暴露 connector 的 option 信息。
因此插件系统不仅要能发现 factory,还要能拿到这类元数据:
OptionRule相关文档:
插件加载失败时,报错症状通常已经能说明是哪一层出了问题。
典型表现:
常见原因:
典型表现:
常见原因:
典型表现:
ClassNotFoundExceptionNoClassDefFoundErrorNoSuchMethodError常见原因:
当插件无法正确加载时,建议按这个顺序检查:
${SEATUNNEL_HOME}/plugins/ 下的依赖目录是否正确plugin-mapping.properties 是否映射到了预期目录新增一个插件时,在怀疑引擎内部逻辑之前,建议先确认这些点:
OptionRule 是否覆盖 required / optional / exclusive 语义建议从这些类开始看:
seatunnel-api/src/main/java/org/apache/seatunnel/api/table/factory/FactoryUtil.javaseatunnel-engine/seatunnel-engine-common/src/main/java/org/apache/seatunnel/engine/common/utils/FactoryUtil.javaseatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/classloader/ClassLoaderService.javaseatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/classloader/DefaultClassLoaderService.javaseatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/service/OptionRulesService.java