场景分析
SparkStreaming读取kafka消息队列数据时,如果SparkStreaming突然由于一些非代码原因挂掉,重启Spark集群如何能确保SparkStreaming能不丢失kafka队列内的数据。主要利用了kafka集群的offset值。offset记录了kafka每个分区数据读取到了哪里,类似于游标。有三种解决方案操作offset:
1.Checkpoints
利用spark Checkpointing 机制保存数据至hdfs,最大的缺点是不代码改动后之前的checkpoint将失效
详情参考http://spark.apache.org/docs/latest/streaming-programming-guide.html#checkpointing
2.Kafka itself##
详情参考http://spark.apache.org/docs/latest/streaming-kafka-0-10-integration.html#kafka-itself
3.Your own data store##
操作前记录offset值,操作后更新offset值。本文介绍如何用zookeeper存储offset,读取更新offset值
实现将offset存入Zookeeper
在 SparkStreaming 中消费 Kafka 数据的时候,有两种方式分别是 1)基于 Receiver-based 的 createStream 方法和 2)Direct Approach (No Receivers) 方式的 createDirectStream 方法,详细的可以参考 Spark Streaming + Kafka Integration Guide ,但是第二种使用方式中 kafka 的 offset 是保存在 checkpoint 中的,如果程序重启的话,会丢失一部分数据,可以参考 Spark & Kafka - Achieving zero data-loss 。
本文主要讲在使用第二种消费方式(Direct Approach)的情况下,如何将 kafka 中的 offset 保存到 zookeeper 中,以及如何