新的应用程序如何获取原来的offset
可以同时使用Checkpoint机制和ZooKeeper机制:
--当程序只是挂掉之后重启而没有修改代码的时候,通过Checkpoint机制反序列化信息;
--当应用程序升级了代码的时候,首先需要graceful stop我们的Spark Streaming,所谓graceful stop就是Spark Streaming不再产生新的作业,让所有未完成的作业执行完成,此时Checkpoint是最后一个批次生成的,ZooKeeper也是最后一个批次更新的,此时ZooKeeper中的offset与Checkpoint中的offset是一致的。新版应用程序启动前会删除原始的Checkpoint目录,程序执行getOrCreate(),此时没有CheckpointPath目录,那么就会执行函数,函数新建JavaStreamingContext,新建JavaStreamingContext时会自己去读取ZooKeeper中的offset,然后把offset信息写入CheckpointPath,随后开始运行。
防止kafka高级消费者数据丢失:
采用了WAL预写规则,当读取一批次的时候,将数据存储到HDFS。
程序宕机重启后,直接读取WAL内的数据,进行RDD的计算。