一、数据湖发展趋势分析
当下,数据湖已成为企业数据平台架构的重要组成部分。传统的数据平台架构一般由数据湖、流式计算和 OLAP 引擎查询三个部分组成:
- 数据湖:由 Hadoop 搭建的大数据平台承载,负载海量数据存储与批量计算。
- 流式计算:一般由 Flink 组件承载,负责实时的数据流处理。
- OLAP 数仓:可选择技术比较多,包括:开源的 Doris、StarRocks、Clickhouse 等以及传统数仓,负责承载数据查询业务。
这三个平台在以往通常是独立建设的,集群也是独立部署。三者之间数据互相拉通,采用以下方案:
湖平台与流式平台的互通:通常采用 Lambda 架构搭建实时计算平台和离线批量计算平台,以实现流式计算与数据湖之间的协同。
流式计算平台与 OLAP 仓互通:一般实际与计算引擎的数据源对接方式拉通,还会基于 Kappa 架构在流式计算中进行实时的数据加工处理,将计算结果写入数仓中,以实现实时的 OLAP 查询,这也是通常讲的实时数仓解决方案。
湖平台与数仓平台互通:一般是通过数据拷贝方式,将数据湖的原始数据或者批量计算结果数据复制一份到数仓当中。
以上的解决方案存在一些问题。首先,从建设和维护的角度来看,这种架构需要分别建设三个平台,导致建设与维护成本增大;其次,数据共享需要进行一定的冗余存储和数据拷贝,导致方案复杂读变高。因此大家现在在逐渐尝试将三个功能平台融合到一起,形成融合数据湖。
在融合数据湖中,将通过流批一体的架构实现实时计算和批量计算的数据共享,解决数据冗余和数据搬迁的问题。通过湖内建仓的方式,在数据湖实现数仓的能力,构建 OLAP 能力,避免了数据的搬迁。这种融合数据湖的架构不仅可以提高数据处理的效率,还可以降低数据平台的建设和维护成本,实现数据的共享和流通。
二、数据湖整体架构
上图是一个基于开源技术的数据湖参考架构,从数据流上分为几个环节:
数据源:数据流的起点,来源于业务系统,包括业务数据库、消息流、日志等。
数据集成:数据湖架构中的重要环节。数据集成是业务系统与数据湖之间的桥梁,实现入湖和出湖的能力。通过批量和实时能力,可以实现 T+1 和 T+0 的集成能力。根据业务诉求和具体业务架构选择不同的集成方式。
数据存储:采用开源的 Lakehouse 技术进行数据存储管理。底层的存储引擎可以采用 Hadoop 的 HDFS 组件也可以采用对象存储引擎。存储格式采 Parquet 和 ORC 格式,这些格式提供了高效的压缩和编码方式,有助于提升数据的存储和处理效率。基于 Lakehouse 技术,构建数仓能力,例如:ACID 能力、Update 能力、Schema 的演进,以及查询加速的缓存和索引技术。
数据计算:采用支持流批一体的计算引擎,如 Spark 和 Flink,也可以基于 Hive 引擎进行批量计算。
湖内交互式分析:通过交互式查询引擎 Presto、Trino 等,实现对湖内数据进行查询分析,通过湖存储的加速技术加持,查询性能也可以实现秒级时延。
OLAP 层:在湖内进行数据加工处理完成后,需要更快速的查询能力,通过数据集成同步到 OLAP 组件,根据具体业务需求,我们可以选择不同的组件,如 CK 大宽表的快速查询和 HBase KV 查询等。当前部分 OLAP 组件也可以直接查询湖内数据,避免了数据搬迁。
以上环节组合形成完整数据平台架构,满足多种业务场景的技术诉求。
三、数据集成
数据集成是业务系统与数据湖之间的桥梁,要面对多种不同的数据源。在流批一体的数据湖平台中,数据集成主要分为批量集成和实时集成两种方式。
批量集成:采用定时周期性的搬迁方式,将上游数据一次性搬迁到数据湖,或者将数据湖的数据搬迁到 OLAP 组件,例如 Sqoop、DataX 等开源组件,通过 JDBC 连接到源数据库,将数据抽取出来并写入数据湖中。这种方式适用于对时效性要求不高的场景,面临的挑战主要是大数据量的集成带来的吞吐压力。
实时集成:采用上游数据变更触发的数据搬迁方式,通常采用实时增量技术采集上游数据。通常会利用开源技术如 Flink CDC(Change Data Capture)来实现数据库的实时数据捕获,将这些变化的数据采集到Kafka 等消息队列中或者直接入湖实现实时入湖。采用增量读取的方式将数据湖新变更数据同步到 OLAP 组件层,例如:采用 Flink 实时读取 Hudi 的新增数据写入 Doris。这种实时集成方式极大地提高了数据的时效性。
在实时集成中挑战:
- 完整性保证:区别于批量集成,实时集成是实时采集每一条变更的新数据,在异常场景要保证数据不丢。
- 有序性保证:在流式计算中数据流有更新操作,数据是否保序会影响到计算结果的准确性,例如:上游数据库对同一主键记录更新多次,数据集成会采集到多条记录,如果乱序那计算结果就会错误。
- 稳定性保证:日常的业务通常会有波峰波谷的出现,在实时集成通道要有能力保证流量增大也能保证任务运行的稳定性,可以通过加强监控的方式发现问题,通过弹性伸缩能力或者上线前压测,保证任务的资源分配到位,或者通过限流措施牺牲波峰的时效性来保证稳定性。
随着技术的发展,一些开源工具已经能够实现流批一体的实时数据集成,这些工具不仅可以降低建设成本,还能够减少技术复杂度。
四、Lakehouse 核心能力
在数据湖的存储层,Lakehouse 技术的应用为数据处理和分析带来了革命性的变革。Lakehouse 不仅继承了数据湖的灵活性和可扩展性,还引入了数据仓库的关键特性,如 ACID 事务、强一致性 Schema 管理、SQL 查询等。以下是Lakehouse 技术应具备的关键能力:
- 增强的 DML SQL 能力:Lakehouse 新增了 update、upsert 和 merge into 等操作,数据湖也具备了更新能力。
- Schema Evolution:业务系统不断演进过程中,会带来表结构的变更,传统大数据在该场景通常采用的是重新建表的方式。Lakehouse 支持 Alter table 能力,保证数据湖表可以更加灵活的适配业务的演进发展。
- ACID 事务和多版本支持:为了确保数据的一致性和完整性,Lakehouse 应提供 ACID 事务支持,并在异常情况下提供数据的回滚能力。多版本支持则允许访问历史数据,为数据的时间旅行提供可能。
- 并发控制:在多用户环境中,Lakehouse 应能够处理并发读写操作,确保数据的一致性和准确性。这包括对同一张表的并发写入以及在读写操作中的严格一致性保证。
- 时间旅行:Lakehouse 应支持时间旅行功能,使用户能够访问任意时间点的数据快照。这不仅为数据回溯和历史分析提供了便利,还支持了流式的增量读取能力。
- 文件存储优化:为了支持高效的 OLAP 查询,Lakehouse 应优化数据存储格式,以便在特定场景下能够快速检索数据。
- 流批一体处理:Lakehouse 应同时支持流式和批量的数据读写,实现数据的一体化存储和处理,满足多样化的数据处理需求。
- 索引构建:为了加速 OLAP 查询,Lakehouse 提供了索引构建能力,以满足业务对查询时延的要求。
- 自动化管理:Lakehouse 具备自动化管理能力,包括数据的合并、历史数据的清理、索引的构建等,以减轻用户的维护负担,并提高数据平台的可靠性和稳定性。
五、Lakehouse 开放性设计
在现代数据湖的 Lakehouse 架构中,保持开放性的设计原则是至关重要的。这种开放性体现在几个关键方面:
- 数据格式的开放性:Lakehouse 架构应确保其支持的数据格式具有开放性。这意味着使用标准化的、与开源社区广泛兼容的数据格式,如 Parquet 和 ORC。这种开放的数据格式允许 Lakehouse 与各种数据处理工具和计算引擎无缝对接,无论是开源的还是商业的。例如,Apache Spark、Presto 和 Flink 等流行的开源计算引擎都能够高效地读取和写入这些开放格式的数据。
- 计算引擎的开放性:Lakehouse 架构还应支持多种开源和商业计算引擎的接入。这种开放性确保了企业可以根据具体的业务需求和数据处理的场景,选择最合适的计算引擎。无论是实时数据处理、批处理还是交互式查询,Lakehouse 都能够与各种计算引擎协同工作,提供高效的数据处理能力。
- 元数据与数据权限的集成:在 Lakehouse 中,元数据和数据权限管理是数据管理的基本能力要求。这种能力不仅确保了数据的组织和管理效率,还提供了精细的数据访问控制,保障了数据的安全性和合规性。
- 多云部署能力:Lakehouse 架构应支持多云部署策略,包括在私有云和公共云环境中的部署。这种灵活性确保了企业可以根据自身的业务需求和资源状况,选择最合适的部署环境,同时保证了平台的持续稳定演进。
六、流批一体
流批一体架构是现代数据处理平台的核心特征之一,它实现了数据存储、计算的深度融合。流批一体通常包含三种解释:
- 数据存储的流批一体:同一份数据既支持流式读取也支持批量读取。物理上数据存储是一份。这种存储模式确保了数据的一致性,并减少了数据冗余。
- 计算引擎的流批一体:指流式计算和批量计算可以由同一个计算引擎完成。例如,Apache Flink 和 Apache Spark 都支持流批一体的数据处理。这种方式可以降低架构复杂度,降低开发者的使用门槛。
- 数据处理代码的流批一体化:指数据处理的代码可以同时适用于流式和批量的方式执行。这样可以降低开发成本,同时保证流批的任务代码逻辑一致性。
在流批一体架构中,全链路支持批量和实时 ETL 计算。在数据仓库的各分层中,企业可以采用批量计算来保证小时级和天级的处理能力,同时利用实时计算来保证分钟级的数据处理能力。通过数据的统一处理,企业可以实现分钟级的数据可见性,并确保数据的一致性,避免批处理和流处理数据结果的不一致性。
七、实时 OLAP
OLAP 能力是实现快速数据分析和决策支持的关键。为了满足业务对快速响应和高效处理的需求,需要提供秒级的查询时延和数百级别的并发查询能力。随着业务的发展具体的能力会有所变动,在面对业务量的大幅波动时,基于数据湖架构能够迅速扩展计算能力,以应对高业务压力的挑战。
此外,基于容器化的部署能力,数据湖可以实现根据业务量的弹性伸缩。这种灵活性不仅提高了资源利用率,还确保了在高峰时段能够提供足够的计算资源,以满足业务需求。在业务量减少时,资源可以相应地缩减,以优化成本效率。
八、湖内建仓
在数据湖架构中,湖内建仓的概念是将数据仓库的能力集成到数据湖内部,以实现数据的高效管理和分析。这一过程涉及多层的存储优化和数据组织。
首先,在数据文件层,我们实施存储优化技术,如排序存储和哈希分布,以提高数据文件的访问效率。此外,我们还进行数据打散和内容组织优化,以进一步加速 OLAP 查询。
接下来是索引层的构建。为了加速计算过程,采用与数据仓库类似的技术,包括数据裁剪、下推和缓冲等,以优化计算性能。同时,提供统一的元数据服务,确保数据资产的统一视图,并统一数据开发中的数据库管理。
在数仓模型方面,继续使用传统的数仓分层存储模型,如 ODS、DWS 和ADS,同时根据业务需求对数据进行主题域划分,以实现更精细的数据管理。
在表模型方面,采用常见的快照表模型和拉链表模型进行数据存储,并根据需要采用其他模型。通过这些方式,我们能够在数据湖内部实现数仓的数据管理能力和数据处理能力。