流式处理和批处理
批处理是指对固定数量的数据执行计算。也就是说我们已经知道数据的边界,并且可以在处理之前查看所有数据,例如一周内发生的所有销售行为。流处理适用于实时处理的“无限”或无界数据集。流处理的常见用例包括监控用户活动、处理游戏日志和检测欺诈交易。
分布式数据处理的演进
Spark 和 Flink 是第三代和第四代数据处理框架。
MapReduce 是第一代分布式数据处理系统。
该框架在水平扩展的分布式基础架构上处理可并行数据和计算。除了并行化和数据分发之外,MapReduce还从开发人员那里抽象出分布式系统的所有系统级复杂性,并提供容错功能。它支持批处理。
随后,一些第二代分布式处理系统框架对 MapReduce 模型进行了改进。例如,Tez 提供了交互式编程和批处理。
Spark 被认为是第三代数据处理框架,原生支持批处理和流处理。
Flink 是第四代数据处理框架,是 Apache 的顶级项目之一。
Flink 支持批处理和流处理,并且是为原生流处理而设计的。Flink促进了连续流式传输,其中一旦收到事件就会触发事件计算。
Spark VS Flink:功能比较
Spark和Flink中的功能集在很多方面都不同,如下表所示:
| 性能 | Spark | Flink |
|---|---|---|
| 数据处理 | 批次/流(微批次) | 批处理/流(本机) |
| 迭代 | No | Yes |
| SQL | Spark SQL | Table & SQL API |
| 容错 | Yes (WAL算法) | Yes (Chandy-Lamport算法) |
| 优化 | 手动 | 自动 |
| 窗口 | 定时 | 时间,计数 |
| 状态后端 | HDFS | 内存、文件系统、RocksDB |
| 语言 | Scala, Java, Python, R, C#, F# | Java, Scala, Python, SQL |
| 成本 | 开源 | 开源 |
| Backpressure | 手动配置 | 隐式,通过架构 |
| 延迟 | 秒 | 亚秒 |
结论
虽然 Flink 更新,但 Spark 更成熟,使用范围更广。此外,Spark 具有托管支持,并且很容易找到许多现有用例以及其他用户共享的最佳实践。
虽然 Flink 并不成熟,但它对于复杂的事件处理或原生流用例很有用,因为它提供了更好的性能、延迟和可扩展性。此外,它对窗口和状态管理有更好的支持。 Flink 能够使用原始操作完成许多需要在 Spark 中开发自定义逻辑的操作。
参考
Spark 与 Flink 究竟哪家强?:zhuanlan.zhihu.com/p/549490227