众安保险基于Apache SeaTunnel的生产应用实践

news2024/11/15 19:31:22

*> 文|曾力 众安保险大数据开发高级专家

编辑整理| 曾辉*

前言

众安保险从2023年4月就开始了数据集成服务的预研工作,意在通过该服务解决当前数据同步场景下的两大痛点,服务化能力薄弱和无分布式同步能力。我们对多种开源数据同步中间件的调研和性能测试,最终选择Apache SeaTunnel 及其新的Zeta引擎,进行服务化包装。

2023年10月,我们 基于2.3.3版本,开始进行二次开发。主要是完善服务化接口、适配连接器特性相关工作。2024年元旦前后,我们完成了数据集成服务的开发,并开始基于MaxCompute到ClickHouse的同步场景开始批量替换存量DataX作业,目前已切换数百个,作业平稳运行,并达到预期的性能提升效果。

后续我们将在实际应用中不断收集反馈、优化和完善服务,并向社区提交迭代和优化建议。

数据集成的痛点

众安保险在2015年左右就开始通过DataX来作为数据集成的同步工具,从淘宝内部的2.0版本到后续社区的3.0版本,其稳定性和效率得到了验证。

但随着时间的推移,我们每日的数据同步作业量由最初的几千个提升3.4万个,面对每天20TB的数据入仓数据量和15TB的数据出仓数据量,以及与流媒体交互场景下单日最大40亿条记录的增量同步场景,DataX展现出了其局限性。

file

DataX作为一款经典单机多线程的数据集成工具,其作业配置化、多并发、插件可插拔、内存数据传递的设计思想是优秀的,为后续很多集成中间件的设计指明了道路。但是其缺乏服务化及分布式处理能力,这限制了其在大规模数据同步场景下的应用。

降低耦合:内部场景中,DataX服务化的局限性,导致其与内部研发、调度平台的严重耦合。 这导致DataX作业运行时的资源消耗(CPU),会严重影响服务性能。

能力扩展:面对未来存算分离和云原生等技术趋势,我们意识到需要一种能够提供服务化能力,支持不同的集成中间件,并适配快速的配置替换。

资源隔离及弹性扩展:我们期望数据同步资源能够更加弹性地被控制和管理,特别是面对我们的3.4万个DataX任务,这些任务被部署在6台配置为16核64GB内存的ECS上,通过逻辑上的三个集群实现部门与子公司之间的隔离。然而,资源使用的不均匀性,尤其是在夜间任务高峰期资源负载可能极高的情况下,强化了对资源弹性可控使用的需求。

面对未来存算分离和云原生等技术趋势,我们意识到需要一种能够提供服务化能力,支持不同执行中间件,并能适应快速发展需求的数据集成工具。

Apache SeaTunnel正是在这样的背景下被选中,它不仅能帮助我们解决现有的数据集成挑战,还能为我们提供一个平滑迁移的路径,确保数据同步任务的高效和稳定执行。此外,Apache SeaTunnel在CDC实时同步方面的能力,以及减少数据同步回流时间的特性,也是我们选择它的重要考虑因素。

为什么选择Zeta

简单易用

  • 多模式部署:支持单进程/集群两种模式,支持容器化Kubernetes/Docke部署;
  • 连接器丰富:社区已提供几十种类型的连接器,并提供了相对完善的功能。社区经过几个版本的迭代,已经能够覆盖DataX的主要功能;
  • 转换器:提供DAG级别的转换器,相对于DataX行级转换器是一个很大的进步;
  • 服务化能力:提供系统RestApi、客户端代理等多种模式接入服务;
  • 支持场景:离线/实时同步,整库同步等;
  • 依赖较少:zeta standalone模式可以不依赖第三方组件实现分布式数据同步;

扩展性

  • 连接器:可插拔设计,能够轻松地支持更多的数据源,并且可以根据需要扩展模式;
  • 多引擎:同时支持Zeta、Flink、Spark三种引擎,并提供统一的翻译层进行对接扩展;众安目前的基础架构主要是基于MaxCompute,我们没有Hadoop这类的大数据集群,因此Zeta的分布式能力可以很好的解决该问题。同时若未来进行大数据基座迁移(迁移其他云EMR或自建集群),可以实现作业的无缝衔接。
  • Zeta多资源管理器:目前仅支持Standalone,未来社区会支持yarn/k8s模式;

高效稳定

  • 更快速:在相同资源配置下,相比于DataX能够提供15%~30%的性能提升;
  • 资源节省:我们尝试通过优化配置极限压榨内存资源,结果发现在保持同步速度不变的情况下,相比DataX,SeaTunnel可以节省30%到40%以上的内存。这意味着一旦SeaTunnel支持在Kubernetes上运行,对内存的总体消耗将大大减少。SeaTunnel利用共享线程技术减少了上下文切换的开销,从而进一步提高了数据同步的速度。
  • 容错恢复:作业级别实现了pipeline级别的checkpoint,集群级别实现了Hazecast内存网络IMAP的异常恢复。基于内部oss存储场景,我们扩展了相关插件。

社区活跃度

Apache SeaTunnel的社区活跃度非常高,作为一个由国内开发者主导的社区,我们与社区的其他成员,包括高老师和海林老师等,有着非常顺畅的交流和合作,他们提供的及时指导和问题分析对我们帮助巨大。社区还定期举办周会,为大家提供了一个讨论设计模式、分享问题解决方案的平台。

统一数据集成服务

当前设计

file

我们打造了一个统一的数据服务平台,这一平台将数据源管理和数据集成的配置过程简化,支持数据开发流程从开发到测试再到发布的全过程。我们通过在IDE中管理数据源和集成配置,然后通过调度系统在夜间分配作业到执行节点,进一步提高了数据处理的自动化和效率。

这种方式虽然有效,但我们意识到在服务化方面还有提升空间,特别是考虑到在高负载情况下CPU资源的高消耗和对监控和作业管理的需求。

服务化设计

为了解决这些挑战,我们决定将部分功能从调度系统中独立出来,使得调度更加纯粹和高效。我们的目标是将数据集成服务转变为SaaS模式,以便更好地集成进我们内部的各种系统中,并快速接入集成服务能力(例如如CDP系统和自助报表平台)。

该服务类似于Apache SeaTunnel Web,能够配置作业、设置调度模式、查看执行记录以及管理数据源。为了提高灵活性和方便未来的集群升级,我们引入了名为“quota”的虚拟资源组概念,我们的设计包括两种集群:主执行集群和备用执行集群,用以支持作业的自动降级。

在理想情况下,主执行集群使用SeaTunnel,而在备用执行集群中使用Data X。这种设计模仿了如B站等公司内部采用的Data X和Apache SeaTunnel并行系统,目的是在单一系统内实现作业的无缝降级,例如当SeaTunnel作业失败时,系统会尝试在Data X集群上重新调度执行该作业。

为了管理这一复杂的流程,我们设计了核心服务和执行服务。核心服务负责作业的调度、降级、日志清理、回调服务以及配置和资源管理。执行服务则专注于作业的实际执行和监控,包括作业执行线程和协调线程。

在作业执行前,我们会根据作业配置和集群资源情况来决定作业在哪个集群上执行,并确保有足够资源来执行作业。

Datax作业迁移

我们还着重进行了Data X到SeaTunnel的迁移工作。

插件兼容性

这包括对比社区提供的连接器和我们内部使用的插件功能,确保它们之间的兼容性,并对最常用的数据回流场景进行了特别关注,即从MC到ClickHouse(CK)的数据回流任务。我们有大约3.4万个任务,其中约1.4万个任务专门用于将自助分析报表的底层元数据日常推送至CK,针对这些场景我们进行了特定的兼容性开发。

作业切换接口

为了支持作业的平滑迁移和开发,我们实现了一个作业开发切换接口。这允许我们基于作业号和连接器的适配情况,灵活地进行作业迁移。迁移完成后,新任务会被注册到集成服务中,并以公共配置格式保存,从而便于在管理服务端通过脚本模式或页面引导化配置进行操作。

配置抽象

我们制定了一套内部公共配置标准,旨在兼容Apache SeaTunnel和Data X作业的配置方式。这一做法不仅简化了多环境数据源的替换过程,还增强了安全性,避免了在配置中直接暴露敏感信息如用户名和密码。

我们在作业执行前进行作业配置翻译,这种设计参考了Seatunnel的翻译层设计,包括本地变量和数据源参数的替换,以及针对不同引擎的配置翻译。这种双层翻译机制,一层负责将特定中间件插件配置转换为公共配置(Pre transform),另一层则将公共配置转换为指定引擎配置(正常的transform),极大地增强了作业配置的灵活性和兼容性。 一个公共层的存在是必要的,因为它允许在不同数据集成工具之间进行灵活的翻译和配置转换,从而实现数据服务执行在多引擎间的执行降级;

Zeta 集群资源管控

问题:Zeta资源管理Slot目前仅是逻辑隔离,若采用动态slot模式,会创建大量线程进行资源争抢,一定程度会拖慢多并发作业的整体速度,或导致集群OOM。该模式比较适合于CDC实时同步多批次,少数据量分片的场景。

解决方案

  • 使用静态slot模式

对于离线批处理任务,该模式更为合适,其可以一定程度的控制资源消耗,防止因大量数据缓存导致的内存溢出(OM)问题。 根据集群的CPU/内存大小进行评估,适当的CPU超卖,并配置合适的资源槽数量,以确保数据处理作业的效率和集群资源的有效利用。

  • 新增集群slot服务RestApi

通过扩展SlotService和ResourceManager,在Hazelcast中扩展存储集群全slot和已分配slot情况 ,并完善集群启动、节点上下线、作业提交、作业释放时的slot资源情况处理,并提供RestApi查询。

  • 作业slot计算

早期,我们尝试根据物理执行计划来评估作业的并发度,但后来的版本变更要求我们基于作业配置来进行slot资源计算。 在并发度一致的情况下,作业资源占用计算公式如下:

file

该方法可以适用于大多数端到端数据同步场景,但在更复杂的作业配置中,这种方法可能不够灵活。我们也期待社区内部实现一个类似SQL explain的API进行资源计算。

  • 作业控制

作业提交前根据配置计算消耗的slot资源; 作业提交前会校验集群slot资源总数和可用资源是否可以满足作业资源消耗,若可以则通过RestApi提交;

file

Zeta RestAPI 对接问题

问题

集群http服务地址挂载阿里云slb之后,发现集群大量连接被远程关闭的错误。 原因:slb开启健康检查后,发起探测会发送syn包,后端响应syn+ack,然后会重置连接。 解决方案:在尝试hazelcast组网模式和slb配置均未有效的情况下,我们再服务端通过集群配置信息,在http请求前进行了一次随机路由处理;

file

问题

非Master节点无法处理作业提交、终止、集群slot获取等操作 原因:2.3.3版本通过HazelcastInstance在非master节点上无法获取Master服务的相关实例;

file

Hazelcast.getAllHazelcastInstances() 并没有多个,是还需要有额外的代码来修改么,无法跨节点提交作业。

file

解决方案:一个通用的想法是模拟SlotService,将统计信息带给Master,通过hazelCast的Operation机制,参考HeartbeadHealthOperation机制,通过存量的GetMetricsOperation去Master节点进行获取。

file

后期我们把该思路提供给了社区,社区相关同学也完善了作业提交、终止等接口的修改。

Connector 支持pre/post sql

在Apache SeaTunnel的实践中,特别是在处理ClickHouse (CK) 报表数据时,连接器的Pre和Post SQL功能展现了其对复杂数据处理场景的高度适应性。这些功能允许在数据同步任务执行前后,执行特定的SQL语句,为数据处理提供了更大的灵活性和精确控制。

使用场景

主要应用场景包括数据同步前的准备工作和同步后的清理或重组工作。例如,在推送数据到CK报表前,而不是直接覆盖或删除当前表,数据可能首先写入一个临时表中。完成数据写入后,可以通过执行Post SQL语句对local表进行重命名操作,并将其挂载到分区表中,这种方法有效避免了数据同步过程中的数据丢失或不一致问题。

PreSql实践

问题:前期版本不支持,仅能通过XxxSink中prepare方法实现,但该接口后续会被取消;

解决方案:Apache SeaTunnel社区版本2.3.4提出了schema save mode和data save mode的组合作为一种解决方案,支持在数据同步前执行SQL语句(Pre SQL)。这种方法的引入大大增强了Apache SeaTunnel在数据同步场景中的灵活性和可用性。我们通过data save mode中的CUSTOM_PROCESSING模式实现preSql执行,并扩展至可支持执行多段SQL;

PostSql实践

问题:在XxxSink或XxxSinkWriter中close方法实现,会出现多并发冲突问题;

解决方案:对于Post SQL的支持,尤其在多线程环境中保证数据完整性和一致性的挑战更为复杂。通过在二阶段提交的close方法中执行Post SQL语句,提供了一种可行的解决方案。这种方法初步实现了在数据同步任务完成后进行必要的后处理操作的能力。

我们也遇到的一个挑战是处理Post SQL执行失败的情况。这个问题在1月4日的发版前测试中被发现,测试团队仔细检查了当Post SQL执行失败时的系统行为。

发现执行失败后,Subplan的重试机制(reApache SeaTunnelore处理)导致作业状态管理存在问题,作业无法正常终止。作为临时解决方案,将Subplan的pipeline最大重试次数(Max reApache SeaTunnelore number)设置为0(默认值为3),这意味着在离线批处理场景下,一旦出现错误,系统将直接报错并终止作业。

这个措施虽然可以暂时解决问题,但需要进一步与社区合作探讨更根本的解决方案。

同时我们也期待社区会有更好的做法来实现PostSql,因为二阶段提交close方法执行SQL意味着作业checkpoint已经刷新完毕,这时出现异常,可能对现有机制产生一定影响。

Connector 列隐式转换

问题

在数据同步和集成过程中,数据源与目标存储之间的数据类型匹配和转换是一个常见的问题。Apache SeaTunnel中的连接器和框架层级可能没有进行充分的列隐式转换处理,导致无法有效地将数据写入到目标数据源的对应字段中。我们在连接器适配DataX特性改造时,发现在连接器和框架层面均未进行列隐式转换。

例如SeatunnelRowType对应的第一列是String类型,数据为2023-12-01 11:12:13,其无法写入字段为Datetime类型的Maxcompute字段当中。

解决方案

连接器级别实现了一个简单的RowConverter, 将结合SeatunnelRowType中的字段类型、对应的Maxcompute字段类型进行映射转换。后期考虑接入社区常用类型默认转换特性。

pull request地址:https://github.com/apache/seatunnel/pull/5872

file

Connector 部分列同步

问题

我们在连接器适配DataX特性改造时,DataX支持部分列回流及部分列写入;Seatunnel连接器目前在source端部分连接器有实现,sink端基本是全字段写入;

解决方案

Source端:我们可以将自定义列(而非全表列)设置在CatalogTable当中,同理DataX当中类似分区列、常量列的回流也可以通过相同的方式得以实现,并透传到执行计划当中,为Sink端所获取;jdbc连接器可以通过query sql选择合适的列;

Sink端:目前可以根据SeaTunnelRow的index位置和自定义列中的index进行对齐,实现部分写入;jdbc连接器可以通过insert指定列进行处理。

file

随着Apache SeaTunnel的成功实施,众安保险在数据集成领域迈出了坚实的步伐。我们期待在不断变化的技术环境中继续优化我们的数据流程,以支持业务的快速发展和创新需求。

众安保险的这一实践案例,证明了开源技术在企业级应用中的潜力和价值,展示了开放合作精神对于推动行业发展的重要性,也希望能够给大家带来一些启发!

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

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

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

相关文章

【Java程序设计】【C00291】基于Springboot的网上图书商城(有论文)

基于Springboot的网上图书商城(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的网上图书商城 本系统分为系统功能模块、管理员功能模块以及卖家功能模块。 系统功能模块:在系统首页可以查看首页、图书…

社区志愿者齐心协力,为社区居民营造温馨和谐环境

近日,在我们的社区里,一场温暖而有力的力量正在悄然兴起。一群热心居民自发组织成为社区志愿者团队,积极投身于服务社区的各项活动中,为居民们营造了一个温馨和谐的生活环境。 在每个周末的清晨,志愿者们早早地聚集在社…

匿名+有名管道

管道 相关概念 4种情况 正常情况,如果管道没有数据,读端陷入等待,直到有数据才能唤醒正常情况,如果管道被写满,写端陷入等待,直到有空间才能唤醒写段关闭,读端一直读取,read返回0…

Linux Android USB gadget(从设备驱动)

Linux Android USB gadget 一:Linux usb gadget 与 Android Composite Gadget二:原生方式和Android方式如何配置函数调用逻辑内核配置原生驱动android驱动三:mass_storage配置虚拟化U盘四:遍历usb设备五:adb usb判断usb设备为adb获取adb配置信息adb设备序列号发送与接收《Linux…

一键生成PDF即刻呈现:轻松创建无忧体验

在信息爆炸的时代,我们每天都在与各种文件、资料打交道。无论是工作中的报告、合同,还是学习中的笔记、论文,如何高效、安全地管理这些珍贵的资料,成为了我们迫切的需求。幸运的是,随着科技的发展,我们不再…

在Linux系统上实现高效安装与部署环境的全方位指南

前言 在数字化时代,Linux操作系统以其高度的灵活性、安全性和稳定性,成为了众多开发者和系统管理员的首选。然而,要想充分发挥Linux系统的优势,一个高效、稳定、易于管理的安装与部署环境至关重要。本文旨在为广大Linux爱好者、初…

XSS原理和攻防

Cross Site Scripting:跨站脚本攻击 用户提交的数据中可以构造恶意代码,并且执行,从而实现窃取用户信息等攻击 攻击: 防御: 1.对输入进行过滤,对输出进行编码 2.cookie设置http-only

计算机网络面经_体系结构一文说清

编辑:平平无奇的羊 目录 基础 1. 计算机网络结构体系 三种模型之间的区别: 如何背诵: 进阶 OSI七层模型: TCP/IP四层模型: TCP/IP五层模型 总结 字节实习生为大家带来的是计算机网络面经系列博文,由浅…

【Flink集群RPC通讯机制(二)】创建AkkaRpcService、启动RPC服务、实现相互通信

文章目录 零. RpcService服务概述1. AkkaRpcService的创建和初始化2.通过AkkaRpcService初始化RpcServer3. ResourceManager中RPC服务的启动4. 实现相互通讯能力 零. RpcService服务概述 RpcService负责创建和启动Flink集群环境中RpcEndpoint组件的RpcServer,且Rpc…

SQL-Labs靶场“46-50”关通关教程

君衍. 一、四十六关 ORDER BY数字型注入1、源码分析2、rand()盲注3、if语句盲注4、时间盲注5、报错注入6、Limit注入 二、四十七关 ORDER BY单引号报错注入1、源码分析2、报错注入3、时间盲注 三、四十八关 ODRER BY数字型盲注1、源码分析2、rand()盲注3、if语句盲注4、时间盲注…

2.openEuler概述及安装指南(二)

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议下载麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 1.安装过程及配置 使用光盘引导安装: 此处以光盘安装为例介绍安装…

c语言的数据结构:找环状链表入口处

一起<(&#xffe3;︶&#xffe3;)↗[GO!] 1.如何判断一个链表是否有环 思路:设定两个快慢指针fast和slow,fast每次走两个结点,slow每次走一个节点 如果fast指针遇到了Null,那么这个链表没有环,如果fast和slow可以相遇,则代表这个链表有环 代码如下 N:fast先进环,slow后…

【Azure 架构师学习笔记】- Azure Databricks (8) --UC架构简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (7) --Unity Catalog(UC) 基本概念和组件 前言 UC 简单来说&#xff0c;就是管理两样东西&#xff1a;用户和元存储。 用户管理 所有Databri…

从新手到高手:用NumPy学习网站打造你的数据处理超能力!

介绍&#xff1a;NumPy是一个用于数值计算的Python库&#xff0c;特别擅长处理多维数组和矩阵。以下是对NumPy的详细介绍&#xff1a; 起源和发展&#xff1a;NumPy由Travis Oliphant在2005年创建&#xff0c;它是基于原来的Numeric模块和Numarray模块发展而来的。它的大部分代…

上网行为监控软件能够看到聊天内容吗

随着信息技术的不断发展&#xff0c;上网行为监控软件在企业网络安全管理中扮演着越来越重要的角色。 这类软件主要用于监控员工的上网行为&#xff0c;以确保工作效率和网络安全。 而在这其中&#xff0c;域智盾软件作为一款知名的上网行为监控软件&#xff0c;其功能和使用…

靡语IT:JavaScript数组

目录 1.数组&#xff1a;Array 2.Array.length 3.数组的声明(创建)方法 4.数组去重 5.数组遍历 6.类数组对象 1.数组&#xff1a;Array 数组对象的作用是&#xff1a;使用单独的变量名来存储一系列的值。 参数 参数 size 是期望的数组元素个数。返回的数组&#xff0…

SpringBoot3+Vue3 基础知识(持续更新中~)

bean 把方法的返回结果注入到ioc中 1: 2: 3: 组合注解封装 实战篇&#xff1a; 解析token&#xff1a; 统一携带token&#xff1a; 驼峰命名与下划线命名转换&#xff1a; NotEmpty!!! mybatis&#xff1a; PageHelper设置后&#xff0c;会将pageNum,和pageSize自己拼接…

动态绑定样式,uniapp,用三元运算动态绑定多个class类样式,动态绑定的样式可以和原始样式共存

介绍 | uni-app官网 vue、uniapp中动态添加绑定style、class 9种方法实现_vue style动态绑定-CSDN博客 uniapp使用三元运算符动态绑定元素的style样式_uniapp style动态绑定-CSDN博客 对象写法,可以写多个class类 class类的名字&#xff1a;判断条件&#xff0c;最后结果只有…

【k8s资源调度-StatefulSet】

1、部署对象StatefulSet资源&#xff08;无状态应用&#xff09; StatefulSet针对的是有状态应用&#xff0c;有状态应用会对我们的当前pod的网络、文件系统等有关联。 2、配置文件如下 StatefulSet资源的配置文件粗略如下&#xff0c;如下的配置信息包含了数据卷&#xff0c;…

MobaXterm连接VirtualBox虚拟机

目录 1.下载MobaXterm 2.获取连接配置 3.mobaXterm连接虚拟机 4.更好的方案 1.下载MobaXterm 据说MobaXtrem是远程终端的超级全能神器,官网下载地址&#xff1a;MobaXterm free Xserver and tabbed SSH client for Windows 选择适合你的版本&#xff1a;一个是Home Editi…