流式计算相关概念。

1.流式计算

1.1 大数据处理的四个场景

  • 长时间运行的批式数据处理(Hadoop MapReduce、Spark等)

  • 实时运行的流式数据处理(Flink、SparkStreaming等)

  • 交互式运行的数据查询(秒级或者毫秒级,OLAP引擎等)

  • 大规模的智能模型的训练和部署(大数据链路与AI打通)

1.2 概念

流式计算(stream processing)是用于处理无界数据集的计算,包括真正的流式和通过微批(micro-batch)方式实现的流式计算。

— “A type of data processing engine that is designed with infinite data sets in mind. " – Streaming 101: The world beyond batch.

1.3 特点

  • 实时(realtime)且无界(unbounded)的数据流 数据源产出的数据,实时地被流计算订阅和消费。
  • 持续(continuos)且高效(high-performance)的计算 流计算作为一种"事件触发"的计算模式,一旦有新的源数据进入,立即发起一次计算任务。
  • 流式(streaming)且实时(realtime)的数据集成 流数据触发一次流计算的结果,类似流数据一样,可以直接写入目的存储。

1.4 价值

avatar

2. 核心概念

  • 有状态(Stateful)和无状态(Stateless)

    • 无状态的数据流处理(Stateless Processing):处理当前数据时无需了解历史数据。比如: 数据清洗。
    • 有状态的数据流处理(Stateful Processing): 处理当前数据时,需要使用历史数据或其产生的中间结果。比如:各种聚合计算(count/sum/min /max等)、数据Join。

    对于有状态的数据流处理,当发生故障时,需要恢复状态数据。 avataravatar

    大多数有状态计算任务的性能瓶颈在于外部状态数据的IO。

  • 检查点(checkpoint)和保存点(savepoint)

    • checkpoint

      流式任务通常需要长时间运行,当出现故障时,从头再来不现实。所以添加一种机制,定期记录系统状态快照,例如消费的offset。 当出现故障时,恢复最新的快照,重新处理。

      avatar

    • savepoint

      • 定期对job做快照,存储kafka offset、in-flight sessions和应用状态
      • 从savepoint重启一个job,而不是最开始

      avatar

  • 时间(Time)

    • Event Time: 数据产生的时间
    • Ingestion Time: 接收数据的时间
    • Processing Time:处理数据的时间

    avatar

  • 水印(waterMark) 用于处理迟到、乱序数据的机制;通常用时间戳表示,作为特殊事件注入到数据流中。表示t时刻之前的数据已经达到。 avatar 基于eventtime,新消息进入流计算系统时,是待处理状态(in-fligt),被处理完成后,变成处理完成(completed)状态。 这个分布图的关键点,是待处理消息最左边的那条边界线(即红色和蓝色部分中间的边界线),这条线代表了管道中待处理数据的最早时间戳。我们用这条线来定义watermark: Watermark是单调递增的,管道中最早的待处理数据的事件时间戳。

  • 窗口机制(Windows)

    • Fixed/Tumbling Window: 固定大小,不重叠
    • Sliding Window: 固定大小,有重叠
    • Session Window: 不固定大小,根据时间、事件划分

    avatar

  • 一致性语义(Delivery Guarantees)

    • at-most-once: 数据没有保障
    • at-least-once:可能有重复数据
    • exactly-once:数据只被处理一次

3. 流式计算平台对比

3.1 流式计算引擎选型

avatar

3.2 Spark Streaming模型

avatar

  • Micro-Batch模式:将数据切分成小批次,每个批次按批处理逻辑计算
  • 最小延时:batch的处理时间
  • 最大延时:batch interval(通常2s ~ 10s)+ * batch的处理时间
  • 使用场景:数据清洗(实时数据通道)、数据ETL等
  • 对于熟悉Spark批量处理的容易上手
  • 相对成熟,生态丰富

avatar

avatar

  • Native Streaming模式(Native Streaming 计算模式认为 “批是流的特例”):每次处理一条数据
  • 低延时,通常在毫秒级
  • 使用场景:事件驱动的应用(作弊检测、异常检测、基于规则的报警、业务流程监控等)、实时风控、在线业务等
  • 支持Event time
  • 窗口灵活
  • 状态管理
  • CEP

avatar

3.4 Lambda Architecture & Kappa Architecture

  • Lambda Architecture

    • Storm作者Nathan Marz提出
    • 目前最常见的数据处理架构
    • 批处理+流计算
      • 流计算输出低延迟、近似结果
      • 通过批处理得到精确数据

    avatar

  • Kappa Architecture

    • Linkedin的Jay Kreps提出
    • 简化Lambda架构,避免两套代码、架构
    • 流计算代替批处理,所有的数据都走流式,要求保证结果一致

    avatar

4. 性能调优

目标:低延时、高吞吐、水平扩展

  • 优化执行计划
  • 并行化算子
  • Efficient network stack
  • 内存管理
  • Share nothing, hopefully
  • Async
  • Prevent scheduling latency
  • Serialization / deserialization

5. 常见的技术方案

  • 流式计算 + 实时存储 or 消息队列
  • 流式计算 + 实时OLAP

6. 典型的流式计算应用场景

case1

case2

case3

7. 参考资料