Spark整合Kafka并手动维护offset

Spark整合Kafka两种模式说明

开发中我们经常会利用SparkStreaming实时地读取kafka中的数据然后进行处理,在Spark1.3版本后,KafkaUtils里面提供了两种创建DStream的方法:

1.Receiver接收方式:KafkaUtils.createDstream

有一个Receiver作为常驻的Task运行在Executor等待数据,但是一个Receiver效率低,需要开启多个,再手动合并数据,再进行处理,很麻烦,并且Receiver那台机器挂了,部分数据会丢失,需要开启WAL(预写日志)保证数据安全,那么效率又会降低!
Receiver方式是通过zookeeper来连接kafka队列,调用Kafka高阶API,offset存储在zookeeper,由Receiver维护,Spark获取数据存入executor中。
spark在消费的时候为了保证数据不丢也会在Checkpoint中存一份offset,可能会出现数据不一致
所以不管从何种角度来说,Receiver模式都不适合在开发中使用

2.Direct直连方式:KafkaUtils.createDirectStream

Direct方式是直接连接kafka分区来获取数据,调用Kafka低阶API,offset自己存储和维护,默认由Spark维护在checkpoint中,消除了与zk不一致的情况(当然也可以自己手动维护,把offset存在mysql、redis中),且可以从每个分区直接读取数据大大提高了并行能力。
所以基于Direct模式可以在开发中使用,且借助Direct模式的特点+手动操作可以保证数据的Exactly once 精准一次

下面代码演示手动维护提交偏移量offset到MySQL数据库中(Spark-Kafka-0-10版本整合)


import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.{
   Seconds, StreamingContext}
import org.apache.spark.streaming.kafka010.{
   OffsetRange, _}
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.spark.streaming.dstream.InputDStream
import org.apache.spark.{
   SparkConf, SparkContext}
import org.apache.kafka.common.TopicPartition
import java.sql.{
   DriverManager, ResultSet}
import scala.collection.mutable

/**
  *  手动维护偏移量offset到MySQL数据库中
  */
object SparkKafkaOffset {
   
  def main(args: Array[String]): Unit = {
   
  
    //1.准备环境
    val conf = new SparkConf().setAppName("offset").setMaster("lo
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘金超DT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值