随着大数据技术的不断发展,数据同步工具在企业中的应用变得愈发重要。为了满足复杂多样的业务需求,找到一款高效、灵活的数据同步工具变得尤为关键。
在这篇文章中,我们将分享兆原数通研发经理李洪军对Apache SeaTunnel的选择、应用及经验。这些实际应用经验将为新用户提供宝贵的参考,帮助大家更好地理解和使用SeaTunnel。
为什么选择SeaTunnel
在调研数据同步工具时,我们最初选择了DataX,并使用了两三年。然而,随着业务需求的增加,我们发现了一些问题。例如,DataX只支持单机部署,不支持集群。此外,虽然DataX支持常见的数据库如Oracle和PG,但对于一些不支持upsert的情况,以及用户特定的使用场景,DataX无法满足我们的要求。这些问题促使我们重新启动调研并选择新的数据同步工具。
经过一番研究,我们在GitHub上发现了Apache SeaTunnel项目。SeaTunnel不仅满足了我们对高可用性、upsert支持以及任务暂停功能的需求,而且其配置也比DataX简单。此外,SeaTunnel的扩展性和社区活跃度都非常高。
从调研到测试再到上线,我们大约花了2-3个月时间。当时测试的是2.3.3版本,使用后感觉不错。目前我们已经从DataX迁移到SeaTunnel,并升级到了最新的2.3.4版本。
SeaTunnel 解决了什么问题?
大家先看下面这个流程图,最开始我们使用 DataX。上层是 Web 页面,通过调度引擎(之前用的是 XXL-Job),通过 Web 页面组装,把源数据采集过来后,获取源数据的 Java 类型,通过页面配置表,输入作为源端,输出作为目标端,中间可能会有一些转换操作。
通过页面化、图形化、拖拽的形式组装好后,把数据发给调度引擎,调度引擎动态生成一个 DataX 模板,然后在底层执行。迁移到 Apache SeaTunnel 后,流程基本未变,只是基于 SeaTunnel 重新设计了 Web 页面风格。
另外,调度方面我们替换使用了 Apache DolphinScheduler。海豚调度支持很多主键,如常规的 Shell、SQL 节点、依赖节点、Hive,以及市面上常见的数据同步工具的调度。所以我们把 XXL-Job 换掉了。
最终架构是通过页面组装参数,组装好后发给调度中心进行调度执行,最后调度中心有自己的监控来传递到底层。
有什么经验可以分享?
我们使用这套架构的原因
我们现在所做的主要工作是通过 Web 页面进行数据集成和同步。我们通过拖拉拽操作,把数据源和目标端的信息传递到底层。例如,传递源端表和目标端表的名称,然后基于自动建表和源数据的 Java 类型生成表结构。我们利用 FreeMarker 模板,将 source、sink 和 transform 组件,包括 JDBC 和 Hive 等组装成对象,再动态生成 SeaTunnel 所需的配置文件。底层通过 Apache DolphinScheduler 调度和执行命令行任务。
在数据同步过程中,我们重点关注同步性能和易用性。任务的状态和性能指标通过改进的 DolphinScheduler 进行监控和收集,并将这些信息发送到 Kafka 消息队列中。通过我们的告警中心,对任务的成功或失败进行告警,监控任务类型并处理性能瓶颈。日志中的读写效率通过接口获取并展示在页面上,包括实时进度和曲线图。
在性能测试方面,我们发现从 TDSQL 到 Kafka 的数据同步速度约为每秒 9-10 万条记录,处理大约 3 亿条数据。从 TDSQL 到 OSS 的速度有时能达到每秒 20 万条记录。通过这些测试,我们确保了 SeaTunnel 的高效性能。
性能问题怎么定位?
在关注社区并参与多个用户群后,我发现许多人会问关于性能的问题,比如为什么速度很慢。面对性能问题你要去定位的时候,我们通常分两种情况:一种是读取源端数据的性能慢,另一种是数据加载的性能慢。
对于读取和写入都慢的情况,例如从 TDSQL 到 TDSQL,我们可以先将数据落地成文件,因为写入文件通常比写入数据库快。这样可以先判断从 TDSQL 到文件的读取性能,再检查文件到 TDSQL 的写入性能,以确定是读取慢还是写入慢。
另外,对于 HBase 的写入,我们注意到以 put 形式写入较慢,而使用 bulkload 方式写入会更快。在定位同步性能问题时,首先要区分是读取慢还是写入慢。我们可以使用 console sink 来测试读取的纯读性能,再测试写入性能。因为在 CTR(读取和写入)过程中,如果写入慢,读取也会变慢,因此通过任务监控难以判断具体是读慢还是写慢。我们需要借助测试工具如本地文件或 console sink 来判断性能。
怎么解决遇到的问题?
最容易碰到的坑就是JAR包冲突,尤其是数据库版本不兼容时选择驱动的问题。
对熟悉SeaTunnel的小伙伴来说,使用Zeta引擎时,lab目录下会包含Hadoop、Hive的包和数据库驱动,这些包容易冲突。我们有一个新的filter功能,为所有连接器提供严格的class load隔离。之前,Hadoop的假包没有隔离,导致使用Hive或Hadoop时冲突。这个功能完成后,每个连接器将有独立的包目录,引擎的Hadoop包也会独立存放。这将允许在同一作业或集群中支持不同版本的Hive、Hadoop和数据库。
这个功能计划在2.4版本中推出,预计会带来较大改动。当前版本是2.3,因此相关改动会在2.4中实现。
对于刚开始使用SeaTunnel的新用户,您有什么建议?
对于刚开始使用SeaTunnel的用户,以下是我的经验,希望能够帮助大家少走一些弯路:
阅读官方文档:首先要详细阅读官方文档,了解基本配置和使用方法。官方文档通常会提供详细的安装、配置和操作指南,是入门的最佳资料。 下载并运行官方压缩包:对于不想立即接触源码的用户,可以先下载官方提供的压缩包,放在服务器上运行,熟悉基本的操作流程和SeaTunnel的运行机制。 深入了解源码:如果希望深入了解SeaTunnel的工作原理,可以将源码拉下来,查看配置文件,运行并调试源码,理解各个节点的运行和数据流向。 调整配置和源码:在运行过程中,如果发现某些功能不满足需求,可以通过调整配置文件或修改源码来实现。例如,有时可能需要处理一些映射关系未匹配的字段,这时可以通过修改源码来解决问题。 梳理源码流程:在学习过程中,建议梳理一些源码的流程图,以便更好地理解SeaTunnel的内部逻辑和关键字的实现。例如,搜索特定的关键字(如“拆片”)来定位相关类和方法,有助于更高效地进行源码研究和修改。 这些建议能够帮助新用户快速上手SeaTunnel,并在遇到问题时更有条理地进行解决。希望大家能够顺利使用SeaTunnel,提高工作效率。
如何快速学习?
在学习和使用 SeaTunnel 时,以下方法和资源能够帮助大家更高效地掌握该工具:
利用 Example 进行调试
Example 是 SeaTunnel 学习和调试的关键资源。几乎所有的连接器和作业都可以在 Example 中运行,特别是需要云环境的部分,如果已经准备好了云环境,也可以在 Example 中调试。这可以帮助我们熟悉并打通整个流程。
E2E 模块的重要性
SeaTunnel 的代码中有 E2E 模块,这个模块包含了所有连接器的使用方法,并提供了详细的测试用例。通过查看和运行 E2E 模块中的测试用例,可以更全面地了解各个连接器的用法和流程。
学习路径和参考资料
官方文档:阅读官方文档,了解各种示例和参数配置。官方文档会从 2.3.5 版本开始提供中文档,虽然初期可能不全,但会逐步完善。
- 必填参数:在配置时,先关注必填参数,非必填参数通常有默认值,可以不填。
- 本地调试:使用 Docker 在本地运行 E2E 测试,方便快速上手。
- 社区和贡献:也希望社区用户和贡献者共同完善文档,以帮助更多新用户更快地了解和使用 SeaTunnel。
通过 Example 和 E2E 模块,结合官方文档和社区资源,可以高效地学习和使用 SeaTunnel。希望这些建议能帮助大家少走弯路,更快地掌握这款工具。
使用SeaTunnel对您个人技术成长有什么影响?
有的,像之前我们自己可能也没有参与这种很深的架构,通过深入了解 SeaTunnel 的架构,特别是像 Hazelcast 这种分布式存储和任务调度技术,可以提升对分布式系统的理解和应用能力。
此外,SeaTunnel 的读写插件和传输功能,采用了 SPI 和 auto service 等技术,这些在日常公司编码中不常遇见的技术,对拓展知识面和提升技能有很大帮助。总的来说,SeaTunnel 不仅提高了技术经验,还扩展了知识广度,为个人职业发展提供了有力支持。
社区有支持bulkload计划?
目前我们使用 Hive 写入时是以 put 形式进行的,这种方式性能较慢。我看到有用户在社区提到是否可以支持 bulkload 计划,不知道社区是否有相关计划。之前有一位贡献者跟我讨论过这个问题,但我不太清楚后续进展。如果社区没有计划支持 bulkload,我们打算先自行实现,然后再贡献给社区。
如何改列名?
在使用 HBase 读取数据时,列名中有冒号会引发转换问题。通常我们通过 transform 处理列名。例如,可以在 transform 中添加规则,将列名中的特定字符替换为其他字符。当前我们确实通过这种方式实现了对列名的修改,即截取冒号前后的部分。
高老师:我们可以进一步讨论这个解决方案,建议创建一个 issue 或发送邮件,详细描述你的方案设计,看看是否能够合并到主分支。
hazelcast 有没有什么工具可以看到底层执行的东西,具体存取动作?
我这里有个问题,关于以前使用的 Hazelcast,感觉门槛比较高。有没有什么方便的工具可以查看引擎内存储的内容?
实际上,我们使用 Hazelcast 主要有三个目的:
集群管理能力:Hazelcast 提供了强大的集群管理功能。 RPC 通信能力:利用 Hazelcast 实现集群节点间的 RPC 通信。 分布式内存网格:将集群的状态、监控数据和运行时状态存储在 Hazelcast 的分布式内存网格中,这相当于替代了 Zookeeper。 通过 Hazelcast 的 message 模块,可以清晰查看当前集群的节点信息、底层的 IMAP 列表、IMAP 中存储的数据量、请求频次及响应时长等。
推荐使用 Hazelcast Manager,尽管它不是开源的,但其部署和配置都很简单,可以方便地查看和管理 Hazelcast 内部信息。
此外,Hazelcast 提供了接口,通过这些接口可以获取详细的监控信息。如果需要自定义界面或集成第三方监控工具,可以使用 Hazelcast 的 JMX 接口;若想使用现成的工具,可以直接使用 Hazelcast Manager。
总之,Apache SeaTunnel不仅解决了我们在数据同步过程中遇到的诸多问题,还大大提升了我们的工作效率。通过分享兆原数通的实际应用经验,希望能够帮助更多的用户更好地理解和使用SeaTunnel,推动开源数据同步工具在更多场景中的应用。感谢每一位为SeaTunnel做出贡献的开发者和用户,让我们共同努力,让SeaTunnel变得更好!
本文由 白鲸开源科技 提供发布支持!