为什么spark同时需要预写日志和检查点?
为什么我们不能只使用检查点?另外使用预写日志有什么好处?
WAL 和 checkpoint 中存储的数据有什么区别?
如果你阅读周围的内容,你就会明白要点,但这并不那么容易。这里重点关注 Spark 结构化流。
引用 https://learn.microsoft.com/en-us/azure/hdinsight/spark/apache-spark-structed-streaming-overview,针对 Spark Streaming(旧版)和 Spark Structured Streaming:
检查点和预写日志
- 为了提供弹性和容错能力,结构化流媒体依赖于 检查点以确保流处理可以继续 即使节点发生故障,也不会中断。在 HDInsight 中,Spark 创建 持久存储(Azure 存储或 Data Lake)的检查点 贮存。这些检查点存储有关的进度信息 流式查询。因此,检查点帮助构建容错且有弹性的 Spark 应用程序,例如驱动程序故障和工人故障。然而,接收器(写入)需要以幂等方式处理,否则我们可能会多次写入/处理。
- 此外,结构化流使用 Write-Ahead 日志(WAL)。 WAL 捕获已接收到的摄取数据,但是 尚未通过查询处理。如果发生故障且处理正在进行 从 WAL 重新启动,从源接收到的任何事件都不会 迷失了。
请注意,如果您使用的是 KAFKA,并重新创建主题,因此 使用 Spark 结构化流本身之外的偏移量, 也有一些考虑因素。因此包含此链接 这比我能说得更好: https://dev.to/kevinwallimann/how-to-recover-from-a-kafka-topic-reset-in-spark-structed-streaming-3phd.
另外这个链接: 如何在 Spark 3.0 结构化流中使用 kafka.group.id 和检查点来在重启后继续从 Kafka 停止的地方读取数据?
总而言之,并不是那么简单,大多数指南都过于简单化或没有完整地处理该主题。希望这有帮助。