使用spark来获取kafka的数据
要建立一个连接对象来获取数据——对象的建立需要传入偏移量参数
偏移量的初始值:多个分区需要有多行数据。
partition从0开始排,逐个增加。
//kafka的连接参数
val kafkaParams = Map[String, Object](
"bootstrap.servers" -> "hadoop101:9092,hadoop1012:9092,hadoop10103:9092",
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"group.id" -> "group1",
"auto.offset.reset" -> "latest",
"enable.auto.commit" -> (false: java.lang.Boolean)
)
//设置读取偏移量
DBs.setup()
var toMap: Map[TopicPartition, Long] = DB.readOnly { implicit session =>
SQL("select * from train0701offset where topic=? and groupid=?")
.bind("first", "group1")
.map(line => (
new TopicPartition(line.string("topic"), line.int("partition")),
line.long("offset")
)).list().apply()
}.toMap
var directStream: InputDStream[ConsumerRecord[String, String]] = KafkaUtils.createDirectStream(
scc,
//位置
LocationStrategies.PreferConsistent,
//消费策略
ConsumerStrategies.Subscribe[String, String](
//指定主题
Array("first", "second"),
//kafka配置
kafkaParams,
//偏移量
toMap
)
)
获取的directStream为rdd的集合
获取偏移量存入数据库
//处理返回的数据
directStream.foreachRDD(rdd=>{
if(!rdd.isEmpty()){
//kafka的数据中有偏移量的值
var ranges: Array[OffsetRange] = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
//写入数据库
DBs.setup()
DB.localTx{implicit session=>
ranges.foreach(ors=>{
SQL("update train0701offset set offset=? where topic=? and groupid=? and partition=?")
.bind(ors.untilOffset,ors.topic,"group1",ors.partition)
.update().apply()
})
}
}
})