ITPub博客

首页 > 大数据 > 数据分析 > DataPipeline CTO陈肃:构建批流一体数据融合平台的一致性语义保证

DataPipeline CTO陈肃:构建批流一体数据融合平台的一致性语义保证

原创 数据分析 作者:DataPipeline 时间:2020-02-13 10:15:43 0 删除 编辑


文 | 陈肃 DataPipelineCTO


首先,本文将从数据融合角度,谈一下DataPipeline对批流一体架构的看法,以及如何设计和使用一个基础框架。 其次,数据的一致性是进行数据融合时最基础的问题。 如果数据无法实现一致,即使同步再快,支持的功能再丰富,都没有意义。


另外,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架构是批流一体化的必然要求?这好像看起来是矛盾的(与之相对,还有一种架构叫Kappa架构,即用一个流式处理引擎解决所有问题)。


实际上,这在很大程度来自于现实中用户的需求。DataPipeline在刚刚成立时只有一种模式,只支持实时流同步,在我们看来这是未来的一种趋势。

但后来发现,很多客户实际上有批量同步的需求。比如,银行在每天晚上可能会有一些月结、日结,证券公司也有类似的结算服务。基于一些历史原因,或出于对性能、数据库配置的考虑,可能有的数据库本身不能开change log。所以实际上并不是所有情况下都能从源端获取实时的流数据。


考虑到上述问题,我们认为一个产品在支撑数据融合过程中,必须能同时支撑批量和流式两种处理模式,且在产品里面出于性能和稳定性考虑提供不同的处理策略,这才是一个相对来说比较合理的基础架构。


数据融合的Ad-Hoc模式


具体到做这件事,还可以有两种基础的应用模式。假如我需要将数据从MySQL同步到 Hive,可以直接建立一个ETL的JOB(例如基于Flink),其中封装所有的处理逻辑,包括从源端读取数据,然后进行变换写入目的地。在将代码编译好以后,就可以放到Flink集群上运行,得到想要的结果。这个集群环境可以提供所需要的基础能力,刚才提到的包括分布式,容错等。


 
 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31556703/viewspace-2675376/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-09-29

  • 博文量
    54
  • 访问量
    28353