Spark-ClickHouse-ES实时项目第七天-精确一次性消费读取偏移量

该项目使用Spark处理实时数据,结合ClickHouse与ES。日志仓库分别在GitHub上,手动提交偏移量初始读取自Redis,若无数据则从Kafka起始位置开始。在运行过程中,业务数据会不断更新到Redis。如果服务宕机,重启时会根据Redis中的偏移量继续消费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

仓库位置

日志生成:https://github.com/SmallScorpion/gmall-mock.git
日志服务器:https://github.com/SmallScorpion/gmall-spark-ch-es-realtime.git

手动提交偏移量

  1. 第一次读取会加载Redis数据,若是redis中没有数据那么将消费kafka起始数据,经过业务计算保存到redis中
  2. 中间循环过程是业务到redis保存数据的过程
  3. 若中途宕机,重启进程服务都会读取redis偏移量位置进行消费
    在这里插入图片描述

OffsetManager

package com.warehouse.gmall.realtime.util

import java.util

import org.apache.kafka.common.TopicPartition
import redis.clients.jedis.Jedis

import scala.collection.mutable

object OffsetManager {

  /**
   * 从redis中读取偏移量
   * @param topicName
   * @param groupId
   * @return
   */
  def getOffset( topicName: String, groupId: String ): Map[TopicPartition, Long] ={

    // Redis => type->hash  key->offset:[topic]:[groupid]  field->partition_id value->offset
    // 存入 ->  hmseet offset:GMALL_START:group_dau 0 12 1 15 2 7 3 18
    // 取出 ->  hgetall offset:GMALL_START:group_dau
    val jedis: Jedis = RedisUtil.getJedisClient

    val offsetKey = "offset:" + topicName + ":" + groupId
    val offsetMap: util.Map[String, String] = jedis.hgetAll(offsetKey)

    import scala.collection.JavaConversions._

    val kafkaOffsetMap: Map[TopicPartition, Long] = offsetMap.map { case (partitionId, offset) =>
      (new TopicPartition(topicName, partitionId.toInt), offset.toLong)
    }.toMap

    kafkaOffsetMap
  }


  // TODO 把偏移量写入redis


}

业务代码

 val topic: String = "GMALL_SPARK_CK_ES_START"
    val groupId = "DAU_GROUP"

    // TODO 读取偏移量
    val kafkaOffsetMap: Map[TopicPartition, Long] = OffsetManager.getOffset( topic, groupId )

    // TODO 消费kafka数据
    var recordInputStream: InputDStream[ConsumerRecord[String, String]] = null

    if( kafkaOffsetMap != null && kafkaOffsetMap.nonEmpty ) {
      recordInputStream = MyKafkaUtil.getKafkaStream( topic, ssc, kafkaOffsetMap, groupId )
    } else {
      recordInputStream = MyKafkaUtil.getKafkaStream( topic, ssc )
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值