有人说,“湖仓一体”了,所以整个处理就简单了,可以用ETL一口完成“数据源 -> 数据采集 -> 数据存储与计算 -> 数据应用 -> 数据消费”整个数据处理的过程。这主要的思想可能是认为,“湖仓一体”就是意味着底层只需要一个数据库甚至是一个Schema,但这样的理解就片面了。 一个很简单的逻辑,数据湖里有结构化数据和非结构化数据,结构化和非结构化数据难道都存储在同一个库里吗?
首先要理解“湖仓一体”的概念
"湖仓一体"(Lakehouse)并不仅仅是指数据库层面的技术,它实际上是数据架构的一种整合模式,结合了数据湖(Data Lake)和数据仓库(Data Warehouse)的优势,旨在简化企业的数据架构,增强数据存储、处理与分析的能力。湖仓一体通过提供了一个统一的数据存储与处理平台,让你能够在同一个平台中同时处理数据湖和数据仓库的数据。具体来说,数据湖通常用来存储原始的、非结构化或半结构化的数据(如日志、图片、视频等),而数据仓库则用于存储已经经过清洗、结构化并且可以高效查询的数据(如表格数据)。湖仓一体架构允许用户在同一个平台上操作这两种类型的数据,而不是用不同的平台来处理,也不需要考虑将湖里的大数据同步到数仓。这种架构的目标是利用数据处理平台访问湖和仓的数据,实现统一计算的能力,使数据可以更加高效地流动和转化,减少数据移动的成本和复杂性。
我们引用“数据分析不是事儿”的这篇文章《不懂湖仓一体,别说你懂大数据》来看,湖仓一体就是一个平台。

同时,看看各大云厂商的湖仓一体解决方案,它们的底层架构和技术是用到怎样的数据库和技术:
1) 亚马逊云科技的 Redshift Spectrum
底层实现:
Amazon Redshift 是一种基于大规模并行处理(MPP)的数据仓库解决方案,专为分析设计。它主要处理结构化数据,通过将数据压缩、分配到不同的节点来加速查询和分析。一个Redshift MPP集群的节点数通常在2到128个之间。
Redshift Spectrum 是 Amazon Redshift 的扩展,允许用户直接查询存储在 Amazon S3 上的数据,而不需要将其加载到 Redshift 数据仓库中。它通过与 S3 中存储的 Parquet、ORC 等格式的数据交互,允许用户同时查询数据仓库和数据湖中的数据,实现在数据湖和数据仓库之间的无缝衔接。
数据存储:
数据湖:Amazon S3,用于存储海量的结构化、半结构化和非结构化数据。
数据仓库:Amazon Redshift,专门用于高效的结构化数据存储和分析。
湖仓一体:
Redshift Spectrum 使得用户能够将数据仓库与数据湖的资源整合起来。用户可以直接在 Redshift 查询位于 S3 中的数据,而无需将数据复制到数据仓库中,能够实现快速的、低成本的查询和分析。
这种架构不仅支持传统的结构化数据查询,也能处理存储在数据湖中的半结构化数据(如 JSON 和 Parquet 格式的数据),实现数据仓库和数据湖的融合。
应用场景:
电商平台:亚马逊等电商平台可以利用 Redshift Spectrum,实时查询存储在 S3 中的商品数据、交易记录、用户行为数据等,进行综合分析,从而为业务决策提供支持。
2)微软的 Azure Databricks
底层实现:
Azure Databricks 是一个基于 Apache Spark 的分析平台,它结合了 Azure 云服务并集成了 Delta Lake。Delta Lake 是一个开源存储层,基于 Apache Parquet 格式,提供了 ACID 事务支持。它能够在数据湖中存储结构化数据,并支持批处理和流式处理,能够将数据在数据湖和数据仓库之间流动。
数据存储:
数据湖:Azure Blob Storage 或 Azure Data Lake Storage。这里存储各种格式的原始数据,特别是非结构化和半结构化数据。
数据仓库:Azure Synapse Analytics(以前称为 Azure SQL Data Warehouse)。它是一个集成数据仓库解决方案,可以处理大规模的结构化数据,支持 SQL 查询和机器学习任务。
湖仓一体:
Delta Lake 实现了数据湖和数据仓库的无缝集成。用户可以将数据存储在 Azure Data Lake 中,并使用 Delta Lake 来管理这些数据的版本和事务日志,从而在数据湖中保留数据的结构化特性,支持高效的查询和分析。它不仅可以高效支持批处理(如 ETL 任务),还支持实时流式数据处理(如实时日志和事件数据)。
应用场景:
金融行业:通过 Azure Databricks,金融机构可以将所有历史交易数据、实时市场数据、风险分析模型和实时交易数据整合到一起。Delta Lake 允许他们管理复杂的数据流,实时进行风险监控和决策支持。
3)华为云的 Fusion Insight
底层实现:
FusionInsight:是底层的“引擎组”。它是一套强大的、负责实际存储和计算的大数据服务集合。
DataArts Studio:是上层的 “驾驶舱”和“设计室”。它是一个统一的、可视化的管理和开发平台,用户通过它来操作和调度底层的引擎。
FusionInsight是华为大数据解决方案的总品牌,它包含了很多个核心的大数据组件/服务。您可以把它看作一个工具箱,里面装着各种能干活的重型装备。在云上,这些装备通常以独立服务的形式提供:
MRS (MapReduce Service): 负责数据湖计算的引擎。它提供了开源增强的Hadoop、Spark、Flink、HBase等组件能力。当您需要进行大规模数据清洗、ETL、机器学习时,实际跑任务的就是它。
GaussDB(DWS): 负责数据仓库分析的引擎。它是一个高性能的MPP数据库,负责存储结构化数据并提供超快的SQL查询分析。
OBS (Object Storage Service): 负责数据湖存储。它是数据的廉价、海量存储底座。
以及其他组件:如CSS (Cloud Search Service for Elasticsearch)、CloudTable (HBase) 等。
DataArts Studio:前台的“总控中心”,DataArts Studio 本身不存储数据,也不执行计算。它是一个统一的SaaS平台,为数据开发者、管理员和分析师提供了一站式的图形化界面,用来完成所有和数据相关的“管理”和“开发”工作。
它集成了以下核心能力:
• 数据开发:提供IDE,让您写SQL、Spark脚本,并通过拖拉拽的方式编排成复杂的工作流。
• 数据集成:提供向导式的工具,帮您在不同数据源之间搬运数据。
• 数据治理:提供数据地图、数据质量、数据血缘、数据安全等全套治理工具。
• 调度与运维:负责定时触发您开发好的工作流,并监控它们的运行状态。

图- 华为云fusioninsight湖仓一体解决方案举例

图 - 图解数据治理中心DataArts Studio
在使用DataArts Studio的框架下,湖仓一体方案如何选择,以及它是如何工作的。
第一部分:方案选择 (选什么湖,什么仓?)
在华为云生态中,使用DataArts Studio构建现代湖仓一体架构,选择是非常明确的:
数据湖 (Data Lake) 的选择:华为云OBS (Object Storage Service)
为什么是OBS? OBS是云原生的对象存储,具备近乎无限的扩展性、极高的持久性和极低的存储成本。它是构建数据湖的事实标准。所有原始数据、中间处理结果、历史归档数据都应该优先存放在OBS中。虽然也可以对接HDFS,但在云上,OBS的存算分离、高可用和低成本优势是HDFS无法比拟的。
结论: 现代湖仓一体方案的数据湖基石,首选且必选OBS。
数据仓库 (Data Warehouse) 的选择: 华为云DWS (Data Warehouse Service),现在官方品牌名为GaussDB(DWS)。
为什么是DWS? DWS是华为云官方的MPP(大规模并行处理)分析型数据库,专为高性能OLAP(在线分析处理)场景设计。它负责存储经过清洗、建模后的结构化数据,为BI报表、即席查询等场景提供极致的查询性能。
结论:方案中负责高性能分析查询的“仓”,就是DWS。
总结一下方案选择:湖 = OBS, 仓 = DWS。 而DataArts Studio就是将这两者以及其他计算引擎(如MRS Spark)“粘合”起来,并提供一站式开发、治理和运维能力的平台。
华为DataArts Studio 如何实现湖仓一体?
DataArts Studio本身不是数据湖也不是数据仓库,它是一个数据开发与治理的套件。它通过内部不同的功能模块,实现了对底层OBS和DWS的统一操作和管理,从而“实现”了湖仓一体。
您可以把它想象成一个 “数据加工厂的总控室”,它有不同的车间(模块)来完成特定任务:
(1)数据集成 (Data Ingestion) - “原料运输车间”
作用:负责把来自业务数据库(如RDS)、日志文件、或其他云服务的数据,高效、稳定地“搬运”到数据湖(OBS)或数据仓库(DWS)中。
在湖仓一体中的角色:
入湖:配置数据集成任务,将原始业务数据抽取并加载到OBS的指定目录下,完成数据入湖的第一步。
入仓:将其他数据源或OBS中已经过初步处理的数据,加载到DWS的表中。
(2)数据开发 (Data Development) - “数据加工与调度车间”
作用:这是核心的开发环境(IDE)。开发者可以在这里编写SQL、Spark、Shell等脚本,并将这些脚本组合成一个有先后依赖关系的工作流(Workflow)。
在湖仓一体中的角色:
湖区作业 (ELT in Lake):开发者可以编写Spark SQL或PySpark脚本,读取OBS中的原始数据,进行清洗、转换,然后将结果写回OBS的一个新的路径下(例如,从obs://bucket/raw/处理后写入obs://bucket/clean/)。这些任务会被DataArts Studio调度到底层的MRS (MapReduce Service) 大数据集群上执行。
仓区作业 (ETL in Warehouse):开发者可以编写DWS SQL脚本,对DWS内部的表进行聚合、关联等操作。
湖仓联动:这是最关键的!开发者可以设计一个工作流,例如:
步骤1 (Spark作业):从OBS读取日志,清洗并计算出每日UV。
步骤2 (数据集成作业):将步骤1的结果从OBS加载到DWS的一个临时表中。
步骤3 (DWS SQL作业):执行INSERT ... SELECT ...语句,将临时表的数据合并到DWS的最终业务表中。
通过这种方式,DataArts Studio将对湖和仓的操作编排在了一起。
(3)数据目录 & 数据地图 (Data Catalog) - “仓库库存清单与地图”
作用:自动扫描并收集所有数据资产的元数据(表结构、列信息、分区、存储位置等),并建立统一的数据视图。
在湖仓一体中的角色:
统一视图:它可以将来自DWS的表和来自**OBS的数据(通过关联Hive Metastore)**都采集进来,形成一个统一的数据资产目录。
数据发现:分析师不再需要关心某个数据到底是在OBS里还是DWS里,他可以在数据地图上搜索“用户订单”,系统会告诉他相关的表有哪些,并能看到表的血缘关系、数据质量等信息。这打破了湖和仓的物理边界。
(4)数据治理 (Data Governance) - “质量安检与权限管理中心”
作用:包括数据质量监控、数据安全(脱敏、权限控制)、数据血缘分析等。
在湖仓一体中的角色:
血缘贯通:DataArts Studio可以清晰地展示数据的完整链路。例如,它可以告诉你某个DWS报表中的最终指标,其数据源头是OBS里的哪个原始日志文件,中间经过了哪些Spark作业和DWS SQL的处理。这种端到端的血缘对于问题追溯和影响分析至关重要。
统一安全:可以设定统一的安全策略,对敏感数据(无论在湖还是仓)进行识别和脱敏处理。
4) 阿里云的 企业级湖仓一体架构(Dataphin方案)
基础湖仓一体 (如DataWorks方案):解决了“通”的问题。数据可以在湖和仓之间顺畅流动,可以用统一的工具进行开发。
企业级湖仓一体 (Dataphin方案):在“通”的基础上,解决了“治”的问题。它通过注入一套行之有效的方法论,确保数据“进得来、管得好、用得易”,最终将数据真正沉淀为可信、可复用、可运营的企业级核心资产。
第一部分:湖与仓的基石 (The Lake & Warehouse Foundation)
这个方案的物理基础依然是分离的湖和仓,这是实现弹性和成本效益的关键。
“湖” - 统一的数据底座 (OSS)
角色:扮演数据湖的角色,承载所有原始、半结构化和非结构化数据。它是企业所有数据的“单一可信来源 (Single Source of Truth)”。无论是业务日志、用户行为数据还是IoT数据,第一站都是先进入OSS这个成本极低、无限扩展的存储池。
“仓” - 高性能的分析引擎 (MaxCompute + Hologres)
角色:扮演数据仓库的角色,但它不是一个单一的引擎,而是一个 “双引擎组合”,以应对不同的分析负载:
MaxCompute:负责大规模、低成本的批处理和离线分析。它是数据清洗、转换、聚合的“重型加工厂”,用于构建企业的数据仓库核心模型(DWD, DWS层)。
Hologres:负责高并发、低延迟的实时查询与服务。它像一个“加速器”,可以直接读取MaxCompute处理好的结果,为BI报表、实时大屏和在线应用提供亚秒级的查询响应。
关键特性:MaxCompute和Hologres之间的数据可以零拷贝或一键同步,这打破了传统数据仓库和数据集市之间的壁垒,是“仓”内一体化的体现。
第二部分:“一体化”的灵魂 (The Integration Soul - Dataphin)
如果说OSS、MaxCompute、Hologres是湖仓一体的“身体”,那么Dataphin就是控制这个身体的“大脑”和“灵魂”,它真正实现了“一体化”。
如何实现“一体化”的
(1)顶层设计:实现“规划一体化”
传统方式的问题:在没有顶层设计的湖仓中,数据从湖到仓的流动往往是“野蛮生长”的,各个业务团队按需构建自己的数据管道,导致口径不一、重复建设。
Dataphin的解决方案:它强制要求在动手开发前,先进行统一的数据规划和建模。通过其内置的OneData方法论,你需要先定义好公司的核心业务实体(如“商品”、“订单”),以及与这些实体相关的指标和维度。
这如何体现“一体化”?:它确保了所有进入数仓的数据都遵循同一套“蓝图”和“语言体系”。数据不再是孤立的,而是在一个统一的、全局的业务视角下被组织和管理,这是治理层面的一体化。
(2)规范开发:实现“生产一体化”
传统方式的问题:开发者手写SQL或Spark代码,风格各异,质量参差不齐,维护困难。
Dataphin的解决方案:它提供了一个标准化的开发范式。基于第一步定义好的模型,Dataphin可以自动生成大部分的ETL代码。开发者不再需要关心底层的复杂SQL,而是通过配置化的方式完成开发,确保了所有数据加工流程都符合预设的规范。
这如何体现“一体化”?:它将数据从湖(OSS)到仓(MaxCompute)的整个加工过程,都置于一个统一的、受管控的“生产线”上。所有产出(数据表)的质量和标准都是一致的,这是开发过程的一体化。
(3)资产沉淀:实现“资产一体化”
传统方式的问题:数据散落在湖和仓的各个角落,管理者不清楚有哪些数据、数据质量如何、谁在使用。数据只是成本,不是资产。
Dataphin的解决方案:在Dataphin中,所有经过规范化开发产出的数据表,都会自动注册为“数据资产”。每个资产都有清晰的业务含义、技术元数据、负责人、数据质量评分和端到端的血缘关系。
这如何体现“一体化”?:它构建了一个统一的数据资产目录(Data Catalog),无论数据物理上存储在OSS还是MaxCompute,在Dataphin中都被视为统一管理的资产。业务用户可以通过数据地图轻松地查找、理解和申请数据,实现了数据管理和消费的一体化。
(4)底层驱动:实现“计算一体化”
这如何体现“一体化”?:Dataphin本身不执行计算,它是一个“指挥官”。它将你在平台上定义的逻辑模型和处理流程,智能地翻译成底层的物理执行计划,然后统一调度MaxCompute、Hologres等不同的计算引擎去完成任务。用户无需关心底层引擎的切换和调用细节,只需关注业务逻辑。这实现了对异构计算引擎的调度和管理一体化。

图-Dataphin研发
(5)总结
以上几个大厂的数据湖和数据仓库的实现方式各有不同,但总体目标是一致的:直接读取数据湖和数据仓库的数据参与运算,不需要从湖里筛选额外大数据到数仓,从而是实现高效的计算处理。通过使用如 Amazon Redshift Spectrum、Azure Databricks、Fusion Insight、Dataarts Studio、MaxCompute、Dataphin 等平台数据处理技术,大厂们在不同的场景中提供了 “湖仓一体”的解决方案,以便支持大规模数据处理和实时分析。
讲究“湖仓一体”的方法,有几层深刻的含义:一是过去数据湖的处理软件和数仓处理软件来自于不同的开源软件,不能统一使用,导致处理不连贯;二是数量太大,比如单张表超过100亿条数据,从湖到仓同步一次时间过长,长达数天,所以没有不建议同步;三是数据质量有保障,不需要做过多数据清洗,只需要筛选;四是数据湖可以直接存放生产系统产生的数据,而不是从生产系统中归集来的数据。这时候,为了减少处理的复杂度,就不要刻意将某些数据从数据湖层到数仓层。有了“湖仓一体”统一处理平台,这个时候就能发挥操作便捷性。
今天,我们要讨论的场景与上迥异。我们经常面临的to G 或者 to B的环境,一般业务系统单表数据最大不超过4亿,来自几百个业务系统的总数据量加在一起也就是百亿级。由于很多业务系统运行了10年以上,历史原因很多数据不标准,且数据质量不高。那么这种场景下,数据要不要分层处理呢?
1)首先,如果数据湖(假定就是ODS贴源层)中存在大量脏数据,而且,不是简单筛选过滤就能提升数据质量的,而是需要复杂的转换加工才能完成清洗和治理,那么,还是建议分层处理。因为ODS贴源层的数据为了保证能回溯,是需要保持与源端数据一致的。而且,从源端的数据不断归集到ODS中,数据可能不断更新中,所以,即便你修改了ODS的数据,归集任务也会更改回到源端一样的数据。所以,通常不建议直接修改ODS的数据,而是将ODS中的数据进行质量筛选后进入数仓进行治理。 有人说,从ODS到数仓(DWD)不是浪费了很多时间吗? 这就取决于软件的处理能力了,如果从ODS到DWD的过程是增量的,而且通过并行处理引擎进行计算,这个时间损失是很小的,可以小到秒级延迟,但是却解决了数据质量问题。

所以,我们通常建议针对ODS数据做数据质量检测,将干净的数据入仓。针对脏数据进行数据清洗和治理,再入仓。
2)平台依然统一处理。采用全链贯通的数据中台软件,权限贯通,这依然是上面介绍的“湖仓一体”架构的概念。
用传统ETL工具一口气能不能把数据处理全流程做完?
在 to G 或 to B 的环境 下,面对数百个业务系统、总计百亿级的数据量、历史数据的质量问题,以及数据权限、数据安全、分类分级等复杂要求的情况下,传统的ETL工具,如 Kettle,一口气完成全流程数据处理是非常困难的,甚至可以说是不可取的。
1)数据量庞大,处理能力不足
百亿级数据的处理压力:Kettle 和许多传统ETL工具虽然可以处理数百万或上亿的数据,但当数据量达到数十亿甚至百亿级别时,处理速度、计算资源、内存管理等方面的压力将极为巨大。传统ETL工具一般设计时考虑的并发性和分布式处理能力较弱,可能无法在大规模数据环境下稳定高效运行。如果有人寄希望于在一个笔记本电脑上运行的Kettle来处理大量的数据,那显然就是不可能。
并发处理能力不足:Kettle 主要是基于单机或者小规模集群的设计,虽然支持分布式部署,但其核心设计并不是为大规模数据处理(如数十亿行数据的处理)优化的。并且在面对大量业务系统和海量数据时,单一的 ETL 流程可能导致数据处理的瓶颈,资源竞争严重,性能瓶颈难以突破。
因此,在处理百亿级数据时,传统的ETL工具如Kettle一口气完成数据处理,可能导致长时间的等待、资源消耗过大,甚至系统崩溃。
2)数据质量问题复杂且多变
数据标准化难度大:很多业务系统运行了超过10年,历史数据不仅不标准,还可能存在很多质量问题(如重复数据、缺失数据、不一致数据等)。这些问题需要逐步清洗和转换,而不是简单地一次性处理。一次性执行ETL流程会在数据标准化环节暴露出很多问题,比如数据字段不一致、格式不对齐等。
清洗与转换任务复杂:对于复杂的数据质量问题,传统ETL工具只能处理基本的转换(如字段映射、类型转换等),而对于更复杂的逻辑,比如数据去重、数据填充、数据一致性检查等,传统ETL工具往往很难高效且灵活地处理。特别是历史数据的质量问题,往往需要逐层处理、分步清洗,不能一蹴而就。
3)权限管理与数据安全问题
数据权限控制:在to G或者to B的场景中,数据的安全性和权限管理极其重要。不同的数据源、数据层次和业务领域可能涉及不同的权限要求。传统的ETL工具并不能和系统要求的“统一身份认证”权限打通。通常需要配合其他安全机制来确保权限控制。这意味着如果直接使用传统的ETL工具一口气执行所有ETL任务,无法灵活地进行权限区分和审计,可能导致数据泄露或错误授权。
数据脱敏与加密:在涉及敏感数据(如个人隐私、金融数据等)时,需要进行脱敏和加密处理。传统ETL工具往往没有内置高效的脱敏算法,通常需要额外开发或者引入第三方工具来处理数据的加密、脱敏等问题,这在一条ETL流程中操作起来非常不方便和不灵活。
4)分类分级与合规性问题
数据分级与合规性要求:在政府和企业(to G / to B)环境中,数据通常需要按照敏感度、重要性等不同的标准进行分类和分级处理,并确保符合合规要求(如GDPR、数据保护法等)。数据分级需要非常精细的管理,传统ETL工具通常不具备灵活的分层、分级管理能力。
例如,某些数据需要严格的加密保护,而另一些数据则可以在无加密的情况下使用。ETL工具通常难以根据不同的业务需求和合规要求灵活调整数据处理规则,导致无法保证在整个流程中都符合数据安全和合规要求。
分层管理的必要性:在这样的环境中,采用数据分层(ODS、DWD、DWS、ADS等)架构非常重要,以便根据数据的敏感性、重要性等进行不同的处理方式。传统ETL工具一口气做完全流程时,往往会把所有数据混合在一起处理,缺乏灵活的分层管理和数据隔离,不利于后续的合规性审计和安全控制。
5)故障恢复与灵活性不足
故障恢复的难度:一口气做完ETL处理,意味着如果某个环节出现问题,可能会导致整个流程失败。对于百亿级的数据,如果其中某一环节处理失败,恢复成本和时间非常高。分层处理可以将任务拆分成多个独立的模块,某一层出问题时只需要重新处理该层,而不需要重跑整个ETL流程,从而大大减少了故障恢复的时间和成本。
灵活性差:传统ETL工具一般会在整个ETL流程中写死所有的转换规则和任务,一旦业务需求发生变化,整个流程需要重新调整。而分层设计可以将各个数据层的逻辑独立,业务需求变化时只需要调整其中一层的转换规则,其他层不受影响,增加了系统的灵活性和扩展性。
6)维护性和团队协作
维护复杂性:随着业务系统和数据量的增加,数据处理流程变得越来越复杂。传统ETL工具虽然可以在开发初期快速搭建流程,但随着时间推移、数据源变化以及业务需求增加,维护这些“一口气完成”的流程将变得非常困难。任何一个小修改都可能导致整个ETL流程出错。
团队协作问题:数据处理往往涉及多个团队的协作,例如数据工程师、数据分析师、数据科学家等。如果所有任务都压缩在一个ETL流程中,团队协作就变得非常困难。分层架构可以让不同的团队负责不同的层次,避免了大量重复的工作和协作上的混乱。
结论
综合来看,在to G 或 to B 的复杂环境下,尤其是面对百亿级数据量、历史数据质量问题、数据权限和安全需求时,传统的ETL工具一口气完成整个数据处理链条是不现实的。这种方式不仅在性能、容错性、灵活性上存在问题,还难以满足数据治理、安全、合规等多方面的要求。
因此,针对这样的场景,分层设计是比较合理的,将整个数据处理流程拆分为多个层次,每个层次可以独立处理、独立优化,确保系统能够灵活应对不同的数据处理需求和业务变化,同时保证数据的安全性、合规性和高效性。
当然,对于流式数据实时性要求很高的情况下,通常不需要考虑分层设计。这个话题,后面再讲。
本文视频讲解请参见:
手机端请关注公众号:数据集成服务
加入讨论群: