Lambda 架构是一种用于构建大规模实时数据处理系统的架构设计模式。它结合了批处理(Batch Layer)和实时处理(Speed Layer),以及一个服务层(Serving Layer),从而能够处理大量的数据,并提供实时和高性能的查询功能。
Lambda 架构通常包含以下三个层次:
- 批处理层(Batch Layer): 批处理层主要负责处理大量的历史数据,以生成一致的、可靠的批处理视图。它可以使用诸如 Apache Hadoop、Apache Spark 等技术来执行复杂的数据处理任务,例如数据清洗、转换、聚合等。生成的结果会保存在持久的数据存储中。
- 实时处理层(Speed Layer): 实时处理层用于处理数据流,并提供低延迟的结果。它通常使用流处理引擎(如 Apache Flink、Apache Storm、Apache Kafka Streams 等)来处理实时数据,并在速度层中生成近实时的结果。这一层通常处理最近的数据,因此不需要处理所有历史数据,能够提供更快的查询响应。
- 服务层(Serving Layer): 服务层用于组合批处理层和实时处理层的结果,并提供一致的查询接口。它通常使用分布式存储系统(如 Apache HBase、Apache Cassandra、Elasticsearch 等)来存储结果,并为用户提供查询服务。服务层可以同时支持批处理结果和实时处理结果的查询,并确保结果的一致性。
基本思想:批处理层旁边运行一个流处理层系统,他们都执行相同的计算,流处理提供低延迟,不准确的结果。每隔一段时间,批处理系统持续滚动处理并计算出正确的结果,修正流处理系统的结果。
下面是一个使用 Java 编写的简单 Lambda 架构示例:
// 模拟批处理层,处理历史数据
public class BatchLayer {
public static void main(String[] args) {
// 使用 Apache Spark 或其他批处理引擎处理历史数据
// 在此处执行数据清洗、转换、聚合等操作
System.out.println("Batch processing completed.");
}
}
// 模拟实时处理层,处理实时数据
public class SpeedLayer {
public static void main(String[] args) {
// 使用 Apache Flink、Apache Storm 或其他流处理引擎处理实时数据
// 在此处执行实时流处理操作
System.out.println("Real-time processing completed.");
}
}
// 模拟服务层,提供查询接口
public class ServingLayer {
public static void main(String[] args) {
// 使用 Apache HBase、Apache Cassandra、Elasticsearch 或其他分布式存储系统存储结果
// 在此处提供查询服务,组合批处理层和实时处理层的结果
System.out.println("Query service started.");
}
}
// 主类,用于启动 Lambda 架构
public class LambdaArchitecture {
public static void main(String[] args) {
// 启动批处理层
BatchLayer.main(args);
// 启动实时处理层
SpeedLayer.main(args);
// 启动服务层
ServingLayer.main(args);
}
}
请注意,以上示例只是一个简单的演示,实际上 Lambda 架构涉及更复杂的数据处理和系统设计。实际上这个架构的复杂实现,Flink 上已经拥有批流一体的特性.为了满足这个特性需要满足两个条件:
- 正确性:流处理的计算需要达到强一致性
- 时间逻辑:流处理的是无限持续性数据,批处理的是有限不变的数据,那么可以将流处理的数据经过时间窗口切分,当达到计算时间时,这个窗口的数据,就是有限不变的数据,也就变成了批处理。
所以FLINK 为什么要设计时间窗口功能,这也是其中的一个原因。接下来我们可以学习时间窗口