sparkStream-wordCount实现exactlyOne第二种--Redis

wordCount的三种实现方式(mapreduce,scala,spark) 1. mapreduce实现 Mapper类 public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable>{ /* * LongWritable key:输入的每一行的偏移量 框架读取的 * Text value:输入的每一行的内容 * Context context:上... 阅读详情

主要思路

将数据收集到driver端,利用redis的Pipeline写数据和偏移量,与第一种mysql的类似

但是redis pipline只有单机版redis或者主备redis才支持,集群版的redis不支持

package com.ws.sparkstreaming.kafkaredis

import com.ws.sparkstreaming.utils.{JedisPool, OffsetUtils}
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.dstream.InputDStream
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, HasOffsetRanges, KafkaUtils, LocationStrategies}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import redis.clients.jedis.{Jedis, Pipeline}

object WordCountJoinKafkaRedisManagerOffset {
  def main(args: Array[String]): Unit = {
    val appname = "wc_redis"
    val group = "group1"
    val topic = Array("wc1").toIterable
    val conf = new SparkConf().setAppName(appname).setMaster("local[*]")
    val ssc = new StreamingContext(conf, Seconds(5))
    ssc.sparkContext.setLogLevel("WARN")
    val kafkaParam = Map(
      "bootstrap.servers" -> "dream1:9092,dream2:9092,dream3:9092", // kafka地址
      "key.deserializer" -> "org.apache.kafka.common.serialization.StringDeserializer", // 设置反序列化组件
      "value.deserializer" -> "org.apache.kafka.common.serialization.StringDeserializer",
      "group.id" -> group, // 消费者组
      "auto.offset.reset" -> "earliest", // 指定消费者从哪开始消费[latest,earliest]
      "enable.auto.commit" -> "false" // 是否自动提交偏移量,默认是true
    )
    val lastoffset = OffsetUtils.selectOffsetFromRedis(appname, group)
    val dstream: InputDStream[ConsumerRecord[String, String]] = KafkaUtils.createDirectStream(
      ssc,
      LocationStrategies.PreferConsistent,
      ConsumerStrategies.Subscribe[String, String](topic, kafkaParam, lastoffset))
    dstream.foreachRDD((kafkaRdd: RDD[ConsumerRecord[String, String]]) => {
      val ranges = kafkaRdd.asInstanceOf[HasOffsetRanges].offsetRanges
      println("------------------------------------" + System.currentTimeMillis() + "------------------------------------")
      if (!kafkaRdd.isEmpty()) {
        // 转换数据
        val res: RDD[(String, Int)] = kafkaRdd.map(_.value()).flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
        // 收集到driver端
        val wordAndNums = res.collect()
        var jedis: Jedis = null
        var pipeline: Pipeline = null
        try {
          jedis = JedisPool.getConnection()
          // 设置redis数据库
          jedis.select(1)
          // 获得pipeline
          pipeline = jedis.pipelined()
          // 开启事务
          pipeline.multi()
          wordAndNums.foreach(word => {
            pipeline.hincrBy(appname, word._1, word._2)
          })
          for (elem <- ranges) {
            pipeline.hset(appname + "_" + group, elem.topic + "_" + elem.partition, elem.untilOffset.toString)
          }
          // 提交事务
          pipeline.exec()
          pipeline.sync()
        } catch {
          case exception: Exception => {
            ssc.stop()
            // 回滚
            pipeline.discard()
            exception.printStackTrace()
          }
        } finally {
          if (pipeline != null) {
            jedis.close()
          }
          if (jedis != null) {
            jedis.close()
          }
        }
      }
    })
    ssc.start()
    ssc.awaitTermination()
  }
}

Jedis连接池 

package com.ws.sparkstreaming.utils

import redis.clients.jedis.{JedisPool, JedisPoolConfig}

object JedisPool {
  val config = new JedisPoolConfig()
  config.setMaxTotal(20)
  config.setMaxIdle(10)
  config.setTestOnBorrow(true)
  val pool = new JedisPool(config, "dream1", 6379, 10000)
  def getConnection() = {
    pool.getResource
  }
}

 Jedis读取偏移量

package com.ws.sparkstreaming.utils

import java.sql.Connection
import java.util

import org.apache.kafka.common.TopicPartition
import org.apache.spark.streaming.kafka010.OffsetRange

import scala.collection.mutable

object OffsetUtils {

  def selectOffsetFromRedis(appname: String, goupId: String): Map[TopicPartition, Long] = {
    val jedis = JedisPool.getConnection()
    jedis.select(1)
    val kvs: util.Map[String, String] = jedis.hgetAll(appname + "_" + goupId)
    import scala.collection.JavaConversions._
    val result = new mutable.HashMap[TopicPartition, Long]()
    for (kv<-kvs){
      val k = kv._1
      val offset = kv._2
      val topic = k.split("_")(0)
      val partition = k.split("_")(1).toInt
      val tp = new TopicPartition(topic, partition)
      result(tp)= offset.toLong
    }
    result.toMap
  }
}

 

Kafka+Spark Streaming+Redis Spark streaming实时读取kafka中数据完成wordcount并写入redis中 集群或虚拟机提前安装好spark、kafka和redis windows环境安装好scala 用idea创建maven工程 spark版本2.2.0 pom文件内容如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" ... 阅读详情

相关推荐

Spark读取kafka数据进行wordCount存入Redis

Spark读取kafka数据进行wordCount存入Redis 依赖 <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.1.2</versio

weixin_45264992的博客 308

redis scala编程之创建连接

导入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.0.0</version> </dependency> 测试代码 private def jedisTest(): Unit = { val jedis = ne

鸭梨的博客 616

vivado2020.2安装教程:Windows平台完整指南

手把手带你完成vivado2020.2安装教程,覆盖下载、配置到验证全过程,解决常见安装问题,确保在Windows平台顺利部署开发环境,适合初学者快速上手。

weixin_42607969的博客 1347

kafka数据缓存到redis的全路径操作流程

第一步:配置redis客户端 spark中配置redis客户端的代码参考:   import org.apache.commons.pool2.impl.GenericObjectPoolConfig import redis.clients.jedis.JedisPool   object RedisClient extends Serializable {   val redis...

u014156013的博客 2404

用5毫欧采样电阻实现高精度电流检测?数字可调电源控制板的硬件设计陷阱

本文深入探讨了在数字可调电源控制板设计中,如何利用5毫欧采样电阻实现高精度电流检测。从微小信号放大电路设计、采样电阻布局与热管理,到电源切换与电池管理电路优化,提供了全面的硬件设计解决方案和实用技巧,帮助工程师规避常见设计陷阱,提升系统性能。

wdx0123456的博客 1031

YOLOV8多模态(可见光+红外光目标检测任务,基于Ultralytics官方代码实现)

torch 2.3.1 torchvision 0.18.1 Python 3.8.19 tensorrt 8.5.3.1DroneVehicle数据集下载地址DroneVehicle 数据集由无人机采集的 56,878 张图像组成,其中一半是 RGB 图像,其余是红外图像。我们为这 5 个类别制作了丰富的注释,其中包含定向边界框。其中,汽车在 RGB 图像中有 389,779 个注释,在

Mjy的博客 7585

spark streaming 结合kafka 精确消费一次将结果保存到redis

spark streaming 结合kafka 精确消费一次到redis 1. 环境 scala 2.12.12 jdk 1.8 idea 2020.1 maven 3.6.3 spark 3.0.1 kafka 0.10 hadoop 3.2.1 hbase 2.2.5 (另外一个明细数据幂等处理,保存到habse) redis 5.0 pom <!-- 定义了一些常量 --> <properties> <maven.compiler.source

xiaohu21的博客 1216

手把手教你搞定6脚三位一体数码管的驱动(附C语言源码与Visual Studio调试技巧)

本文详细解析了6脚三位一体数码管的驱动原理与实战技巧,包括引脚复用、动态扫描时序、Visual Studio模拟调试及单片机实现。通过C语言源码示例和调试技巧,帮助开发者快速掌握非标准数码管的驱动方法,提升硬件开发效率。

weixin_30613727的博客 592

spark streaming 结合kafka 精确消费一次将结果保存到hbase

spark streaming 结合kafka 精确消费一次将结果保存到hbase 1. 环境 scala 2.12.12 jdk 1.8 idea 2020.1 maven 3.6.3 spark 3.0.1 kafka 0.10 hadoop 3.2.1 hbase 2.2.5 (另外一个明细数据幂等处理,保存到habse) redis 5.0 pom <!-- 定义了一些常量 --> <properties> <maven.compiler.s

xiaohu21的博客 1119

MDIO接口协议与其详解——单片机

在单片机领域,通过MDIO接口可以与外部设备进行通信,实现对设备的控制和数据的读写。通过本文的介绍,你可以了解到MDIO接口协议的原理和使用方法,并参考源代码示例进行实际的开发和应用。具体的初始化方法与单片机的型号和开发环境有关,可以参考相应的单片机手册和开发工具的文档。(1)发送读取命令:向MDIO线发送读取命令,通常是发送一个特定的控制字节,用于指示要读取的寄存器地址。(1)发送写入命令:向MDIO线发送写入命令,通常是发送一个特定的控制字节,用于指示要写入的寄存器地址。二、MDIO接口协议使用方法。

web_class282的博客 2626

CentOS 7 Linux yum 安装 Docker,解决 Docker 镜像拉取失败问题

本文详细介绍了在 CentOS 7 系统上通过 yum 安装 Docker 的完整流程,包括卸载旧版本、配置阿里云国内镜像源、安装 Docker 及其组件、设置日志限制等关键步骤。针对国内用户常见的 Docker 镜像拉取失败问题,提供了两种实用解决方案:配置镜像加速器或通过代理访问官方源,并附带验证方法与排错指南,帮助读者高效完成 Docker 环境部署。

寒水馨 · 轻量级技术文档 · hanshuixin.org 1718

Spark-Streaming缓存计算结果,Wordcount累加求和

一 updateStateByKey 函数声明: def updateStateByKey[S: ClassTag]( updateFunc: (Seq[V], Option[S]) => Option[S]): DStream[(K, S)] 需求:对上次计算的结果进行缓存,在应用重启后,加载上次计算的结果,这里从scoket中读取流数据 在这里插入代...

Master_chaoAndQi的博客 1210

fasterlio原理及代码框架梳理

Faster-LIO 的优势是在保持同等高精度的前提下,显著提升计算效率,以支持更极端的应用场景(如高速无人机)和更廉价的硬件平台。可以把 Faster-LIO 理解为用一把更快的“空间哈希筛子”(iVox)替换了原来精细的“动态平衡树”(ikd-Tree),从而在精度损失极小的情况下,实现了效率的显著提升。:只在实际有地图点的空间区域动态创建和保留体素单元,形成一个稀疏的体素地图。是关键:将去畸变点云中的每个点,在 iVox 维护的局部地图中搜索近邻(如5个最近点),构建点到面的距离残差。

Studying…… 246

Storm编程之wordcount(kafka--》Jstorm--》redis)

本文是笔者这周闲来无事做的一个小小的尝试。 设计的软件比较多,大家可以一一在本机安装一下,我的电脑是mac pro,基本安装起来和Linux基本一致,比较简单 基本都是下载 解压包 拷贝到安装目录重命名 然后启动服务 需要安装的基本有 JDK1.7,IDEA,kafka,Jstorm,redis都是单机 下面直接给出项目的pom.xml配置信息: <project xmlns="http:

zfszhangyuan的博客 3325

HQChart实战教程49-点击修改K线颜色及背景色

HQChart实战教程49-点击修改K线颜色及背景色需求效果图步骤1. 注册点击监听事件2. 修改K颜色添加一个自定义颜色的K线klineoption清空所有自定义颜色的K线option交流QQ群: 950092318HQChart代码地址完整例子 需求 对点击的K线修改颜色。 效果图 步骤 1. 注册点击监听事件 事件ID JSCHART_EVENT_ID.ON_CLICK_CHART_PAINT, 注册监听事件见教程 HQChart使用教程5- K线图控件操作函数说明 this.Create=func

小银 2911

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

运行wordcount自带实例(详述)

先确定你的hadoop集群已经启动(这很重要) 进入hadoop的mapreduce目录下: cd /opt/module/hadoop/share/hadoop/mapreduce 这个就是一会儿要运行的wordcount文件: 在当前目录下新建一个文件夹test:mkdir test 新建一个计数文件file.txt:touch file.txt 打开file.txt并随意给些字符:v...

weixin_44023894的博客 6467

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

使用sparkStreaming与Kafka直连方式WordCount,使用redis存放中间结果

1、maven的pom.xml文件,添加jedis依赖 &amp;lt;!-- redis--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;redis.clients&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jedis&

Lu_Xiao_Yue的博客 1366

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

kafka常用命令&&flume和kafka整合&&用spark消费kafka中的数据实现wordcount&&将处理好的数据存到redis中

1,前台启动kafka:  ./kafka-server-start.sh ../config/server.properties 2,后台启动kafka:     ./kafka-server-start.sh ../config/server.properties 1&gt;/dev/null 2&gt;&amp;1 &amp; 3,查看当前服务器的所有的topic:    ./kafka...

筑梦人的博客 835

Hadoop之WordCount实战详解

WorldCount可以说是MapReduce中的helloworld了,单词计数主要完成的功能是:统计一系列文本文件中每个单词出现的次数,通过完成这个简单程序让读者摸清 MapReduce 程序的基本结构。 特别是对于每一个阶段的函数执行所产生的键值对。这里对MapReduce过程原理不过多说明。 环境说明 CentOS 7 Hadoop 2.7.5 JDK 1.8 IDE是IDEA+Gr...

charming的专栏 6397

storm-redis 详解

                                    多的不说,先来代码分析,再贴我自己写的代码。如果代码有错误,求更正。。导入两个关键包,其他项目需要的包,大家自己导入了,我pom下的包太多,不好一下扔上来。&lt;dependency&gt; &lt;groupId&gt;org.apache.storm&lt;/groupId&gt; ...

分享大数据、java相关的技术 2032

flink(四) sink

一 。Sink源 1 官网提供的连接器 在这里插入图片描述 2 bahir提供的连接器 (更新速度落后版本 现在我用的scala 2.12 现在最新的是2.11 在引入的时候会与 自己重新ProcessFunction(会有冲突注 需要用哪个 就 使用哪个就行 这里我继承这个函数主要是为了实现 sideoutput 就是分流 因为在flink 1.12 中 split 和 select 已经移除了) 3 自定应sink 二 代码示例: import java.sql.{Connection, Drive

newbrid007的博客 335

JAVA--词频统计wordcount的实现

词频统计需求: 1.要求统计出一个文件中的所有英文词组,以非英文字母为分隔符(这里以空格为例)。 2.要求统计结果在控制台输出,并将统计的结果存入mysql数据库和redis数据库中。 3.要求以Map键值对的方式进行存储,不区分大小写(可以先将内容全部转为大写,或者全部转为小写实现不区分大小写) 4.以字典的形式进行排序     词频统计: package wordcount;...

super-yong的博客 3397

Flume+Kafka+Storm+Redis流计算实现wordcount示例

Flume+Kafka+Storm+Redis流计算实现wordcount示例 一、前言 本文采用Flume、kafka、storm、redis来实现一个流计算的wordcount的小案例。 集群机器为server01,server02,server03。 3台机器上同时执行生成数据的python脚本,Flume的采集程序,zookeeper集群,kafka集群 在server01上...

Widsom的博客 1468

spark streaming实时流式处理wordcount,数据写出到redis

Spark Streaming是spark的一个组件,可以对实时流式数据进行数据处理,数据的基本操作对象是DStream.DStream是一系列的RDDs。这个对象将流式的数据按时间切分为一系列的rdd的数据文件。然后就对数据进行处理。rdd=DStrema At Batch Time。   思想:创建对象ssc,实时读取文件,处理,输出结果写出到redis(建立连接redis) 可以设计到

自由幻想的博客 5340

大数据项目之Kafka&Spark streaming&Redis:WordCount

一.项目目的 实时在线单词字数统计 二.项目流程 kafka生产数据源,spark streaming采集数据源并进行处理后存储在Redis中 三.项目操作 3.1 Kafka准备 3.1.1 创建topic:zpark 过程:在kafka的bin目录下 ./kafka-topics.sh --zookeeper hdp-1:2181 --create --topi...

FreedomZzzzz的博客 539

几种方式实现WordCount

精简的Shell cat /home/sev7e0/access.log | tr -s ' ' '\n' | sort | uniq -c | sort -r | awk '{print $2, $1}' #cat 命令一次性展示出文本内容 #tr -s ' ' '\n' 将文本中空格使用回车键替换 #sort 串联排序所有指...

weixin_33778778的博客 432
上一篇: sparkStream-wordCount实现exactlyOne第一种--Mysql
下一篇: phoenix 处理hbase存的double类型数据显示为负数
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值