kafka实现wordcount并实现累加操作

本文介绍如何使用Apache Spark Streaming和Kafka进行实时流处理,实现WordCount应用。通过创建Kafka生产者发送消息,并利用Spark Streaming消费这些消息,进行单词频率统计。代码示例展示了如何配置Spark和Kafka,以及如何实现数据流处理和状态更新。

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

先在kafka输入下列命令充当生产者
   ./bin/kafka-console-producer.sh  --broker-list 192.168.147.133:9092,192.168.147.134:9092,192.168.147.135:9092 --topic test034
下列代码当消费者
package day14
import org.apache.spark.streaming.dstream.ReceiverInputDStream
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Duration, Seconds, StreamingContext}

/**
  * Kafka的receive方式实现WC
  * receive
  * 1.重点:首先会以DStream中的数据进行按key做reduce操作,然后再对各个批次的数据进行累加
     2.updateStateByKey 方法中
updateFunc就要传入的参数,他是一个函数。Seq[V]表示当前key对应的所有值,Option[S] 是当前key的历史状态,返回的是新的
  */
object KafkaWC {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("wordcount").setMaster("local[2]")
    val ssc = new StreamingContext(conf,Seconds(3))
    val zks="192.168.147.133:2181"
    ssc.checkpoint("hdfs://spark01:9000/aaaa")
   /* val prop = new Properties
    prop.put("auto.offset.reset","smallest");*/

    //消费者组
    val groupId: String ="gp1"
    //Topic的名字 Map的key是topic名字,第二参数是线程数
    val topics: Map[String, Int] =Map[String,Int]("test04"->1)
    //获取到的数据是键值对的格式(key,value)
    //获取到的数据 key是偏移量,value是数据
    val data: ReceiverInputDStream[(String,String)] = KafkaUtils.createStream(ssc,zks,groupId,topics)
    //接下来开始处理数据
    val lines = data.flatMap(_._2.split(" "))
    val words = lines.map((_,1))
    words.updateStateByKey( (currValues:Seq[Int],preValue:Option[Int]) =>{
    var currValueSum = 0
    for(currValue <- currValues) {
      currValueSum += currValue
    }
      Some(currValueSum + preValue.getOrElse(0))
    }).print(50)   //    默认10条  ,加参数可设置打印条数
   // val result = words.reduceByKey(_+_)
    //words.updateStateByKey[Int](result,
      //new HashPartitioner(ssc.sparkContext.defaultParallelism), true, data))
     // result.print()
      ssc.start()
      ssc.awaitTermination()
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值