精华内容
下载资源
问答
  • 使用Flink和Pulsar进行批流一体弹性计算.pdf
  • 基于 Kyligence 的批流一体大数据分析架构探索 基于统一数据模型、生命周期管理、查询服务等批流一体分析中的关键诉求,以及对上述各种方案的探索,最后我们选取基于Lambda架构对Kyligence产品进行升级,打造出批流...

    当提到“实时分析”,大家脑海里首先浮现的是大屏上不断跳跃闪烁的数字和波动的曲线,让人有种纵观全局的掌控感。类似这样的场景多出现在资源监控或是领导驾驶舱大屏展示中,这些都属于“实时分析”中比较简单的应用场景,用于及时了解数据变化。

     

    对于企业来说,不仅要及时观察核心指标的变化,更重要的是了解其变化背后原因。通过对数据展开探索式的分析,获得对业务较为全面的洞察理解,从而为后续的运营决策、营销决策、风控决策等等提供信息支撑。在电商节的促销活动中,电商平台和商家们都密切关注着活动期间实时的交易数据流量。通过实时的分析这些活动流量数据,比如用户活跃率,转化率等关键指标信息,可帮助平台和商家们及时调整相关活动计划策略,从而提升整个活动的营销收入与效益。

    从上述业务场景中可以清晰的看到,业务查看数据报告不再是仅局限于实时的数据,而且还希望通过结合历史数据进行更加全面性的探索分析,甚至有些场景下需要两者数据进行相融合分析。想要实现这些时效性更高的业务需求,背后是非常复杂的一系列技术难题,这也就促使了人们开始了对批流一体分析的探索之路。

    批流一体架构面临的挑战

    传统架构

    数据仓库的架构随着业务分析实时化的需求也在不断演进,但在数据分析平台的最初起步阶段,为了满足实时分析需求,传统方案的做法一般都会将实时分析和历史批量数据分析拆分成2种不同的独立架构,形成如下图片所示的异构环境:

    在这样完全不同的独立异构环境下,不管是从部署架构层面,还是从数据存储介质层面都可以说是完全不一致的,这就使得在技术实现上面临比较大的挑战。

    • 分别维护实时分析与离线分析两套不同架构的服务,对于系统运行的稳定性,后续应用升级,故障处理等都会比较复杂和繁琐;
    • 分别设计、管理实时分析与离线分析两套不同的数据模型,离线分析可以通过关联获取更加丰富的数据,而实时分析为了保障数据时效性能只能是简单的宽表形式进行处理,而且开发流程较繁琐;
    • 因实时数据与离线数据存储介质的割裂,最终导致两者数据在存储时就相互隔离,更无法对两者进行统一的数据周期管理;
    • 在数据服务层中需要根据应用层进行定制化的开发,为不同的应用提供不同的数据服务,同时也使得这个查询服务层的维护成本增加不少。

    以上这些限制使开发和运维工作都变得的相当困难,不能灵活地应对业务敏捷多变的取数需求。

    Lambda 架构

    于是基于这种传统方案的进一步演化,在大数据生态下诞生的Lambda架构开始崭露头角。在Lambda架构中,数据处理分为 Speed Layer、Batch Layer 和 Serving Layer 三个部分。

    • Speed Layer 负责实时处理数据,计算逻辑直接对接流数据,尽量缩短数据处理的延迟,但由于流数据天生的数据质量不可控,尽管缩短了数据处理时间,但可能牺牲数据的正确性和完整性;
    • Batch Layer 负责批量规模性处理数据,可以保证数据的正确性和处理规模
    • Serving Layer 负责融合 Speed 和 Batch 两个部分的数据能力,对外提供简单一致的数据访问视图。

    但在实际应用的过程中,发现 Lambda 架构也存在着一些不足,虽然它使用的是同一架构环境,但是它也同样存在类似传统架构那样较复杂的维护工作。企业需要维护两个复杂的分布式系统,即Batch Layer和Speed Layer,并且保证他们逻辑上产生相同的结果输出到服务层中。

    Kappa 架构

    因此为了将Batch Layer和Speed Layer进行统一架构,业界由Kafka团队提出了新的Kappa架构,基于Streaming是新的DB(数据库)的设计思想,要将所有的数据消费都基于Kafka,形成统一的数据出口,后续数据处理都基于流式(Kafka)数据源。

    这个架构是随着Kafka上数据加工能力的提升而受到大家关注(特别是Flink框架加持,显著提升流数据处理能力)。Kappa试图解决多个计算引擎带来的开发、运维难题,只保留实时一套代码和数据。但在实践中,我们发现数据处理的复杂度不完全是一个单向的流式处理可以全部支持的,比如数据模型的演化,历史数据的修补更新,缓慢变化维的处理等等,都需要更灵活的数据建模能力。

     

     

    基于上述对传统方案、Lambda、Kappa 这些数据架构的讨论,以及企业应用的实际需求,我们认为在数据架构的灵活性、加工逻辑的便捷性、数据模型治理等角度还有更优解。接下来,我们将从批流一体架构这关键部分:数据模型、数据生命周期以及查询服务,进行探讨,为正在进行批流一体选型企业提供一些参考。

    基于 Kyligence 的批流一体大数据分析架构探索

    基于统一数据模型、生命周期管理、查询服务等批流一体分析中的关键诉求,以及对上述各种方案的探索,最后我们选取基于Lambda架构对Kyligence产品进行升级,打造出批流一体的企业级产品应用。

    数据模型

    我们知道数据的分析都离不开模型设计作为基础,模型是数据加工的目标和方法,是数据计算逻辑,也是数据分析的对象。这里我们把模型分为实时模型和历史模型,实时模型为追求数据处理的时效性设计,因此要避免计算逻辑复杂,历史模型为分析的完整性设计,因此需要更丰富的指标含义和数据治理能力。从业务分析的角度上出发,两者之间还是存在共同的特征,两者之间的关系可以用如下图示来总结。

     

     

    从图上实时模型与历史模型的共同特点分析,两者模型是融合统一的。比如两个模型中的事实表通常都是相同的,可以使用公共的分析维度和指标语义进行数据分析,这就要求批流一体的平台可支持两个模型的统一定义,设计和管理,避免模型重复开发和模型不一致。历史模型是实时模型的超集,历史模型涵盖了实时模型的能力,增强了分析的能力(更多维度、更细的粒度、全局去重指标等)。

    由于处理实时和历史数据的计算引擎不同,利用其各自优势,实时模型继续使用流式计算引擎对接流式数据源,历史模型基于大数据平台的并行能力,进行大规模多数据源的融合计算。同时历史模型利用数仓理论中成熟的多维分析方法论,提供缓慢变化维管理、历史数据刷新等能力,增强数据治理。通过对模型定义的统一管理,避免了数据处理逻辑的重复开发,更保证了指标定义的一致性。

    数据生命周期

    模型统一了,数据还是不同计算引擎加工,不可以允许两份数据共同提供查询服务,会引起服务能力的不一致,典型是数据结果重复。因此还需要解决数据生命周期如何管理。实时数据流与历史数据集,可以说是两条完全平行不相同的数据流,如下图所示:

    需要将两份存储进行统一的数据规整,面对不同的分析场景处理方式各有不同。实时数据为保证时效性,会牺牲一定的数据“质量”(原始数据采集质量不可控,数据晚到,缺少数据质量实时修正流程等),这对于一些监控场景是够用的,可以接受“不那么较真”的数据质量;对于分析型的场景来说这样是不可容忍的,需要保证数据的正确性,需要对实时数据进行相应的“修订”才可以和历史数据进行统一的整合。

    所以当实时流数据“沉淀”为历史数据时,需要可以有一定的流程进行实时数据的规整和修正,可以通过实时处理修正(数据重放),也可以是通过离线处理修正(一般称为Enrichment,比如关联更多数据源),这就要求批流一体的平台需要有不同的场景下的数据治理能力,不能简单把实时数据沉淀为历史数据,而要提供多种数据修正的处理能力。

    查询服务

    SQL语言是数据分析师最熟悉的查询方式,提供标准的SQL语法支持,成为对接数据应用层面尤为关键的一环。过去我们曾采用HBase、Redis等多种技术实现查询服务层,甚至要求实时层和历史层采用不同的API,由应用自行判断合适的查询引擎,这给应用开发带来了更高的门槛。

    因此,为了简化服务层接口,需要针对实时分析与历史分析的不同业务场景,自动将查询请求路由到相应的数据集进行检索并返回,同时还需要具备将两者数的查询融合能力,而不是分别从异构系统中取出数据,再在Data Service层用笨拙的编码或人工方式进行合并。这也就要求批流一体的平台既要支持实时分析与历史分析的独立查询,也要支持两者数据查询的融合能力。

    方案优势

    Kyligence 作为大数据领域OLAP解决方案的先行者,产品本身支持实时数据与历史数据的多维数据分析能力,而基于此的统一产品架构设计,为后续打造批流一体融合分析架构提供了良好的基础支持。下图便是Kyligence产品提供基于全Spark计算引擎的批流一体架构设计:

     

    从上面的架构图中可清晰的看到在中心位置上是元数据模型的统一管理,这是批流一体实现中比较关键的部分,然后再结合Lambda架构的优势,便能较好的解决我们在前文涉及的那些挑战:

    • 模型统一管理方面:改进实时数据模型过去只能支持单一Kafka Topic数据的宽表主题,让其也能和历史模型一样,并共享相同的维度表数据,可实现标准星型和雪花模型设计,从而也实现了对模型的统一设计管理;
    • 数据生命周期方面:借助于Lambda架构优势,将实时与历史数据处理分开并行进行处理,这样的设计不仅很好的保护已有的历史数据资产不做变更或以较小的代价改动,而且能够使用历史数据对实时不满足的地方进行修正并覆盖,对于监控类或其他“低数据质量”要求的场景也可以直接将实时数据沉淀为“历史”数据。为不同的应用场景提供更加灵活的数据生命周期管理;
    • 统一查询服务方面:开发智能的查询路由作为查询服务统一查询入口,支持标准的ANSI SQL语法,通过对元数据模型的识别,可分别对实时数据集与历史数据集进行探测并解析,返回查询请求所预期的数据结果,同时以超快的响应速度支持。

    在整个“实时”业务支持与实现过程中,对比其它架构中企业需要运维底层复杂的基础架构,以及在实现流程上繁琐的代码开发工作来说,企业现在只需要其上面进行模型设计与管理,以及数据生命周期定义的操作,极大地提升了工作效率,同时减轻了运维工作负担和成本投入。

    小结

    基于 Lambda 架构升级改造后的 Kyligence 批流一体分析融合架构,不仅解决批流一体中关键部分的支持,同时结合 Kyligence 的其它优势,整套方案可更便捷地在企业落地。例如图形界面化的友好操作、支持 Hive 和 Kafka 两种数据源、无缝集成主流的 BI 平台等。

    目前,我们正将这套方案应用于一家大型金融机构的数据平台中。对于批流一体的最优解,我们在实践中不断探索和迭代。后续,我们将陆续发布文章,总结项目中的最佳实践。如果想了解更多批流一体方案的进展,请关注我们的公众号。

    关于作者

    李森辉,Kyligence 解决方案架构师,拥有丰富的软件开发与架构设计经验,熟悉大数据数仓平台建设,目前主要负责金融行业类的大数据数仓平台解决方案设计。

     

    展开全文
  • 批流一体/流批融合

    千次阅读 2020-09-03 14:55:35
    怎样理解批流一体/流批融合 从 用户,运行,运维三个角度来看: 用户: 当前用户在解决流计算和批计算总是将其分开,开发出两套api。流批一体需要解决的首要问题就是用一套逻辑来描述流与批业务。 运行:当前作业...

    怎样理解批流一体/流批融合

    怎1111

    从 用户,运行,运维三个角度来看:
    用户: 当前用户在解决流计算和批计算总是将其分开,开发出两套api。流批一体需要解决的首要问题就是用一套逻辑来描述流与批业务。
    运行:当前作业总是流批二选一,要么是流作业,要么是批作业。流批统一后,流批选择是计算优化后的结果,同一个作业在不同的阶段呈现出流批两种特性。
    运维:当前架构需要运维多个架构,需要维护多个组件,多个系统。流批统一后,一个引擎就可以解决。

    展开全文
  • 大数据批流一体框架

    2021-08-20 14:32:52
    大数据批流一体架构 黄大先生 创业者 游弋大数据+人工智能 这个是阿里的架构,flink能取的巨大的成功离不开阿里的贡献,其实flink本身就支持批处理和流式计算了,只是他本身只是个计算引擎,不做存储,所以...

    大数据批流一体架构

    黄大先生

    黄大先生

    创业者 游弋大数据+人工智能

    这个是阿里的架构,flink能取的巨大的成功离不开阿里的贡献,其实flink本身就支持批处理和流式计算了,只是他本身只是个计算引擎,不做存储,所以就引入了hive数仓

    用flink和hive实现了批流一体的架构。
    具备实时流数据和离线数据的接入和分析能力。
    支持kafka,socket等数据源

    批流一体就是同时支持离线计算和实时计算
    并且流数据可以和离线的批数据进行碰撞分析

    针对离线数据,数据是离线数据,计算方式是批处理。对应批流一体中的批。支持流数据可以和离线的批数据进行碰撞分析

    展开全文
  • 本文根据陈肃老师在 Apache Kafka x FlinkMeetup 深圳站的分享整理而成,文章首先将从数据融合角度,谈一下 DataPipeline 对批流一体架...
    本文根据陈肃老师在 Apache Kafka x Flink Meetup 深圳站的分享整理而成,文章首先 将从数据融合角度,谈一下 DataPipeline 对批流一体架构的看法,以及如何设计和使用一个基础框架。 其次,数据的一致性是进行数据融合时最基础的问题。 如果数据无法实现一致,即使同步再快,支持的功能再丰富,都没有意义。

    另外,DataPipeline 目前使用的基础框架为 Kafka Connect。为实现一致性的语义保证,我们做了一些额外工作,希望对大家有一定的参考意义。

    最后,会提一些我们在应用 Kafka Connect 框架时,遇到的一些现实的工程问题,以及应对方法。尽管大家的场景、环境和数据量级不同,但也有可能会遇到这些问题。希望对大家的工作有所帮助。

    640?wx_fmt=png

    一、批流一体架构


    批和流是数据融合的两种应用形态


    下图来自 Flink 官网。传统的数据融合通常基于批模式。在批的模式下,我们会通过一些周期性运行的 ETL JOB,将数据从关系型数据库、文件存储向下游的目标数据库进行同步,中间可能有各种类型的转换。

    640?wx_fmt=png

    另一种是 Data Pipeline 模式。与批模式相比相比, 其最核心的区别是将批量变为实时:输入的数据不再是周期性的去获取,而是源源不断的来自于数据库的日志、消息队列的消息。进而通过一个实时计算引擎,进行各种聚合运算,产生输出结果,并且写入下游。
     
    现代的一些处理框架,包括 Flink、Kafka Streams、Spark,或多或少都能够支持批和流两种概念。只不过像 Kafka,其原生就是为流而生,所以如果基于 Kafka Connect 做批流一体,你可能需要对批量的数据处理做一些额外工作,这是我今天重点要介绍的。

    数据融合的基本问题


    如果问题简化到你只有一张表,可能是一张 MySQL 的表,里面只有几百万行数据,你可能想将其同步到一张 Hive 表中。基于这种情况,大部分问题都不会遇到。因为结构是确定的,数据量很小,且没有所谓的并行化问题。

    640?wx_fmt=png

    但在一个实际的企业场景下,如果做一个数据融合系统,就不可避免要面临几方面的挑战:

    第一,“动态性”

    数据源会不断地发生变化,主要归因于:表结构的变化,表的增减。针对这些情况,你需要有一些相应的策略进行处理。

    第二,“可伸缩性”

    任何一个分布式系统,必须要提供可伸缩性。因为你不是只同步一张表,通常会有大量数据同步任务在进行着。如何在一个集群或多个集群中进行统一的调度,保证任务并行执行的效率,这是一个要解决的基本问题。

    第三,“容错性”

    在任何环境里你都不能假定服务器是永远在正常运行的,网络、磁盘、内存都有可能发生故障。这种情况下一个 Job 可能会失败,之后如何进行恢复?状态能否延续?是否会产生数据的丢失和重复?这都是要考虑的问题。

    第四,“异构性”

    当我们做一个数据融合项目时,由于源和目的地是不一样的,比如,源是 MySQL,目的地是 Oracle,可能它们对于一个字段类型定义的标准是有差别的。在同步时,如果忽略这些差异,就会造成一系列的问题。

    第五,“一致性”

    一致性是数据融合中最基本的问题,即使不考虑数据同步的速度,也要保证数据一致。数据一致性的底线为:数据先不丢,如果丢了一部分,通常会导致业务无法使用;在此基础上更好的情况是:源和目的地的数据要完全一致,即所谓的端到端一致性,如何做到呢? 

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


    目前在做这样的平台时,业界比较公认的有两种架构:一种是 Lambda 架构,Lambda 架构的核心是按需使用批量和流式的处理框架,分别针对批式和流式数据提供相应的处理逻辑。最终通过一个服务层进行对外服务的输出。

    为什么我们认为 Lambda 架构是批流一体化的必然要求?这好像看起来是矛盾的(与之相对,还有一种架构叫 Kappa 架构,即用一个流式处理引擎解决所有问题)。

    640?wx_fmt=png

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

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

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

    数据融合的 Ad-Hoc 模式


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

    640?wx_fmt=png
     

    数据融合的 MQ 模式


    另一种模式是 ETL JOB 本身输入输出实际上都是面对消息队列的,实际上这是现在最常使用的一种模式。在这种模式下,需要通过一些独立的数据源和目的地连接器,来完成数据到消息队列的输入和输出。ETL JOB 可以用多种框架实现,包括 Flink、Kafka Streams 等,ETL JOB 只和消息队列发生数据交换。

    640?wx_fmt=png

    DP 选择 MQ 模式的理由

    DataPipeline 选择 MQ 模式,主要有几点考虑:

    第一,在我们产品应用中有一个非常常见的场景: 要做数据的一对多分发。数据要进行一次读取,然后分发到各种不同的目的地,这是一个非常适合消息队列使用的分发模型。

    第二,有时会对一次读取的数据加不同的处理逻辑,我们希望这种处理不要重新对源端产生一次读取。 所以在多数情况下,都需将数据先读到消息队列,然后再配置相应的处理逻辑。

    第三,Kafka Connect 就是基于 MQ 模式的,它有大量的开源连接器。 基于 Kafka Connect 框架,我们可以重用这些连接器,节省研发的投入。

    第四,当你把数据抽取跟写入目的地,从处理逻辑中独立出来之后,便可以提供更强大的集成能力。 因为你可以在消息队列上集成更多的处理逻辑,而无需考虑重新写整个 Job。

    640?wx_fmt=png

    相应而言,如果你选择将 MQ 作为所有 JOB 的传输通道,就必须要克服几个缺点:

    第一,所有数据的吞吐都经过 MQ,所以 MQ 会成为一个吞吐瓶颈。

    第二,因为是一个完全的流式架构,所以针对批量同步,你需要引入一些边界消息来实现一些批量控制。

    第三,Kafka 是一个有持久化能力的消息队列,这意味着数据留存是有极限的。 比如,你将源端的读到 Kafka Topic 里面,Topic 不会无限的大,有可能会造成数据容量超限,导致一些数据丢失。

    第四,当批量同步在中间因为某种原因被打断,无法做续传时,你需要进行重传。在重传过程中,首先要将数据进行清理,如果基于消息队列模式,清理过程就会带来额外的工作。你会面临两个困境:要么清空原有的消息队列,要么你创造新的消息队列。这肯定不如像直接使用一些批量同步框架那样来的直接。

    二、一致性语义保证


    来自 DataPipeline 客户的需求


    先简单介绍一下我们客户对于数据同步方面的一些基本要求:
     
    第一种需求,批量同步需要以一种事务性的方式完成同步

    无论是同步一整块的历史数据,还是同步某一天的增量,该部分数据到目的地,必须是以事务性的方式出现的。而不是在同步一半时,数据就已经在目的地出现了,这可能会影响下游的一些计算逻辑。

    第二种需求,流式数据尽可能快的完成同步

    大家都希望越快越好,但相应的,同步的越快,吞吐量有可能因为你的参数设置出现相应的下降,这可能需要有一个权衡。

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

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

    第四种需求,按需灵活选择一致性语义保证

    DataPipeline 作为一个产品,在客户的环境中,我们无法对客户数据本身的特性提出强制要求。我们不能要求客户数据一定要有主键或者有唯一性的索引。所以在不同场景下,对于一致性语义保证,用户的要求也不一样的:

    比如在有主键的场景下,一般我们做到至少有一次就够了,因为在下游如果对方也是一个类似于关系型数据库这样的目的地,其本身就有去重能力,不需要在过程中间做一个强一致的保证。但是,如果其本身没有主键,或者其下游是一个文件系统,如果不在过程中间做额外的一致性保证,就有可能在目的地产生多余的数据,这部分数据对于下游可能会造成非常严重的影响。

    数据一致性的链路视角


    如果要解决端到端的数据一致性,我们要处理好几个基本环节:

    第一,在源端做一个一致性抽取

    一致性抽取是什么含义?即当数据从通过数据连接器写入到 MQ 时,和与其对应的 offset 必须是以事务方式进入 MQ 的。

    第二,一致性处理

    如果大家用过 Flink,Flink 提供了一个端到端一致性处理的能力,它是内部通过 checkpoint 机制,并结合 Sink 端的二阶段提交协议,实现从数据读取处理到写入的一个端到端事务一致性。其它框架,例如 Spark Streaming 和 Kafka Streams 也有各自的机制来实现一致性处理。

    第三,一致性写入

    在 MQ 模式下,一致性写入,即 consumer offset 跟实际的数据写入目的时,必须是同时持久化的,要么全都成功,要么全部失败。

    640?wx_fmt=png

    第四,一致性衔接

    在 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 框架里遇到最大的两个问题。

    640?wx_fmt=png

    三、DP 的解决之道


    二阶段提交协议


    DataPipeline 如何解决上述问题?首先,需要用协议的方式保证每一步都做成事务。一旦做成事务,由于每个环节都是解耦的,其最终数据就可以保证一致性。下图为二阶段提交协议的最基础版本,接下来为大家简单介绍一下。

    640?wx_fmt=png

    首先,在二阶段提交协议中,对于分布式事务的参与方,在 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 没有持久化成功,下游是看不到这批数据的,这批数据实际上最终会被丢弃掉。

    640?wx_fmt=png

    所以对于源端的发送,我们对 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 若要实现一个二阶段提交所必须要实现的一些功能。

    640?wx_fmt=png

    DataPipeline 将 Sink Connector 分为两类,一类是 Connector 本身具备了事务能力,比如绝大部分的关系型数据库,只需将 offset 跟数据同时持久化到目的地即可。额外的可能需要有一张 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,主要是为了解决刚才提到的预分配资源池和共享资源池的统一管理问题。

    另外,关于数据质量管理,实际上金融类客户对数据质量的一致性要求非常高。所以对于一些对数据质量要求非常高的客户,我们考虑提供一些后校验功能,尤其是针对批量同步。

     


    ▼ Flink 社区推荐 ▼ 

    Apache Flink 及大数据领域盛会 Flink Forward Asia 2019 将于 11月28-30日在北京国家会议中心举办,点击「阅读原文可了解大会更多详情。

    ▼ 
    ▼ 

    点击图片可查看 Flink Forward Asia 2019 详情
    你也「 在看 」吗?
    展开全文
  • Flink批流一体的理解

    2021-10-30 00:19:02
    在大数据处理领域,批处理任务与处理任务一般被认为是两种不同的任务,一个大数据框架一般会被设计为只能处理其中一种任务: MapReduce只支持批处理任务; Storm只支持处理任务; Spark Streaming采用micro-...
  • 点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源 简介小编在去年之前分享过参与的实时数据平台的建设,关于实时数仓也进行过分享。客观的说,我们当时做不到批流一体,小编当时的方...
  • yisql:基于spark的流批一体SQL引擎
  • 在我们的内部版本 Blink 中,我们使用了 SQL 作为流批一体的统一入口,并且在计算和批处理上都做了大量的优化。流批一体也开始真正的发挥出了价值,在我们的搜索离线数据处理和机器学习平台上均获得了较好的效果。...
  • 转载本文需注明出处:微信公众号EAWorld,违者必究。本文介绍了 SparkSQL 和 Flink 对于批流支持的特性以及批流一体化支持框架的难点。在介绍批流一体化实现的同时,重点分析...
  • 这些都是处理有限数据的经典方式。而Flink专注的是无限处理,那么他是怎么做到批处理的呢? 无限处理:输入数据没有尽头;数据处理从当前或者过去的某一个时间 点开始,持续不停地进行 另一种处理形式叫作有...
  • Flink 流批一体的技术架构以及在阿里 的实践
  • 课程连接:https://time.geekbang.org/qconplus/detail/100059771 2.架构框架 2.1v1.0架构 2.2 v2.0架构 3.解决故障和优化 单点故障 单节点执行慢
  • 来源:Kafka-Flink Meetup深圳站作者:陈肃正文欢迎点赞+收藏+转发朋友圈素质三连点下「在看」,月入百万! ...
  • DataPipeline 是一款批流一体数据融合平台,无需任何代码,通过可视化图形配置界面只需 5 分钟即可自服务部署一条实时数据管道,并提供丰富的管理功能:数据的批流一体处理、API 数据接入、数据质量管控、数据任务流...
  • 本文主要分享在 Flink 1.11 中对接 Hive 的新特性,以及如何利用 Flink 对 Hive 数仓进行实时化改造,从而实现批流一体的目标。主要内容包括: · Flink 与 Hive 集成的背景介绍 · Flink 1.11中的新特性 · 打造...
  • Kyligence 智能数据云应运而生,其最新版本 4.5 的发布,推出了业内期盼已久的批流一体/实时功能。Kyligence 特此举办本次网络研讨会,分享: 大数据实时分析可以应用于什么场景中? Kyligence 的批流一体架构有...
  • 首先,本文将从数据融合角度,谈一下DataPipeline对批流一体架构的看法,以及如何设计和使用一个基础框架。其次,数据的一致性是进行数据融合时最基础的问题。如果数据无法实现一致,即使同步再快,支持的功能再丰富...
  • Spark Streaming是把转化成一个个小的来处理,Flink是把当作一种有界的。 1、Storm是第一代处理框架,数据吞吐量和延迟上表现不尽人意,而且在数据准确性方面也存在不足。 2、Spark Streaming是第二代...
  • 流批一体已经从理论走向实践,并在2020年迎来落地元年。 短短 5 年,Apache Flink(下称 Flink)从一个突然出现在大数据舞台的“萌新”系统,迅速成长为人人皆知的计算引擎。 在伴随 Flink 发展掀起的这波实时...
  • 作者 | 蔡芳芳采访嘉宾 | 王峰、杨克特、黄晓锋流批一体已经从理论走向实践,并在 2020 年迎来落地元年。 短短 5 年,Apache Flink(下称 Flink)从一个突然出现在...
  • 流式计算。Spark Streaming的实现非常简单,通过微批次将实时数据拆成一个个批处理任务,通过批处理的方式完成各个子Batch。Spark Streaming的API也非常简单灵活,既可以用DStream的java/scala API,也可以使用SQL...
  • 流批一体架构

    2021-07-15 22:10:17
    待完善
  • 本文介绍了以 Pulsar 做流数据平台,使用 Spark 进行批流一体数据处理的编程实践。 (阅读本文需要约 15 分钟) 批流现状 在大规模并行数据分析领域,AMPLab 的『One stack to rule them all』提出用 Apache Spark ...
  • 自 Google Dataflow 模型被提出以来,流批一体就成为分布式计算引擎最为主流的发展趋势。流批一体意味着计算引擎同时具备计算的低延迟和计算的高吞吐高稳定性,提供统一编程接口开发两种场景的应用并保证它们的...
  • 本文整理自 Apache Flink Committer、阿里巴巴技术专家李劲松的分享,文章将分析当前离线数仓实时化的难点,详解 Flink 如何解决 Hive 流批一体准实时数仓的难题,实现更高效、合理的资源配置。 基于 Hive 的离线...
  • 与Spark不同的是,Flink不但能做真正的流式计算,还能完成计算,达到了很厉害的流批一体。 开启流批一体的方法为,在flink环境中设置为批处理模式 当我们执行wordcount案例时,会出现一个有趣的现象,就是开启...
  • flink流批一体相关概念

    千次阅读 2021-03-07 23:14:24
    flink流批一体相关概念 (1)数据时效性 ​ 日常工作中,我们一般会先把数据存储在表,然后对表的数据进行加工、分析。既然先存储在表中,那就会涉及到时效性概念。如果我们是处理以年,月、周为单位的级别的数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,257
精华内容 4,902
关键字:

批流一体