使用Apache SeaTunnel进行二次开发的实践分享

大家好,我是范佳,是Apache SeaTunnel社区的PMC member。今天给大家分享一些基于Apache SeaTunnel二次开发的内容。

file

这部分内容主要涉及代码层面的知识,如果大家有什么疑问,欢迎来社区找我交流!

引言

大部分数据开发工程师基于Apache SeaTunnel的二次开发,可能做的就是任务提交,任务的一些监控,还有在任务没有跑起来之前,我们可能需要预先知道跑起来之后的可能一些结果。

基于以上内容,我将从五个部分来分享相关内容:

  1. SeaTunnel介绍
  2. SeaTunnel的启动能力
  3. 任务监控的定制化
  4. 行为预览与Sink的关联

Apache SeaTunnel 是一个高性能的实时和离线数据批处理平台,自加入Apache软件基金会以来已有两年多时间,期间社区不断发展,增加了许多新功能和特性。

感兴趣的同学可以访问官网:https://seatunnel.apache.org/

Apache SeaTunnel的核心特性

多引擎支持

SeaTunnel支持多种数据处理引擎,包括市场上流行的开源引擎如Spark和Flink,以及SeaTunnel自研的Zeta引擎。这使得SeaTunnel能够灵活应对不同的数据处理需求,无论是大规模数据集还是实时数据流。

海量连接器

项目提供了广泛的连接器支持,使得SeaTunnel可以轻松接入各种数据源和目的地,从而简化了数据集成过程。这一特性对于需要将数据从多个源汇总到单一系统的企业尤为重要。

HTTP支持

对HTTP的支持是SeaTunnel的又一亮点,特别是对于开发者来说,因为它可以显著降低适配成本。通过HTTP支持,开发者可以更容易地将SeaTunnel集成到现有的Web应用和服务中。

流批一体

SeaTunnel的流批一体功能确保了无缝的数据处理,无论是流处理还是批处理,都能在同一个平台上高效运行。这一特性简化了架构,减少了维护的复杂性。

流速控制

作为一个数据同步引擎,SeaTunnel提供了流速控制功能,这对保护下游系统不被过载非常关键。尤其是在上游数据量大而下游系统承载能力有限的场景中,流速控制显得尤为重要。

自动建表

自动建表功能可以极大地帮助简化数据处理流程,特别是对下游系统来说。这一功能允许SeaTunnel根据数据自动创建表结构,减少了手动介入的需要,提高了数据管道的灵活性和效率。

SeaTunnel的启动

一般来讲,我们基于开源软件二开,第一步就是启动,而启动SeaTunnel任务的第一步是准备用户界面,确保二开后的用户可以通过界面触发或定时提交任务。

一旦用户界面设置完成,以下是使用Shell脚本提交任务的基本步骤:

编写Shell脚本:创建一个Shell脚本,用于封装启动命令和任务参数。

file

执行命令:通过执行Shell脚本来提交任务到SeaTunnel引擎。

Job ID的获取与管理

在任务提交时,我们的引擎会返回一个任务ID。

这个ID在使用脚本模式启动时只会打印在日志文件中。如果需要监控任务,需要解析日志文件以获取任务ID。

然而,这种方式比较滞后,因为ID是引擎端生成的,可能需要等待一段时间才能得到。

为了解决这个问题,我们新增了一个功能,允许在提交任务时配置自定义ID。这个ID可以由第三方服务或集成SeaTunnel的平台生成,然后传递给SeaTunnel,SeaTunnel会使用该ID作为任务的唯一标识。

这项功能虽然小,但对于二次开发或集成非常有用,避免了解析日志或等待SeaTunnel生成ID的过程。

提交任务的三种方式

Shell模式

通过Shell脚本启动任务时,可以在日志文件中获取任务ID。

REST API模式

我们也支持通过HTTP提交任务。这种方式无需额外启动客户端,对第三方集成更加友好。

file

HTTP提交任务的方式更加自然和通用。

SeaTunnel Client 模式

对于更深度、精细化和功能更强大的任务提交方式,推荐使用SeaTunnel Client。

file

SeaTunnel Client是一个核心类,通过它可以提交所有任务。无论是引擎内部代码还是外部集成代码,都可以使用这个Client提交任务到集群。

通过SeaTunnel Client,我们可以在JVM进程中直接提交任务。例如,在一个Spring服务中,用户点击启动按钮后,后端可以直接使用SeaTunnel Client提交任务,而不需要启动一个额外的HTTP或Java进程。

这种方式的好处包括:

  • 及时响应任务状态:任务的状态可以通过回调机制及时返回客户端。
  • 异步操作:任务执行时,客户端会返回一个Future,可以通过Future进行异步操作。例如,任务结束时注册回调函数来处理业务逻辑。
  • 深度集成:这种方式使SeaTunnel与二次开发的平台集成更加深度和紧密。

任务监控

启动任务后,我们需要对SeaTunnel进行监控,以了解任务的状态。

例如,任务是否启动成功?运行了多久?数据是否成功读取?任务是否失败?失败的原因是什么?这些都是二次开发时需要关注的内容,因为我们不能保证所有任务都能正常运行。

监控任务状态

我们可以通过以下三种方式监控任务状态:

  1. Shell脚本:通过Shell脚本查看所有任务的状态,例如任务是正在运行、失败还是完成。
  2. HTTP:通过HTTP接口获取任务状态,例如任务是否失败以及失败原因。
  3. SeaTunnel Client:SeaTunnel Client不仅可以提交和取消任务,还可以查询任务状态。

比如说下面的截图,这个就是一个job result

file 然后这个 job result 也是我们SeaTunnel client 返给我们的,然后我们就可以看到里面的状态。

file 如何调用SeaTunnel Client?

传入任务ID即可获取任务状态,任务是正在运行还是失败。对于集成开发来说,获取任务异常信息非常重要。如果通过Shell脚本查看日志,用户需要手动解析日志文件。

这在集成的Web页面中并不方便。因此,我们推荐通过HTTP或SeaTunnel Client获取异常信息。

指标监控(Metrics)

除了监控任务状态之外,我们还需要有指标。

例如,任务虽然在运行,但它是否真正读取到了数据?读取了多少数据?写入了多少数据?吞吐量是多少?这些都是需要关注的指标。

SeaTunnel引擎内部提供了对应的指标获取方式,有以下三种方式: 1.Shell脚本:通过Shell脚本可以查询任务的各项指标。 2.HTTP:通过HTTP接口可以获取任务的各项指标。 3.SeaTunnel Client:通过SeaTunnel Client可以查询任务的各项指标。

核心监控指标

我们可以监控的核心指标包括:

●读取数量 ●读取的字节数 ●QPS(每秒查询率) ●每秒字节数 ●写入数量 ●写入的字节数

对于CDC(Change Data Capture),我们比较关心的是CDC的延迟,即从CDC源端的数据产生到SeaTunnel读取到它的延迟是多少。

目前,我们的支持是每个任务级别的,但对于每个任务中的每张表的支持还比较弱,因为SeaTunnel支持多表任务,即一个任务可以读取和写入多张表。我们正在改进这方面的支持。

指标暴露

除了查询指标外,我们还可以将指标定时对外暴露,例如暴露到Prometheus或SeaTunnel的指标体系中。

目前,SeaTunnel对这方面的支持还比较弱,但我们希望在未来能更好地支持将指标对外抛出到第三方组件,如Prometheus,这样对用户会更友好。

定制化指标

我们提供的默认指标可能不能满足所有用户或开发者的需求。那么,如何定制属于内部系统或二次开发系统的指标呢?

file

定制化指标集成实际上很简单。可以通过我们的context对象来实现。这个context对象包含一个MetricsContext对象,我们可以向其中注册自定义指标。

file

  1. 定义指标名称:这是一个字符串,代表指标的名称。
  2. 注册指标:通过MetricsContext对象注册自定义指标。
  3. 更新指标值:当需要更新指标值时,通过调用提供的方法将值更新到对象中。

这样就完成了定制化指标的集成,通过这种方式注册的自定义指标,可以通过HTTP、Shell脚本或SeaTunnel Client查询和展示。

事件系统

除了指标外,如果需要一些瞬发性的事件处理,例如在某些事件发生时收到通知,可以使用SeaTunnel内部设计的事件系统。

file

事件示例

SeaTunnel的事件系统可以处理以下事件:

  • Reader打开和关闭事件
  • Task打开和关闭事件
  • 自定义事件 当这些事件发生时,SeaTunnel会将事件汇总,并发送到Master节点进行处理。

file

DDL 事件

后续我们会实现DDL事件的发送功能。社区正在开发的DDL功能主要是为了应对schema变化,例如在MySQL CDC运行过程中,schema发生变化会产生DDL事件。

我们可以将这些DDL事件包装成对应的事件发送出去。外部系统可以接收到这些事件,比如某个表增加了一列或删除了一列,然后进行相应的展示或处理。这是事件系统的作用。

自定义事件

就像我们可以自定义metrics一样,事件也可以自定义。自定义事件的方式与metrics非常相似。用户可以实现自己的事件来处理特定业务需求。

file

自定义事件的实现

在metrics中,可以通过context对象获取MetricsContext。同样地,在事件系统中,我们可以获取EventListener,然后通过它注册和处理自定义事件。

我们提供了对应的接口EventHandler,它是一个SPI实现。用户可以实现自己的handler,然后将其放到lib目录下,或者打包到应用中。

file

有了这个handler之后,Master节点会发现所有的EventHandler,并调用它们的handle方法。具体的事件处理逻辑由实现的handler决定。

默认事件处理实现

我们内部提供了一个默认的实现:JobEventHttpReporterHandler。这个handler会将事件通过HTTP接口发送到用户配置的地址。

file

用户可以通过这个接口接收引擎中的事件,例如任务开始、任务结束、数据到达等。

事件系统不仅用于捕获运行时的事件,还可以用于DDL事件。例如,MySQL CDC运行过程中,schema变化会产生DDL事件。我们可以将这些DDL事件包装并发送出去,外部系统可以接收到这些事件并进行相应处理,例如展示schema变化、执行后续操作等。

集群节点健康状况监控

除了任务级别的监控,我们还需要关注集群节点的健康状况。作为一个集群系统,了解整个集群是否正常运作非常重要。这些信息可以通过SeaTunnel Client获取。

file

获取集群健康信息

通过SeaTunnel Client,我们可以获取到集群的一些健康信息。这些信息包括但不限于:

  • 内存使用情况
  • GC次数
  • RPC操作延迟
  • RPC请求次数

这些与性能和集群稳定性相关的信息能够帮助我们更好地监控和维护系统。

例如,我们可以通过SeaTunnel Client获取集群节点的健康状况,并在页面上展示出来。如果在3个节点的集群中,只有2个节点正常,我们可以通过接口判断并处理异常节点。

SaveMode

SaveMode与Sink密切相关,决定了在写入数据之前执行的一系列操作。这些操作包括自动建表、表重建、数据清空或数据追加。

通过配置schema_save_mode和data_save_mode,可以定义这些行为。

SaveMode配置示例
  • schema_save_mode:定义如何处理schema。例如,是否重新创建schema,或者在不存在时创建。
  • data_save_mode:定义如何处理数据。例如,是否清空数据,或者追加数据。

行为预览

我们预览的核心是 SaveMode 到底会怎么操作。这一块是纯代码层面,如果要集成的话,肯定需要写代码。虽然不像 HTTP 那么简单,但它非常有用。

例如,我现在任务还没开始跑,或者即将定时运行。我想知道在配置了表重建的情况下,任务到底会创建表还是不会创建表。在任务运行前,我们可以通过行为预览确定 SaveMode 和 data SaveMode 的行为。这对于涉及表操作的情况尤其重要,因为表操作可能比较敏感。

数据结构的变化

比如说我们从 source 端读取的是 MySQL 的表,MySQL 表在二次开发中可能会涉及到一个 CatalogTable。

file

我们会将外部系统的表抽象成内部统一的 CatalogTable。例如,从 MySQL 读取一张表,然后转换成系统内部的 CatalogTable。

file

表结构预览

如果任务配置读取表 a,我们可以通过页面上的一些操作,预览表 a 的输出结构。

file

具体步骤如下:

  1. 获取 TableSourceFactory。
  2. 将配置传入,构建 TableSource。
  3. 通过 source 提供的方法获取 productCatalogTable。

file

这种预览在任务还没有真正跑起来时就可以执行,确保任务读取的表结构是正确的。

Transform 预览

例如,我们有 SQL 作为 transform 操作,希望在 SQL 中改一个字段的类型,同时增加和删除一些字段。

file

预览功能可以在任务运行前确认这些操作是否会如期执行。

具体步骤如下:

  1. 获取 TransformFactory,构建 transform。
  2. 将配置传入,并传入 source 端生成的 CatalogTable。
  3. 获取 transform 输出的表结构,确认 transform 操作是否正确。

Sink 端操作预览

从 transform 输出的表结构,需要传入 Sink 进行写入操作。涉及到自动建表时,我们可以通过 SaveModeHandler 确认以下内容:

  1. Sink 是否需要建表?
  2. 表名是什么?
  3. 字段有哪些?

SaveMode handler 会根据 schema_save_mode 和 data_save_mode 配置,以及 catalog 中的表判断是否需要建表。

SaveMode Handler 的作用

当我们具体操作Catalog,比如说Catalog 有一个 exist 的方法去判断我们的 table pass ,根据我们的 schema_save_mode, data_save_mode 去判断我们的接下来的这一块的行为到底是什么?

SaveMode Handler 提供了能力,例如:

  • 判断当前的 schema_save_mode 和 data_save_mode 配置。
  • 处理表的路径(TablePath)。
  • 调用 catalog 提供的方法判断表是否存在。

通过 SaveModeHandler 提供的能力,可以预览和确认任务在运行时是否会创建表或进行其他操作。

执行 SQL 预览

我们执行 SQL 时,可以提前看到将要建表的 SQL。例如:

  • 对于某些用户来说,SQL 可能比较敏感。
  • 预先知道 SQL 是否合理,如果不合理,可以在基础上修改后手动创建。

我们提供了 Catalog 预览功能,调用 preAction 方法可以预览建表或删除表的 SQL。

在建表时,输出表结构的类型非常重要。我们需要知道内存中看到的类型在自动建表时会被建成什么类型。

为此,SeaTunnel 内部有一套叫 TypeConverter 的接口体系。

TypeConverter 的作用
  1. 类型转换:将 SeaTunnel 的类型转换成数据库的类型。
  2. 反向转换:读取表时,将数据库的类型转换成 SeaTunnel 的类型。

通过 TypeConverter,我们可以预览并确认 SeaTunnel 和数据库之间的字段类型交互。例如,通过转换和反向转换,我们可以知道表字段类型在 SeaTunnel 和数据库之间的具体表现。

类型转换(TypeConverter)

在行为预览中,我们可以通过 TypeConverter 接口体系实现类型转换的预览。预览与实际运行时的转换结果一致,因为实际运行中也是通过这套代码进行类型转换。

示例

通过集成 Type Converter 接口,我们可以在预览时确认建表的具体类型。

file

例如:

  • 将 SeaTunnel 类型转换为数据库类型。
  • 读取表字段时,确认数据库字段类型在 SeaTunnel 中的表现。

总结

今天给大家主要分享了以下内容:

  1. 多种启动方式:包括三种主要的启动方式。
  2. 指标获取:如何获取指标信息。
  3. 错误信息获取:如何获取并处理错误信息。
  4. 自定义指标:如何创建和获取自定义指标。
  5. 事件系统:如何创建、读取和处理事件,包括自定义事件和现有事件的读取。
  6. 系统相关信息获取:如何获取集群和节点的健康状况等信息。
  7. 数据结构预览:如何预览数据结构、建表 SQL 和外部系统的交互类型。

SeaTunnel 内部已经实现了许多功能,通过集成这些功能,可以实现更高效、更兼容的二次开发。

希望这些接口和设计能让大家在集成和二次开发时更加简单和高效,欢迎大家基于这些标准化体系进行扩展,并将实现的功能回馈给社区,使 SeaTunnel 更加丰富和强大。

通过本文的分享,能够帮助大家对 SeaTunnel 的二次开发有更深入的了解。如果大家有任何问题,欢迎随时与我交流。谢谢大家!

本文由 白鲸开源科技 提供发布支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序实战教程】之微信小程序 WXML 语法详解

WXML语法基础 从本章开始,我们就正式进入到了小程序项目开发学习的初级阶段,本章将介绍小程序的界面构成。有过网页开发学习经历的同学都知道,网页开发所使用的技术是HTML、CSS和JS,其中HTML用于描述整个网页的结构,也…

第三十一天 chrome调试工具

打开调试工具 页面空白处右击 检查 或者F12 使用调试工具 ctrl滚轮改变代码大小 左边是html 右边是css css可以直接改动数值左右箭头或者直接输入 查看颜色 ctrl0 复原浏览器大小 点击元素右侧出现样式引入 没有的话 说明类名或者样式引用错误 这里的.new-left是存在的 如果类…

四步实现网站HTTPS访问

随着网络安全的重要性日益凸显,HTTPS(超文本传输安全协议)已成为现代网站的标准配置。HTTPS协议作为HTTP协议的安全版本,通过SSL协议加密数据传输,不仅能保护用户数据的安全,还能提升搜索引擎排名&#xff…

linux之shell脚本实战

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

docker 构建 mongodb

最近需要在虚拟机上构建搭建mongo的docker容器,搞了半天老有错,归其原因,是因为现在最新的mango镜像的启动方式发生了变化,故此现在好多帖子,就是错的。 ok,话不多说: # 拉取最新镜像&#xf…

华为云依赖引入错误

问题:记录一次项目加在华为云依赖错误,如下: 错误信息:Could not find artifact com.huawei.storage:esdk-obs-java:pom:3.1.2.1 in bintray-qcloud-maven-repo (https://dl.bintray.com/qcloud/maven-repo/) 找到本地仓库&#…

Minos 多主机分布式 docker-compose 集群部署

参考 docker-compose搭建多主机分布式minio - 会bk的鱼 - 博客园 (cnblogs.com) Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能 中文地址:MinIO | 用于AI的S3 & Kubernetes原生对象存储 官网地址&#xf…

系留无人机在技术上有哪些优势或创新点

系留无人机在技术上具有显著的优势和创新点,主要体现在以下几个方面: 1. 长航时飞行作业: - 系留无人机系统由地面通过市电、发电机或电池组供电,并通过系留线缆将电力传输至无人机,实现了不间断供电。 - 这种供电方式…

QT5:嵌入式linux开发板调用键盘

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录​​​​​​​ 前言 一、Buildroot构建QT环境 1.1 构建环境 1.2 检查qtvirtualkeyboard库 二、测试过程 2.1 直接调用qtvirtualkeyboard 1.测试代码 2.测试效果 2.2 运行…

PyCharm2024 专业版激活设置中文

PyCharm2024 专业版激活设置中文 官网下载最新版:https://www.jetbrains.com/zh-cn/pycharm/download 「hack-jet激活idea家族.zip」链接:https://pan.quark.cn/s/4929a884d8fe 激活步骤: 官网下载安装PyCharm ;测试使用的202…

细说MCU用DMA改变DAC输出信号频率和改善输出波形质量的方法

目录 一、参考硬件 二、修改定时器参数改变输出波形频率 三、改善波形质量 四、代码修改 五、查看结果 一、参考硬件 本项目的软件硬件工程参考作者的其他文章:细说MCU用DMA实现DAC输出的方法-CSDN博客 https://wenchm.blog.csdn.net/article/details/14065…

VUE3——001(02)、开发环境配置(vs code与git和gitee)

一、配置 Git 路径 系统装好,差不多的该安装的都安装了,剩下就是不用安装配置一下系统变量就行了(当然,不想配变量重新安装一遍也是可以的)。 记得配好了 git 的变量,在 vs code 中总是刷不出来&#xff0c…

一篇文章讲清楚html css js三件套之html

目录 HTML HTML发展史 HTML概念和语法 常见的HTML标签: HTML 调试 错误信息分析 HTML文档结构 HTML5的新特性 结论 HTML HTML是网页的基础,它是一种标记语言,用于定义网页的结构和内容。HTML标签告诉浏览器如何显示网页元素,例如段落…

【轨物方案】成套开关柜在线监测物联网解决方案

随着物联网技术的发展,电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式,这种方法不仅效率低下,而且难以保证设备的实时性和安全性。因此,基于物联网技术的成套开关…

photoshop学习笔记——选区

选区工具快捷键:M shift M 切换 矩形/椭圆选区工具 基本用法 选区框选出的地方被激活(其后进行的操作,仅在选区中生效) 选区工具选择后(以矩形选区为例) 按下鼠标左键拖动,画出一块矩形区…

最新篇 接口测试工具Postman 企业常规面试题出炉~(附答案)

面试题目录 说下你对Postman的了解? Postman你在工作中使用流程是什么样的? Postman 你使用了哪些功能? Postman 里面如何管理测试环境? Postman如何设置关联? postman参数化有哪几种方式? 在postman中&…

Android平台RTSP|RTMP直播播放器技术接入说明

技术背景 大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以Android平台…

浏览器【WebKit内核】渲染原理【QUESTION-1】

浏览器【WebKit内核】渲染原理【QUESTION】 1.浏览器输入一个网址(域名之后),浏览器会呈现一个新的页面,中间的过程是怎么实现的? 输入一个网址之后,首先DNS服务器会解析这个域名,将这个域名解析成IP地址&…

.NET 相关概念

.NET 和 .NET SDK .NET 介绍 .NET 是一个由 Microsoft 开发和维护的广泛用于构建各种类型应用程序的开发框架。它是一个跨平台、跨语言的开发平台,提供了丰富的类库、API和开发工具,支持开发者使用多种编程语言(如C#、VB.NET、F#等&#xf…

09 算术运算符

① 运算符除了用于算数加法以外,还可以用于列表、元组、字符串的连接,但不支持不同类型的对象之间的相加或连接。 print([1, 2, 3] [4, 5, 6]) # 连接两个列表 print((1, 2, 3) (4,)) # 连接两个元组 print(hello 123) # 连接字符串 print(Fa…