随着对低成本规模化的需求,越来越多的企业开始使用分布式文件系统,例如HDFS,以及基于批处理的计算系统(如MapReduce)。然而,这些系统难以实现低延迟处理。实时流处理技术,如Storm,虽然可以帮助解决延迟问题,但并不能完全解决所有问题。其中一个原因在于Storm不支持exactly-once语义,这意味着数据的准确性无法得到保证,同时它也不支持基于事件时间的处理。为了克服这些问题,用户需要自行在应用程序中加入这些功能。
后来,一种混合分析方法应运而生,这种方法结合了批处理和实时处理的优点,既能保证低延迟,又能确保数据的准确性。这种方法被称为Lambda架构。Lambda架构通过批处理提供准确但有一定延迟的计算结果,同时利用Storm提供最新的数据处理结果。
Lambda架构由Storm的开发者Nathan Marz提出,旨在设计一个能满足实时大数据系统关键特性的架构,包括高容错性、低延迟和可扩展性等。Lambda架构融合了离线计算和实时计算的优势,结合了不可变性、读写分离和复杂性隔离等原则,可以集成多种大数据组件,如Hadoop、Kafka、Storm、Spark和HBase。
Marz认为,大数据系统应具备以下关键特性: - 高容错性 - 低延迟读写 - 易于扩展 - 支持复杂查询 - 减少维护成本 - 可调试性
为了设计满足上述特性的大数据系统,我们需要深入理解数据系统的核心。数据系统可以简化为: - 数据系统 = 数据 + 查询
首先从“数据”的特性入手。数据是不可分割的单位,具有两个关键属性:时间和内容。 - 时间:数据总是与某个时间点相关联。例如,日志文件按照时间顺序生成,消息传递系统中的消息也是按时间顺序接收的。相比之下,数据库表中的记录可能丢失时间顺序信息。 - 内容:数据与特定时间点相关,因此数据是不可变的。一旦数据生成,就不能修改。数据的操作主要包括读取和添加新数据。
根据数据的本质,Lambda架构采用了不可变的数据存储方式,存储所有原始数据。这种方式的好处包括: - 简化设计:只需简单地向主数据集中追加数据。 - 容错性强:通过重新计算来修复错误数据。
目前,许多系统采用不可变数据模型来存储数据,例如分布式数据库Datomic和消息中间件Kafka。
查询可以视为对数据集上的函数操作。Marz认为,查询的本质是: - 查询 = 函数(所有数据)
这类函数中,Monoid函数特别有用,因为它满足结合律,可以在分布式计算中并行执行。
Lambda架构通过三层结构解决了实时查询的问题:批处理层(Batch Layer)、速度层(Speed Layer)和服务层(Serving Layer)。
Lambda架构的组件选型可以根据具体需求灵活选择。常用的组件包括: - 批处理层:HDFS、Hadoop、MapReduce - 速度层:Storm、Flink - 实时视图存储:HBase、Redis - 服务层:Impala、Hive和HBase的联合查询
尽管Lambda架构在过去被广泛应用,但它也存在一些局限性: - 实时与批量计算结果不一致:由于使用了不同的计算框架,可能导致计算结果不一致。 - 批处理计算窗口不足:在大规模数据集的情况下,夜间计算窗口可能不够。 - 开发和维护复杂:需要在两个独立的API中编写相同的业务逻辑,增加了开发和维护成本。 - 存储空间大:大量中间结果表可能导致数据急剧膨胀,增加存储压力。
由于这些局限性,Kappa架构应运而生,提供了一种更加简洁和灵活的解决方案。