object Kafka_consumers {
def main(args: Array[String]): Unit = {
//spark充当kafka消费者 直接订阅主题消费,将数据更新到hbase里
val ssc=new StreamingContext(new SparkContext(new SparkConf().setMaster("local[*]").setAppName("demo")),Seconds(5))
//kafka配置参数 这是另一个类里的方法 我搬过来了
def kafka_util:collection.Map[String, Object] ={
val kafkaParams = Map[String, Object](
"bootstrap.servers" -> "192.168.1.201:6667,192.168.1.202:6667",
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"group.id" -> "qqaeqay",
"auto.offset.reset" -> "earliest",
"enable.auto.commit" -> (false: java.lang.Boolean)
)
kafkaParams
}
//需要一个hash类型的,谨记这里 创建一个map来放上一次消费的偏移量
var map=scala.collection.mutable.Map[TopicPartition, Long]() //盛放分区offset
val bo=HBasePool("192.168.1.201","2181")//线程池
val bbo= bo.borrowObject()//借
val tb=bbo.getTable("aoc")//表名
val get=new Get("user_behavior_topic_a".getBytes())//rowkey
val tabl=tb.get(get)
while(tabl.advance()){
//user_behavior_topic_a column=cf1:0, timestamp=1558913449163, value=1588
val cell=tabl.current()
val qualifier=Bytes.toInt(CellUtil.cloneQualifier(cell))
val cellvalue=Bytes.toLong(CellUtil.cloneValue(cell))
map.put(new TopicPartition("hyy",qualifier),cellvalue)//这里放入的就是 rowkey,分区,偏移量
}
tb.close()
bo.returnObject(bbo)//还
//匹配模式 如果map内有数据则消费map中的数据 如果没有数据而从头消费
val stream = map.size match {
case 0 => KafkaUtils.createDirectStream(ssc,LocationStrategies.PreferConsistent,
ConsumerStrategies.Subscribe[String,String](List("hyy"),Spark_Utils.kafka_util))
case _ =>KafkaUtils.createDirectStream(ssc,LocationStrategies.PreferBrokers,
ConsumerStrategies.Subscribe(List("hyy"),Spark_Utils.kafka_util,map)
)
}
逻辑开始的地方
stream.map(f=>{#$%^&})
ssc.start()
ssc.awaitTermination()
// ssc.stop(false,true)//优雅
手动维护kafka偏移量精准一次语义(随内容维护到hbase里)
最新推荐文章于 2023-07-10 19:12:40 发布