大数据架构
一、大数据处理
大数据处理主要包含 存储 和计算 两部分,其中存储负责数据的持久化、管理和高效访问,计算则负责对存储在大数据平台中的海量数据进行处理、分析和挖掘。
大数据的 存储和计算分离 是现代大数据架构设计中的一种重要理念。通过这种分离,存储和计算可以独立扩展、独立优化,进而提升系统的性能、弹性、可扩展性和成本效益。此外,这种架构还使得大数据平台能够支持更多种类的计算框架、存储系统和工作负载,提高了系统的灵活性和应变能力。
二、大数据存储
大数据存储主要是指如何高效、可靠地存储海量数据。大数据存储系统需要具备弹性、高可扩展性、高吞吐量、低延迟和高可用性,支持各种不同类型的数据(如结构化、半结构化、非结构化数据)。
以下是一些主流的大数据存储技术:
(一) 分布式文件系统
分布式文件系统是大数据存储的基础,它将数据分布在多个节点上,以实现高吞吐量、大容量存储和容错能力。
HDFS(Hadoop Distributed File System)是 Hadoop 生态系统中的核心存储组件,是一个基于分布式存储的文件系统,广泛用于存储大量的非结构化数据(如日志文件、图片、视频等)。HDFS 将数据切分为多个数据块(Block),并将这些数据块分布到集群中的多个节点上,提供高容错性和高吞吐量。
HDFS 的主要特点:
- 高容错性:HDFS 会将每个数据块存储在多个节点上(默认 3 副本),通过冗余机制保证数据完整性,即使某个节点发生故障,数据也不会丢失。
- 高吞吐量:HDFS 适合处理大规模数据,支持大数据的读写功能,可以与 MapReduce 或 Spark 等计算框架结合,实现大数据的批处理功能。
- 不可变性:HDFS 中的文件一旦写入,不允许修改(支持附加数据),这与传统文件系统不同。
(二) 分布式 NoSQL 数据库
NoSQL 数据库通常用于存储非关系型数据,适合存储半结构化和非结构化数据。分布式的 NoSQL 数据库支持大规模、高并发的异构数据操作。常见的分布式 NoSQL 数据库包括 HBase、Cassandra、MongoDB 等。
MongoDB 是一款基于文档存储的分布式 NoSQL 数据库,在 前文 中已有介绍。
HBase、Cassandra 都是基于列式存储的分布式 NoSQL 数据库,二者主要区别如下:
数据库 | HBase | Cassandra |
---|---|---|
数据模型 | 列族存储模型,数据按列存储。每个列族中的列可以动态变化,适合处理稀疏数据。 | 宽列存储模型,数据按行存储,每一行可以有不同的列,且列可动态增加。 |
一致性模型 | 提供强一致性(单行事务)保障。HBase 保证同一行数据的操作是原子性的,但跨行的事务一致性较弱。 | 支持最终一致性,也可以根据需要调整一致性级别(如 ONE、QUORUM、ALL)。默认是最终一致性,提供更多的灵活性。 |
写入性能 | 写入性能较低,适合读多写少的场景,写入操作需要与 HDFS 进行集成,性能可能受限。 | 高写入性能,适合写多读少的场景。Cassandra 通过将写入操作先记录到内存(Memtable),再异步写入磁盘,以支持快速写入。 |
数据中心复制 | 不原生支持跨数据中心复制,但可以通过 HBase 的不同部署模式来实现。 | 原生支持跨数据中心的复制,可以在多个地理位置分布式部署,以保证数据的高可用性。 |
容错性 | 基于 HDFS 的容错机制,RegionServer 崩溃时会通过 HMaster 进行故障恢复和负载均衡。 | 内置容错机制,采用去中心化架构,节点无主从关系,任何节点失效不会影响集群的正常运行。 |
适用场景 | 适用于需要强一致性以及与 Hadoop 生态系统(如 Hive、MapReduce、Spark)结合的大数据分析和存储应用。常用于实时分析、时序数据和大规模日志处理。 | 适用于高可用性和高写入负载的应用,如物联网、社交网络、大规模日志处理、实时数据流处理和跨地域分布式系统。 |
(三) 湖仓一体
数据湖(Data Lake) 是一个集中存储所有数据的系统,可以容纳任何类型的数据,包括结构化、半结构化和非结构化数据。数据湖的设计理念是将原始数据以原始格式存储,为后续进行数据处理、分析和挖掘提供灵活性和可扩展性。
数据仓库(Data Warehouse) 是一个结构化数据存储系统,专为分析和查询而设计。它主要存储经过 ETL(Extract-Transform-Load,提取、转换、加载)流程处理后的结构化数据,并采用高效的查询模型和优化技术来提高查询性能。
湖仓一体 架构融合了数据湖灵活、可扩展的异构数据存储能力,以及数据仓库对结构化数据的高效查询和分析能力。它能同时处理结构化和非结构化数据,提升了数据存储的灵活性和管理效率。
三、大数据计算
大数据计算是指在大规模数据环境下,使用分布式计算框架和技术对海量数据进行处理、分析、挖掘和计算的过程。大数据计算的核心任务是从大量的数据中提取有价值的信息,进行实时或离线的数据处理和分析。
Lambda 架构和 Kappa 架构是大数据处理中的两种重要架构模式,它们的主要区别在于如何处理历史数据和实时数据流。
(一) Lambda 架构
Lambda 架构的目标是构建一个通用的、健壮的大数据系统,能够同时满足实时查询和历史数据批处理的需求。Lambda 架构可分解为三层:批处理层、加速层、服务层。
Lambda 架构将数据处理分解为 Batch Layer 和 Speed Layer 有如下优点:
- 容错性:Speed Layer 中处理的数据也不断写入 Batch Layer。当 Batch Layer 中重新计算的数据集包含 Speed Layer 处理的数据集后,当前的 Realtime View 就可以丢弃,这也就意味着 Speed Layer 处理中引入的错误,在 Batch Layer 重新计算时都可以得到修正。这点也可以看成是 CAP 理论中的最终一致性(Eventual Consistency)的体现。
- 复杂性隔离:Batch Layer 处理的是离线数据,可以很好的掌控。Speed Layer 采用增量算法处理实时数据,复杂性比 Batch Layer 要高很多。通过分开 Batch Layer 和 Speed Layer,把复杂性隔离到 Speed Layer,可以很好的提高整个系统的鲁棒性和可靠性。
1. 批处理层
批处理层是 Lambda 架构的基础层,主要负责 处理离线数据。它接收原始数据流,并进行批量处理和分析。为保证计算结果的准确性,处理的数据集必须具有以下三个属性:
- 数据是原始的:数据是未经处理、未经清洗、未经转换的原始记录,确保批处理层能够基于最初的、未经处理的数据做出精确的分析和计算。
- 数据是不可变的:数据写入系统后不能被修改,确保在计算过程中即使多个节点同时访问数据,不会出现数据不一致的情况。
- 数据是真实的:数据要真实记录实际情况,不是通过模拟或估算得来的。
批处理层有以下特点:
- 高可靠性:批处理层使用容错性较强的分布式文件系统(如 Hadoop HDFS)存储和处理数据,在处理过程中可以处理故障和错误。
- 长时间窗口:批处理层可以使用较长的时间窗口(甚至是全量数据)进行数据处理,因为它处理的是离线数据,不要求实时性。
- 复杂计算:批处理层可以进行复杂的数据计算和分析任务,例如大规模数据聚合、数据清洗、机器学习模型训练等。
2. 加速层
加速层是 Lambda 架构的实时处理层,负责 处理实时数据流。它的作用是提供低延迟的查询结果,以弥补批处理层的延迟。
加速层有以下特点:
- 实时性:加速层处理实时数据流,可以快速响应查询请求,提供近实时的结果。
- 部分数据集:加速层处理的数据集通常是部分数据,而不是全部数据。它会根据实时数据流生成增量更新,以保持数据的最新状态。
- 简单计算:加速层通常执行较简单的计算任务,例如数据过滤、聚合、索引等。由于实时性要求较高,计算任务需要轻量级和高效。
3. 服务层
服务层是 Lambda 架构的最上层,负责 提供数据查询和服务接口。它将批处理层得到的 Batch view 与加速层得到的 Realtime View 整合起来,为用户提供统一的访问接口。
服务层有以下特点:
- 统一查询接口:服务层将批处理层和加速层的结果进行整合,为用户提供统一的查询接口。用户可以通过该接口查询历史数据和实时数据。
- 数据合并:服务层将批处理层和加速层的结果进行合并,保证查询结果的完整性和一致性。
- 数据展示和分发:服务层可以将查询结果展示给用户,并提供数据分发接口,将数据发送给其他系统或应用。
4. 技术选型
Lambda 架构通常采用如下的技术选型:
- HDFS 作为主数据存储层,负责存储大规模数据集。
- Spark 作为批处理层,提供海量数据的计算能力。在机器学习任务中,适合模型的训练阶段。
- Storm 作为加速层,提供快速的数据处理能力。在机器学习任务中,适合模型的迭代和预测阶段。
- HBase 或 Cassandra 作为服务层,提供实时的数据访问和更新。
- Hive 用于创建可查询的视图,使得数据可以被方便地查询和分析。
(二) Kappa 架构
Kappa 架构在 Lambda 架构的基础上进行了优化,Kappa 架构删除 Lambda 架构中的批处理层,只使用单一的流处理层来处理所有数据,不再区分批处理和实时处理。
Kappa 架构将数据存储在数据湖中,并通过消息队列来传递数据流。当需要进行离线分析或重新计算的时候,只需将数据湖的数据经过消息队列重播一次即可。
Kappa+ 架构是 Kappa 架构的增强版,其核心思想是让流计算框架直接读取 HDFS 中的数据仓库数据,实现实时计算和历史数据回溯计算,无需保存日志或复制数据到消息队列。
Kappa+ 架构将数据处理任务分为两种类型:
- 无状态任务:数据计算不依赖于时间的先后次序。用于对全量数据进行并行扫描和处理,不需要维护历史状态,适合一次性的大规模数据处理。
- 时间窗口任务:基于时间分区对数据进行计算。用于将数据按时间进行分区,在每个时间窗口内并行处理数据。即使数据到达的顺序可能乱序,系统也能保证时间窗口内的数据正确计算。
(三) Lambda 与 Kappa 对比
维度 | Lambda | Kappa |
---|---|---|
复杂度与成本 | 需要同时维护两套计算引擎,架构复杂度高,开发和维护成本高 | 只需维护一套计算引擎,复杂度低,开发和维护成本低 |
计算开销 | 需要一直运行批处理和实时处理,且需要多次计算相同的数据(在速度层和批处理层),计算开销大 | 只需一直运行流计算,必要时进行全量计算,计算开销小 |
实时处理 | 通过加速层实时处理流数据,可能存在延迟(需要与批处理层融合),实时性稍差 | 通过统一的流处理框架,实时处理数据,实时性高 |
全量计算 | 批式全量处理,吞吐量大,全量处理能力强 | 流式全量处理,吞吐量较低,全量处理能力较弱 |
适用场景 | 适用于需要复杂离线分析、批量计算和实时分析分开处理的场景,如大数据分析、日志分析、推荐系统等 | 适用于数据流量大、需求快速迭代和实时处理的场景,如实时监控、事件驱动分析、实时数据挖掘等 |