发布在即!企业 AIGC 应用程度测评,3 步定制专属评估报告。抢首批测评权益>>> 了解详情
写点什么

如何搭建批流一体大数据分析架构?

  • 2020-05-27
  • 本文字数:4173 字

    阅读完需:约 14 分钟

如何搭建批流一体大数据分析架构?

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



(酷炫的实时监控大屏)


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


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

批流一体架构面临的挑战

传统架构


数据仓库的架构随着业务分析实时化的需求也在不断演进,但在数据分析平台的最初起步阶段,为了满足实时分析需求,传统方案的做法一般都会将实时分析和历史批量数据分析拆分成 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 解决方案架构师,拥有丰富的软件开发与架构设计经验,熟悉大数据数仓平台建设,目前主要负责金融行业类的大数据数仓平台解决方案设计。


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2020-05-27 18:164314

评论

发布
暂无评论
发现更多内容

实现etcd服务注册与发现

六月的

Docker-compose go-zero

go-zero docker-compose 搭建课件服务(一):编写服务api和proto

六月的

Docker-compose go-zero

go channel原理及使用场景

六月的

Go channel

go-zero docker-compose 搭建课件服务(九):http统一返回和集成日志服务

六月的

Docker-compose go-zero

golang单元测试一(简单函数测试)

六月的

golang 单元测试

CORS跨域

六月的

CORS

golang中的errgroup

六月的

golang errgroup

go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构

六月的

Docker-compose go-zero

etcd实现分布式锁

六月的

分布式锁 etcd

golang的内存管理

六月的

golang 内存管理

golang中的几种并发模式

六月的

golang 并发模式

golang中的socket编程

六月的

golang socket

租房小程序使用uniapp展示地图map

源字节1号

小程序开发

部署 SAP UI5 应用到 SAP BTP 时遇到的 error retrieving MTA 错误消息

Jerry Wang

云原生 Cloud 云平台 SAP 10月月更

go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控

六月的

Docker-compose go-zero

go-zero docker-compose搭建课件服务(四):生成Dockerfile

六月的

Docker-compose go-zero

goroutine&waitgroup下载文件

六月的

goroutine waitgroup

深入浅出redis缓存应用

六月的

redis

go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务

六月的

Docker-compose go-zero

go-zero docker-compose 搭建课件服务(三):编写courseware api服务

六月的

Docker-compose go-zero

100+款AI产品薅羊毛攻略(上)——轻轻松松节省几十万

夏夜许游

人工智能 阿里云 AI 视觉

golang垃圾回收

六月的

golang 垃圾回收

go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪

六月的

Docker-compose go-zero

golang中经常会犯的一些错误

六月的

golang

PaddleNLP基于ERNIR3.0文本分类:WOS数据集为例(层次分类)

汀丶人工智能

nlp 文本分类

grpc中的拦截器

六月的

gRPC 拦截器

【LeetCode】水果成篮Java题解

Albert

算法 LeetCode 10月月更

go-zero docker-compose 搭建课件服务(五):完善user服务

六月的

Docker-compose go-zero

rabbitmq原理和应用

六月的

Go RabbitMQ

golang中的选项模式

六月的

golang 选项模式

golang中的一些实用功能

六月的

golang

如何搭建批流一体大数据分析架构?_大数据_apachekylin_InfoQ精选文章