【时间窗口】Lambda 架构

103 阅读3分钟

Lambda 架构是一种用于构建大规模实时数据处理系统的架构设计模式。它结合了批处理(Batch Layer)和实时处理(Speed Layer),以及一个服务层(Serving Layer),从而能够处理大量的数据,并提供实时和高性能的查询功能。

Lambda 架构通常包含以下三个层次:

  1. 批处理层(Batch Layer): 批处理层主要负责处理大量的历史数据,以生成一致的、可靠的批处理视图。它可以使用诸如 Apache Hadoop、Apache Spark 等技术来执行复杂的数据处理任务,例如数据清洗、转换、聚合等。生成的结果会保存在持久的数据存储中。
  2. 实时处理层(Speed Layer): 实时处理层用于处理数据流,并提供低延迟的结果。它通常使用流处理引擎(如 Apache Flink、Apache Storm、Apache Kafka Streams 等)来处理实时数据,并在速度层中生成近实时的结果。这一层通常处理最近的数据,因此不需要处理所有历史数据,能够提供更快的查询响应。
  3. 服务层(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 上已经拥有批流一体的特性.为了满足这个特性需要满足两个条件:

  1. 正确性:流处理的计算需要达到强一致性
  2. 时间逻辑:流处理的是无限持续性数据,批处理的是有限不变的数据,那么可以将流处理的数据经过时间窗口切分,当达到计算时间时,这个窗口的数据,就是有限不变的数据,也就变成了批处理。

所以FLINK 为什么要设计时间窗口功能,这也是其中的一个原因。接下来我们可以学习时间窗口