实时数仓到底是什么呢?与传统数仓有什么区别?

数仓,即存放数据的仓库,包括全量数据、历史数据。类型上又分为实时数仓、离线数仓,所谓实时数仓是指数据的实时性更高、延迟性低,一般是统计一天以内的数据,支持毫秒级的统计,在建设工具上一般采用Flink,而离线数仓则统计历史数据,在建设工具上一般采用Hive。对于实时性要求比较高的场景,如实时的交易分析、实时数据看板(比如双十一的成交额看板)、实时业务监控、实时数据接口服务等,我们就需要实时数仓了。

在数仓的开发实现中包含四个模块,即物理存储、数据抽象、runtime作业执行、编程接口。那么离线数仓和实时数仓有什么区别呢?在物理存储模块,离线数仓一般使用HDFS存储,实时数仓使用Kafka消息队列进行存储,在数据抽象模块,离线数仓使用HIve表,实时数仓使用streamtable。在作业执行模块,离线数仓使用mapreudce,而实时数仓使用FlinkStreaming。在编程模块,离线数仓使用HiveSQL进行开发,实时数仓使用FlinkSQL 进行开发。这就是实时数仓和离线数仓在开发实现上的区别了。

介绍完了数仓概念、实时数仓和传统数仓的区别之后,我们再来看看技术选型。

在实时数仓的建设中对于大规模数据的处理架构有Lambda架构、Kappa架构,从业界使用情况、灵活性、容错性、成熟度、迁移成本、批/流处理代码来看,Lambda都是最佳的方案。在实时计算引擎上,Flink是最佳的选择方案,因为比较准确、延时低、业界内使用多、易用性高。在实时存储引擎上,综合业务维度索引、高并发情况、高性能查询特征,一般推荐ClickHouse

介绍完技术选型之后,我们来看看实时数仓和实时存储两块如何实现?

在实时数仓中包含四层,即数据接入层ODS、数据明细层DWM、数据汇总层DWS、数据应用层APP。如下图所示,ODS层是数据的源头,包含系统的消息队列数据、系统日志、流量埋点数据、系统消息,不同业务线可能采用的方式存储数据,但是在接入数仓时需要统一来源接入,这样可以方便数据的处理以及数据一致性。在数据明细层,一般分两类进行数据建设,一类是业务数据明细、一类是按维度进行数据拆分,比如在美团中,商家的

### 实时数仓实现原理 #### 架构演进概述 实时数仓的发展经历了多个阶段,从最初的批处理为主逐渐过渡到支持流处理的能力。早期的大数据架构主要依赖于批量加载和周期性的ETL流程来更新仓库中的数据[^1]。 随着技术进步,在实时数仓2.0版本中引入了更先进的特性,比如实现了真正的批流一体化解决方案,允许在一个平台上同时执行批处理作业以及低延迟的流式数据分析任务。这不仅提高了系统的灵活性也增强了其应对复杂业务场景的能力。 到了实时数仓3.0时代,则更加注重性能优化和服务质量保障等方面的工作,旨在提供更为稳定高效的平台服务给最终用户。 #### 关键组件和技术 ##### 流式计算框架 为了能够快速响应并处理源源不断流入的新鲜事件记录,现代实时数仓通常会采用专门设计用于高吞吐量、低延迟能力的分布式流处理器作为核心引擎之一。Apache Flink 是当前最流行的开源项目之一,它提供了强大的窗口操作语义及时序逻辑控制等功能,非常适合构建复杂的实时应用系统[^2]。 ##### 维度表管理工具 考虑到事实表格经常需要其他辅助信息相结合才能产生有价值的洞察结论,因此如何高效地管理和维护这些关联关系成为了一个重要课题。Redis作为一种高性能内存数据库被广泛应用于此领域内充当缓存层的角色,从而加速查询速度的同时减轻下游OLAP引擎的压力。 ##### 存储计算分离模式下的数据湖方案 对于那些既希望保留传统MPP集群所带来的良好交互体验又不想失去新兴对象存储介质带来的成本优势的企业而言,“数据湖”概念应运而生。这类新型架构强调将原始日志文件直接保存至低成本的对象库当中,并借助多种类型的专用解析器按需抽取所需片段参后续运算过程;此同时还特别重视元数据治理工作以确保整个生态链条上的各个组成部分之间保持良好的协作状态[^4]。 #### Kappa架构的应用实践 值得注意的是,在某些特定应用场景下单纯依靠Lambda模型可能会造成资源浪费现象的发生——即当面对频繁变动的历史资料重播需求时往往不得不额外部署一套独立管道来进行回溯性分析。针对上述痛点问题,业界提出了所谓的“Kappa Architecture”,该方法主张尽可能多地利用现有基础设施开展增量式的变更追踪活动,仅在必要时刻才触发全面扫描动作,以此达到简化运维难度的目的[^3]。 ```python from flink import StreamExecutionEnvironment, TableEnvironment env = StreamExecutionEnvironment.get_execution_environment() t_env = TableEnvironment.create(env) # 注册外部连接器(如 Kafka) source_ddl = """ CREATE TABLE kafka_source ( id BIGINT, data STRING ) WITH ( 'connector' = 'kafka', ... ); """ sink_ddl = """ CREATE TABLE hdfs_sink( id BIGINT, processed_data STRING )WITH( 'connector'='filesystem', ... ); """ t_env.execute_sql(source_ddl) t_env.execute_sql(sink_ddl) query = """ INSERT INTO hdfs_sink SELECT * FROM kafka_source; """ t_env.execute_sql(query).wait() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值