首页 体育世界正文

白菜炖豆腐,怎么构建批流一体数据交融渠道的一致性语义确保?,无限道武者路

本文根盐组词据陈肃老白菜炖豆腐,怎样构建批流一体数据融合途径的共同性语义确保?,无限道武者路师在 Apache Kafka x Flink Meetup 深圳站的共享收拾而成,文章首要将从数据融合视点,谈一下 DataPipel白菜炖豆腐,怎样构建批流一体数据融合途径的共同性语义确保?,无限道武者路ine 对批流一体架构的观点,以及怎样规划和运用一个根底结构。其次,数据的共同性是进行数据融合时最根底的问题。假设数据无法完结共同,即便同步再快,支撑的功用再丰厚,都没有意义。

别的,DataPipeline 现在运用的根底结构为 Kafka Connect。为完结共同性的语义确保,咱们做了一些额定作业,期望对咱们有必定的参阅意义。

终究,会提一些咱们在运用 Kafka Connect 结构时,遇到的一些实践的工程问题,以及应对办法。虽然咱们的场景、环境和数据量级不同,但也有或许会遇到这些问题。期望对咱们的作业有所协助。

一、批流一体架构

批和流是数据融合的两种运用形状

徐允厚
白菜炖豆腐,怎样构建批流一体数据融合途径的共同性语义确保?,无限道武者路

下图来自 Flink 官网。传统的数据融合一般依据批形式。在批的形式下,咱们会经过一些周期性运转的 ETL JOB,将数据从联系型数据库、文件存储向下流的方针数据库进行同步,中心或许有各种类型的转化。

另一种是 Data Pipeline 形式。与批形式比较比较, 其最中心的区别是将批量变为实时:输入的数据不再是周期性的去获取,而是连绵不断的来自于数据库的日志、音讯行列的音讯。从而经过一个实时核算引擎,进行各种聚合运算,发作输出成果,而且写入下流。

现代的一些处理结构,包含 Flink、Kafka Streams、Spark,或多或少都可以支撑批和流两种概念。只不过像 Kafka,其原生便是为流而生,所以假设依据 Kafka Connect 做批流一体,你或许需求对批量的数据处理做一些额定作业,这是我今日要点要介绍的。

数据融合的根本问题

假设问题简化到你只要一张表,或许是一张 MySQL 的表,里边只要几百万行数据,你或许想将其同步到一张 Hive 表中。依据这种状况,大部分问题都不会遇到。由于结构是确认的,数据量很小,且没有所谓的并行化问题。

但在一个实践的企业场景下,假设做一个数据融合体系,就不可防止要面对几方面的应战:

榜首,“动态性”

数据源会不断地发作改变,首要归因于:表结构的改变,表的增减。针对这些状况,你需求有一些相应的战略进行处理。

第二,“可伸缩性”

任何一个分布式体系,必需求供给可伸缩性。由于你不是只同步一张表,一般会有许大都据同步使命在进行着。怎样在一个集群或多个集群中进行共同的调度,确保使命并行履行的功率,这是一个要处理的根本问题。

第三,“容错性”

在任何环境里你都不能假定服务器是永久在正常运转的,网络、磁盘、内存都有或许发作毛病。这种状况下一个 Job 或许会失利,之后怎样进行康复?状况能否连续?是否会发作数据的丢掉和重复?这都是要考虑的问题。

第四,“异构性”

当咱们做一个数据融合项目时,由于源和意图地是不一样的,比白菜炖豆腐,怎样构建批流一体数据融合途径的共同性语义确保?,无限道武者路如,源是 MySQL,意图地是 Oracle,或许它们关于一个字段类型界说的标准是有不同的。在同步时,假设疏忽这些差异,就会形成一系列的问题。

第五,“共同性”

共同性是数据融合中最根本的问题,即便不考虑数据同步的速度,也要确保数据共同。数据共同性的底线为:数据先不丢,假设丢了一部分,一般会导致业务无法运用;在此根底上更好的状况是:源和意图地的数据要彻底共同,即所谓的端到端共同性,怎样做到呢?

Lambda 架构是批流一体化的必定要求

现在在做这样的途径时,业界比较公认的有两种架构:一种是 Lambda 架构,Lambda 架构的中心是按需运用批量和流式的处理结构,别离针对批式和流式数据供给相应的处理逻辑。终究经过一个服务层进行对外服务的输出。

为什么咱们以为 Lambda 架构是批流一体化的必定要求?这如同看起来是对立的(与之相对,还有煮av一种架构叫 Kappa 架构,即用一个流式处理引擎处理一切问题)。

实践上,这在很大程度来自于白菜炖豆腐,怎样构建批流一体数据融合途径的共同性语义确保?,无限道武者路实践中用户的需求。DataPipeline 在刚刚成立时只要一种形式,只支撑实时流同步,在咱们看来这是未来的一种趋势。

但后来发现,许多客户实践上有批量同步的需求。比方,银行在每天晚上或许会有一些月结、日结,证券公司也有相似的结算服务。依据一些前史原因,或出于对功用、数据库装备的考虑,或许有的数据库自身不能开 change log。所以实践上并不是一切状况下都能从源端获取实时的流数据。

考虑到上述问题,咱们以为一个产品在支撑数据融合进程中,有必要能一起支撑批量和流式两种处理形式,且在产品里边出于功用和稳定性考虑供给不同的处理战略,这才是一个相对来说比较合理的根底架构。

数据融合的 Ad-Hoc 形式

详细到做这件事,还可以有两种根底的运用形式。假设我需求将数据从 M李敖暴瘦插鼻胃管ySQL 同步到 Hive,可以直接树立一个 ETL 的 JOB(例如依据 Flink),其间封装一切的处理逻辑,包含从源端读取数据,然后进行改换写入意图地。在将代码编译好今后,就可以放到 Flink 集群上运转,得到想要的成果。这个集群环境可以供给所需求的根底才干,方才说到的包含分布式,容错等。

数据融合的 MQ 形式

另一种形式是 ETL JOB 自身输入输出实践上都是面对音讯行列的,实践上这是现在最常运用的一种形式。在这种形式下,需求经过一些独立的数据源和意图地连接器,来完结数据到音讯行列的输入和输出。ETL JOB 可以用多种结构完结,包含 Flink、Kafka Streams 等,ETL JOB 只和音讯行列发作数据交换。

DP 挑选 MQ 形式的理由

DataPipeline 挑选 MQ 形式,首要有几点考虑:

榜首,在咱们产品运用中有一个十分常见的场景:要做数据的一对多分发。数据要进行一次读取,然后分发到各种不同的意图地,这是一个十分合适音讯行列运用的分发模型。

第二,有时会对一次读取的数据加不同的处理逻辑,咱们期望这种处理不要从头对源端发作一次读取。所以在大都状况下,都需将数据先读到音讯行列,然后再装备相应的处理逻辑。

第三,Kafka Connect 便是依据 MQ 形式的,它有许多的开源连接器。依据 Kafka Connect 结构,咱们可以重用这些连接器,节约研制的投入。

第四,当你把数据抽取跟写入意图地,从处理逻辑中独立出来之后,便可以供给更强壮的集成才干。由于你可以在音讯行列上集成更多的处理逻辑,而无需考虑从头写整个 Job。

相应而言,假设你挑选将 MQ 作为一切 JOB 的传输通道,就必需求战胜几个缺陷:

榜首,一切数最管用的收惊办法据的吞吐都经过 MQ,所以 MQ 会成为一个吞家法打屁股吐瓶颈。

第二,由于是一个彻底的流式架构,所以针对批量同步,你需求引进一些鸿沟音讯来完结一些批量操控。

第三,Kafka 是一个有耐久化才干的音讯行列,这意味着数据留存是有极限的。比方,你将源端的读到 Kafka Topic 里边,Topic 不会无限的大,有或许会形成数据容量超限,导致一些数据丢掉。

第四,当批量同步在中心由于某种原因被打断,无法做续传时,你需求进行重传。在重传进程中,首要要将数据进行整理,假设依据音讯行列形式,整理进程就会带来额定的作业。你会面对两个窘境:要么清空原有的音讯行列,要么你发明新的音讯行列。这必定不如像直接运用一些批量同步结构那样来的直接。

二、共同性语义确保

用户需求

先简略介绍一下用户关于数据同步方面的一些根本要求:

榜首种需求,批量同步需求以一种业务性的办法完结同步

不管是同步一整块的前史数据,仍是同步某一天的增量,该部分数据到意图地,有必要是以业务性的办法呈现的。而不是在同步一半时,数据就现已在意图地呈现了,这或许会影响下流的一些核算逻辑。

第二种需求,流式数据尽或许快的完结同步

咱们都期望越快越好,但相应的,同步的越快,吞吐量有或许由于你的参数设置呈现相应的下降,这或许需求有一个权衡。

第三种需求,批量和流式或许共存于一个 JOB

作为一个数据融合产品,当用户在运用DataPipeline时,一般需求将存量数据同步完,后边紧接着去接增量。然后存量与增量之间需求进行一个无缝切换,中心的数据不要丢、也不要多。

第四种需求,按需灵敏挑选共同性语义确保

DataPipeline 作为一个产品,在客户的类组词环境中,咱们无法对客户数据自身的特性提出强制要求。咱们不能要求客户数据必定要有主键或许有唯一性的索引。所以在不同场景下,关于共同性语义确保,用户的要求也不一样的:

比方在有主键的场景下,一般咱们做到至少有一次就够了,由于在下流假设对方也是一个相似于联系型数据库这样的意图地,其自身就有去重才干,不需求在进程中心做一个强共同的确保。可是,假设其自身没有主键,或许其下流是一个文件体系,假设不在进程中心做额定的共同性确保,就有或许在意图地发作剩余的数据,这部分数据关于下流或许会形成十分严峻的影响。

数据共同性的链路视角

假设要处理端到端的数据共同性,咱们要处理好几个根本环节:

榜首,在源端做一个共同性抽取

共同性抽取是什么意义?即当数据从经过数据连接器写入到 MQ 时,和与其对应的 offset 有必要是以业务办法进入 MQ 的。

第二,共同性处理

假设咱们用过 Flink,Flink 供给了一个端到端共同性处理的才干,它是内部经过 checkpoint 机制,并结合 Sink 端的二阶段提交协议,完结从数据读取处理到写入的一个端到端业务共同性。其它结构,例如 Spark Streami史国良害了毕福剑ng 和 Kafka Streams 也有各自的机制来完结共同性处理。

第三,共同性写入

在 MQ 形式下,共同性写入,即 consumer offset 跟实践的数据写入意图时,有必要是一起耐久化的,要么全都成功,要么悉数失利。

第四,共同性联接

在 DataPipeline 的产品运用中,前史数据与实时数据的传输有时需求在一个使命中共同完结。所以产品自身需求有这种共同性联接的才干,即梦醒天龙八部前史数据和流式数据,有必要可以在一个使命中,由程序主动完结它们之间的切换。

Kafka Connect 的共同性确保

Kafka Connect 怎样确保数据同步的共同性?就现在版别,Kafka Connect 只能支撑端到端的 at least once,中心原因在于,在 Kafka Connect 里边,其 offset 的耐久化与数据发送自身是异步完结的。这在很大程度上是为了进步其吞吐量考虑,但相应发作的问题是,假设运用 Kafka Connect,结构自身只能为你供给 at least once 的语义确保。

在该形式下,假设没有经过主键或下流运用进行额定地去重,同步进程傍边的数据会在极点状况下呈现重复,比方源端发送出一批数据现已成功,但 offset 耐久化失利了,这样在使命康复之后,之前现已发送成功的数据会再次从头发送一批,而下流对这种现象彻底是不知情的。意图端也是如此,由于 consumer 的 offset 也是异步大棚歌舞团耐久化,就会到导致有或许数据现已耐久化到 Sink,但实践上 consumer offset 还没有推动。这是咱们在运用原生的 Kafka Connect 结构里遇到最大的两个问题。

三、DP 的处理之道

二阶段提交协议

DataPipeline 怎样处理上述问题?首要,需求用协议的办法确保每一步都做成业务。一旦做成业务,由于每个环邪丐凌仙节都是解耦的,其终究数据就可以确保共同性。下图为二阶段提交协议的最根底版别,接下来为咱们简略介绍一下。

首要,在二阶段提交协议中,关于分布式业务的参加方,在 DataPipeline 的场景下为数据写八神遥入与 offset 写入,这是两个独立组件。两者之间的写入操作由 Coordinator 进行和谐。榜首步是一个 prepare 阶段,每一个参加方会将数据写入到自己的意图地,详细耐久化的方位取决于详细运用的完结。

第二步,当 prepare 阶段完结之后,Coordinator 会向一切参加者宣布 commit 指令,一切参加者在完结 commit 之后,会宣布一个 ack,Coordinator 收到 ack 之后,业务就完结了。假设呈现失利,再进行相应的回滚操作。其实在分布式数据库的规划范畴中,单纯运用一个二阶段提交协议会呈现十分多的问题,例如 Coordinator 自身假设不是高可用的,在进程傍边就有或许呈现业务不共同的问题。

所武极风岚舞以运用二阶段提交协议,最中心的问题是怎样确保 Coordinator 高可用。所幸在咱们耳熟能详的各种结构里,包含 Kafka 和 Flink,都可以经过分布式共同协议完结 Coordinator 高可用,这也是为什么咱们可以运用二阶段提交来确保业务性。

Kafka 业务音讯原理

关于 Kafka 业务音讯原理,网上有许多材料,在此简略说一下可以到达的作用。Kafka 经过二阶段提交协议,终究完结了两个最中心的功用。

榜首,共同性抽取

上文说到数据要被发送进 Kafka,一起 offset 要被耐久化到 Kafka,这是对两个不同 Topic 的写入。经过运用 Kafka 业务性音讯,咱们可以确保 offset 的写入和数据的发送是一个业务。假设 offset 没有耐久化成功,下流是看不到这批数据的,这批数据实践上终究会被丢掉掉。

所以关于源端的发送,咱们对 Kafka Connect 的 Source Worker 做了一些改造,让其可以供给两种形式,假设用户的数据自身是具有主键去重才干的,就可以持续运用 Kafka Connect 原生的形式。

假设用户需求强共一起,首要要敞开一个源端的业务发送功用,这就完结了源端的共同性抽取。其可以确保数据进 Kafka 一端不会呈现数据重复。这里有一个约束,即一旦要敞开共同性抽取,依据 Kafka 必需求将 ack 设置成 all,这意味着一批数据有多少个副本,其有必要可以在一切的副本地点的 broker 都现已应对的状况下,才干够开端下一批数据的写入。虽然会形成一些功用上的丢掉,但为了完结强共同,你必需求承受这一现实。

第二,共同性处理

业务性音讯最早便是为 Kafka Streams 规划和预备的。可以写一段 Kafka Streams 运用,从 Kafka 里读取数据,然后完结转化逻辑,从而将成果再输出回 Kafka。Sink 端再从 Kafka 中消费数据,写入意图地。

数据共同性写入

之前扼要谈了一下二阶段提交协议的原理,DataPipeline 完结的办法不算很艰深,根本是业界的一种共同办法。其间最中心的点是,咱们将 consumer offset 办理从 Kafka Connect 结构中独立出来,完结业务共同性提交。别的,在 Sink 端封装了一个相似于 Flink 的 TwoPhaseCommitSinkFunction 办法,其界说了 Sink 若要完结一个二阶段提交所必需求完结的一些功用。

DataPipeline 将 Sink Connector 分为两类,一类是 Connector 自身具有了业务才干,比方绝大部分的联系型数据库,只需将 offset 跟数据一起耐久化到意图地即跳蛋play可。额定的或许需求有一张 offset 表来记载提交的 offset。还有一类 Sink 不具有业务功才干,相似像 FTP、OSS 这些目标存储,咱们需求去完结一个二阶段提交协议,终究才干确保 Sink 端的数据可以到达共同性写入。

数据共同性联接

关于批量数据与实时数据怎样联接的问题,首要有两个要害点:

梦小楠

榜首,当开端进行一个批量数据同步时,以联系型数据库为例,你应该拿到其时一个全体数据的 Snapshot,并在一个业务中一起记载其时对应的日志开端值。以 MySQL 为例,当要获取一个 Binlog 开端偏移量时,需求敞开一个 START TRANSACTION WITH CONSISTENT SNAPSHOT,这样才干确保完结全量之后,后期的读取增量日志同步不会产白菜炖豆腐,怎样构建批流一体数据融合途径的共同性语义确保?,无限道武者路生重复数据。

第二,假设选用增量同步形式,则有必要依据实践的数据业务范畴,选用一种比较灵敏的增量表达式,才干避闽剧甘国宝免读到写到一半的数据。比方在你的数据中,其白菜炖豆腐,怎样构建批流一体数据融合途径的共同性语义确保?,无限道武者路 ID 是一个彻底自增,没有任何重复的或许,此刻只需每次单纯的大于上一次同步的终究一条记载即可。

但假设是一个时刻戳,不管精度多高,都有或许在数据库发作相同的时刻戳,所以安全的做法是每次迭代时,取比当时时刻略微少一点,确保留出一个安全时刻,比方五秒身份证号大全游戏注册乃至一分钟,这样你永久不会读到一些时刻戳或许会发作抵触的这部分数据,防止遗失数据。这是一个小技巧,但假设没有留意,在运用进程中保止法就会发作各式各样的问题。

还有一点是上面提及的,怎样可以在一个流式结构完结批量同步的共同性,关于一切的流式结构,需求引进一些鸿沟条件来标志着一次批量同步的开端和完毕。DataPipeline 在每次批量发送开端和完毕后,会引进一些操控量信号,然后在 Sink端进行相应处理。相同为了确保业务共同性,在 Sink 端处理这种批量同步时,仍然要做一些相似于二阶段提交这样的办法,防止在一些极点状况下呈现数据不共同的问题。

四、问题和考虑

上文介绍的是 DataPipeline 怎样依据 Kafka Connect 做业务同步共同性的计划。

DataPipeline 在运用 Kafka Connect 进程中遇到过一些问题,现在大部分现已有一些处理计划,还有少数问题,或许需求未来选用新的办法/结构才干够更好的处理。

榜首,反压的问题

Kafka Connect 规划的逻辑是期望完结源端和意图端彻底解耦,这种解偶自身是一个很好的特性。但也带来一些问题,源和意图地的 task 彻底不知道互相的存在。方才我说到 Kafka 有容量约束,不能假定在一个客户环境里边,会给你无限的磁盘来做缓冲。一般咱们在客户那儿默许 Topic 为 100G 的容量。假设源端读的过快,许大都据会在 Kafka 里堆积,意图端没有及时消费,就有或许呈现数据丢掉,这是一个十分简单呈现的问题。

怎样处理?DataPipeline 作为一个产品,在 Kafka Connect 之上,做了操控层,操控层中有像 Manager迷你忍者没声音 这样的逻辑组件,会监控每一个 Topic 消费的 lag,当到达必定阈值时,会对源端进行限速,确保源和意图地尽或许匹配。

第二,资源阻隔

Connect Worker 集群无法对 task 进行资源预留,多个 task 并行运转会相互影响。Worker 的 rest 接口是行列式的,单个集群使命过多会导致启停缓慢。

咱们正在考虑运用外部的资源调度结构,例如 K8s 进行 worker 节点办理;以及经过路由规矩将不同优先级使命运转在不同的 worker 集群上,完结预分配和共享资源池的灵敏装备。

第三,Rebalance

在 2.3 版别曾经,Kafka Connect 的 task rebalance 选用 stop-the-world 形式,牵一发起全身。在 2.3 版别之后,现已做了十分大优化,改为了具有粘性的 rebalance。所以假设运用 Kafka Connect,强烈推荐必定要升级到 2.3 以上的版别,也便是现在的最新版别。

五、未来演进道路

依据 MQ 形式的架构,针对大批量数据的同步,实践上仍是简单呈现功用瓶颈。首要瓶颈是在 MQ 的集群,咱们并不能在客户环境里无限优化 Kafka 集群的功用,由于客户供给的硬件资源有限。所以一旦客户给定了硬件资源,Kafka 吞吐的上限就变为一个固定值。所以针对批量数据的同步,或许未来会考虑用内存行列代替 MQ。

一起,会选用愈加灵敏的 Runtime,首要是为了处理方才说到的预分配资源池和共享资源池的共同办理问题。

别的,关于数据质量办理,实践上金融类客户对数据质量的共同性要求十分高。所以关于一些对数据质量要求十分高的客户,咱们考虑供给一些后校验功用,尤其是针对批量同步。

-----------------------------------

本文作者:陈肃

原文链接:https://yq.aliyun.com/articles/719759?utm_content=g_1000079637

本文为云栖社区原创内容,未经答应不得转载。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。