kafka因为版本的不同可能会导致一下接口的差异还有功能等的区别,我用的是0.10版本的kafka,0.8版本的kafka将topic及其分区等元数据是默认保存在zookeeper中,新版本的kafka有一个自带的topic__consumer_offset以存储offset代替zookeeper的相应功能,即:offset会存到kafka中,我们处理kafka中的数据时,kafka有个参数enable.commit.auto,默认为true即kafka会根据默认的时间(好像是5秒)刷新一次offset值,即5秒自动提交一次。这种方式会因为程序等因无法抗拒的因素挂掉导致数据出现问题。一般都选择手动提交,在数据处理逻辑后提交更新后的offset。
可以直接将offset提交到kafka中,此种方式代码简单易实现,
还可以将offset存到zookeeper中,此种方式代码量相对较多。
还可以将offset存到外部数据库中,比如mysql、sqlserver等数据库。
除了这几种方式还可以使用checkpoint,设置检查点的方式去管理offset值。
本次我们就使用zookeeper管理offset值。有相对代码量较少的kafka管理offset,感兴趣的朋友可以去我博客里面看。
废话不多说,上我的代码。
package zookeeper_offset
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.InputDStream
import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
import org.apache.spark.streaming.kafka010.{HasOffsetRanges, KafkaUtils}
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* spark-streaming读取kafka
* 适用本版:spark-streaming-kafka-0-10
* (0.10和0.8的API有较大的区别)
*/
object DirectKafkaManagerMeterData {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[4]").setAppName("Direct