- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
SeaTunnel Connector 接入计划与开发避坑指南-王海林
展开查看详情
1 .SeaTunnel Connector 接入计划 与开发避坑指南 新手如何快速上手开发 connector 王海林 白鲸开源 2022.08.19
2 . 01 关于 Connector 接入激励计划 02 认领/开发 Connector 前的准备 CONTENT 03 开发中的一些小事 04 编写 E2E 测试的注意事项 05 提交 PR 前的检查
3 .01 关于 Connector 接入激励计划
4 .关于 Connector 接入激励计划 针对新 Connector API 难易分明、门槛低 完善生态
5 .参与活动 - 做贡献、领礼包 积积分、领礼包、做贡献、乐无限 现在上车也不晚
6 .02 认领/开发 Connector 前的准备
7 .什么是 Connector Connector 由 Source + Sink 组成 Source 负责读取数据 Sink 负责写出数据 Source 通过 Source → 抽象层 → Sink 组合, 完成多种数据源间搬运数据 抽 象 层 SeaTunnelRow Sink
8 .认领 Connector https://github.com/apache/incubator-seatunnel/issues/1946 • 找到感兴趣且没有被认领的 connector • 搜索 issues 中是否有对应的 PR • 留言认领,认领成功后,创建对应的 issue (同步进度、讨论方案、寻求问题帮助)
9 .编译工程 https://github.com/apache/incubator-seatunnel/blob/dev/docs/en/contribution/setup.md • 编译成功后运行文档中的 testcase 解决上述异常: • rm {your_maven_dir}/repository/org/apache/seatunnel • ./mvnw clean • 重新编译
10 .了解 Connector 相关代码结构 工程结构 • seatunnel-connectors-v2 存放连接器代码 • seatunnel-connectors-v2-dist • seatunnel-flink-connector-v2-e2e 端到端自动化测试 • seatunnel-spark-connector-v2-e2e • seatunnel-flink-connector-v2-example 本地运行调试的示例 • seatunnel-spark-connector-v2-example 代码结构(接口、基类) • incubator-seatunnel/seatunnel-connectors-v2/README.zh.md
11 .看看其他人怎么开发 Connector 社区公众号上分享的 Connector 新手开发教程 • https://mp.weixin.qq.com/s/evYRsrpPb-MXEm4DqLdnvQ【SeaTunnel 连接器极简开发流程】 • https://mp.weixin.qq.com/s/8ivksAePmVZe2_2ldGi0AA 【新 API Connector 开发解析】 • https://mp.weixin.qq.com/s/qpO2SVRl9KAY-Ib2kaTDig 【Source 与 Sink API 设计解析】 参考已经合并的 Connector 代码,看看改动的范围、用到的公共接口和依赖、 测试用例 • https://github.com/apache/incubator-seatunnel/pulls?q=is:pr+is:merged+label:connectors-v2
12 .03 开发中的一些小事
13 .开发 Source 相关 确定 Source 的读取模式:流、批 • 使用 Source#getBoundedness 标记模式 • 如 kafka source 中获取 lastOffset 以支持批模式读取 Source 是否需要并发读取 • 如 kafka source 用 partition 分片 • 如 jdbc source 用字段做范围查询分片 Source 是否要支持断点续传 • Source#restoreEnumerator 恢复状态 • Enumerator#snapshotState 存储状态快照 • Reader#snapshotState 存储状态快照
14 .开发 Sink 相关 普通的 Sink • Sink#createWriter 支持失败恢复 • Sink#restoreWriter 恢复状态 • Writer#snapshotState 快照状态 支持两阶段提交 • Sink#createCommitter • Writer#prepareCommit 预提交 • Committer#commit、abort 二阶段提交
15 .Connector 相关 社区正在推动大家使用统一的数据格式定义 • 如需定义 Schema 请参考 PR #2392 • 如需定义 Format 请参考 PR #2435 如果觉得编译速度慢,可以临时注释老版本的 connector 相关 module
16 .如何寻求帮助 在你的 Issue 中描述问题并召唤活跃贡献者 在邮件列表、Slack 中讨论 通过微信群沟通(如果没有加入请关注 SeaTunnel 公众号入群) 对接第三方组件可能会有社区对接群(让你事半功倍)
17 .04 编写 E2E 测试的注意事项
18 .E2E 失败 - 测试用例网络地址冲突 E2E 网络与部署结构 • spark、flink、e2e-testcase 依赖的外部组件(举例如 mysql),三者使用容器 networkAliases(host) 作为访问地址 • spark、flink 两边的 e2e-testcase 可能在同一主机下并行运行 • e2e-testcase 依赖的外部组件需要映射端口到主机供 e2e-testcase 访问 因此,E2E 需要注意 • e2e-testcase 依赖的外部组件,映射到外部的端口、networkAliases 在 spark、flink 两边的 testcase 中不能一样 • e2e-testcase 使用 localhost、上述映射端口访问外部组件 • e2e 的配置文件中使用 networkAliases(host) 、容器内端口访问依赖的外部组件 E2E Testcase 参考 PR #2429
19 .E2E 失败 - Spark jar 包冲突 Spark 默认使用 parent first 类加载器,可能与 Connector 引用的包产生冲突 在 Connector env 中可配置使用 userClassPathFirst 类加载器 但是因为 SeaTunnel 目前的打包结构会导致 userClassPathFirst 不能正常工作 • 建立 issue #2474 跟踪,欢迎贡献 • 目前只能通过文档说明替换 spark jars 目录中冲突的包来解决
20 .E2E 失败 - Connector jar 包冲突 新老版本 Connector 同时被 E2E 工程依赖导致冲突, PR #2414 已解决 Connector-v2 之间版本冲突 • 主要在 E2E 时发生,因为 E2E 工程依赖了所有的 Connector • 未来可能规划为每个 Connector(或版本) 提供单独的测试工程
21 .E2E 不充分 - Sink 逻辑验证 Connector-v2 版本的 FakeSource 目前只能生成固定的几个列的随机数据 • 社区小伙伴正在优化 PR #2406 暂时可以通过 Transform#sql 模拟指定内容的数据
22 .E2E 不充分 - Source 验证数据 Assert Sink 可以配置列规则,但不能做行级 value 检查 暂时可以使用其他带有外部存储的 Connector sink 用于查询验证数据
23 .E2E 稳定性提升 E2E 启动时资源等待,使用 Thread.sleep 的问题 • 给少了不够,给多了浪费 • 因为资源、网络等问题不稳定,当前能跑过以后可能跑不过 使用 Awaitility 替换 Thread.sleep
24 .E2E 提速 将 Sink、Source 合并为一个 E2E testcase 做验证 • 只跑一次 testcase
25 .05 提交 PR 前的检查
26 .提交 Connector PR 前的检查 完整的再编译工程 • codestyle 验证、依赖验证 • 之前编译成功不代表现在还能编译成功 本地运行 E2E 成功 • flink、spark 两边均做验证 补充或更改文档 提交前自己再 Review 一次 • 未被测试覆盖到的地方 • 之前已经 review 过了也需要再次检查 • review 要包括所有文件, 不只是代码 以上,节省 CI 资源、加快 Merged 速度、降低社区 Review 消耗
27 .END