将Streaming拉取的数据存入redis中

本文详细介绍如何使用Spark Streaming从Socket接收数据,并实时统计词频,最终将结果存入Redis数据库。通过创建Jedis连接池,优化了Redis的连接管理,提高了数据处理效率。

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

启动redis:   ./redis-cli -h hadoop01

package utils

import org.apache.commons.pool2.impl.GenericObjectPoolConfig
import redis.clients.jedis.{Jedis, JedisPool}

/**
  * 创建jedis连接池
  */
object Jpools {
   private val poolConfig = new GenericObjectPoolConfig()
  poolConfig.setMaxIdle(5)//最大的空闲连接数
  poolConfig.setMaxTotal(2000)//支持最大的连接数
  //连接池不需要对外提供访问
  private lazy val jedisPool = new JedisPool(poolConfig,"hadoop01")

  /**
    * 对外提供一个可以从池子里面获取连接的方法
    * @return
    */
  def getJedis :Jedis={
    val jedis = jedisPool.getResource
    jedis.select(1)
    jedis
  }
}
package shujuku

import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.dstream.ReceiverInputDStream
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
import utils.Jpools

/**
  * 将实时统计的词频写入到redis里面
  */
object WordCountRedis {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("WordCountRedis")
    
    //每2秒钟采样一次数据
    //第二个参数是批次时间间隔,多长时间的数据集作为一个批次,这个时间不能随意设置,必须是科学合理的设置,只有这样才能稳定运行
    val ssc = new StreamingContext(conf,Seconds(3))
    //接收数据
    val words: ReceiverInputDStream[String] = ssc.socketTextStream("hadoop01",1235)
    
    words.foreachRDD(rdd=>{
      //计算当前批次结果
      val current_batch_result: RDD[(String, Int)] = rdd.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)

      //把计算好的当前批次结果写到redis
      current_batch_result.foreachPartition(partition=>{
        //每个分区从池子里获取一个连接对象
       val jedis= Jpools.getJedis
        partition.foreach(tp=>{
        //redis的特性hincrby
          jedis.hincrBy("wordcount",tp._1,tp._2)
        })
        //用完之后,记得文明
        jedis.close()
      })
    })
    ssc.start()
    ssc.awaitTermination()
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值