Spark Streaming消费Kafka,对于offset的管理方式一般有如下方式:
1. checkpoint 方式管理,通过checkpoint可以将消费的offset持久化存储到hdfs,失败后作业可以从checkpoint恢复。 但是这里的主要问题是,如果你的程序作了升级,比如业务逻辑变更了,你修改了代码,这时是无法从之前的checkpoint恢复的。因为checkpoint第一次持久化的时候会把整个相关的jar给序列化成一个二进制文件,每次重启都会从里面恢复,换句话说不支持应用升级。
2. mysql,可以将offset存储到mysql中,自己管理,作业从mysql中读取每个分区的offset,这样可以解决应用程序升级问题,同时如果你想从之前的某个时刻消费数据,也可以选择在mysql中保留条offset信息。比如我想从一个小时之前重新消费数据,因为这段时间数据出错了,我要重新计算,只需要指定读取记录的一个小时前的offset即可。 这里还有一点需要说明的是,如果你spark输出的数据存储也在mysql中,通过mysql事物,就可以做到端到端的exactly once 语义。
3. zookeeper,可以将offset存储到zk中
4. kafka 0.10 之后,offset存储到kafka的一个topic,`__consumer_offsets`,同时提供了commitAsync 的方式提交offset。
5. 其他第三方存储,redis,hbase都是可以的
# 需要说明的是,上面的这些方式,如果spark消费的数据写入到其他存储中,你只有保证offset的更新和你的数据写入在同一个事物中才能保证端到端的exactly once语义。 比如你如果Spark Streaming输出数据写入hbase中,offset存储在mysql中,你是无法维护offset的更新和数据写入hbase在一个事物的,如果先再写入hbase,再更新offset,保证的语义是at-least-once, 这种情况下数据不会丢失,但是会重复。 如果你先更新offset,再写hbase,这种情况可能造成数据丢失,语义是at-most-once.
更多关于“大数据培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。