Flink 学习笔记 之 流处理架构演变

100 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

1. 有界数据流 VS 无界数据流

  • 有界(bounded)数据流:数据流有头有尾,是一批数据。
  • 无界(unbounded)数据流:数据流有头无尾,是无穷无尽的连续数据。

2. 流式数据处理架构演变

2.1 传统事务处理架构

计算层(业务层)在需要处理数据时,向存储层(磁盘)发起请求。传统的 Web 应用就是典型的这种架构,用户的点击等事件被实时的处理,这也是最基本的流处理架构。

受制于数据规模,表规模过大时,联表查询等操作无法在规定时间内返回结果,因此该架构无法满足大数据场景。

2.2 有状态的流处理(第一代)

为了解决传统事务处理面临的问题,我们考虑把对数据的读写转移到内存而非数据库(磁盘)中。

这里提出了一个“状态”的概念,即内存中的数据,可供增删改查操作,定期存盘。

有状态的流处理有 3 个典型的应用:

  1. 事件驱动型应用:搭配消息队列的应用
  2. 数据分析型应用:实时数仓
  3. 数据管道型应用:实时 ETL

以 Storm 为代表的第一代分布式流处理器采用这种架构,只保证了处理大数据的速度,无法保证分布式系统中正确的数据处理顺序

2.3 Lambda 架构(第二代)

由于批处理不会出现乱序现象,为了改善上一代架构,出现了合并批处理和流处理的 Lambda 架构,它吸收了二者的优点,既保证了计算结果的准确性又保证了低延迟,但是缺点也显而易见,对于同一应用要做出两套独立的实现,对程序员不友好。

2.4 Flink(第三代)

Flink 的出现解决了 Lambda 架构过于繁重的问题,它具有一致性(exactly-once)和准确结果,并且支持高吞吐和低延迟。

2.5 总结

  • 第一代流式处理架构将数据读写由磁盘转移到内存
  • 第二代流式处理架构将批处理融合到流处理来保证计算顺序
  • 第三代流式处理架构优化了第二代架构,并拥有许多其他优点

3. Flink VS Spark

  • Spark 以批处理为根本,认为流处理可以统一为批处理。
  • Flink 以流处理为根本,批处理统一为流处理。

海量数据的批处理 Spark 有着明显的优势,尽管 Spark 在流处理上也在不断发展和完善,但是目前更推荐使用 Flink 来完成实时流处理。