kafka+sparkstreaming wordcount

本文详细介绍如何从零开始搭建Kafka集群,并通过具体步骤指导如何运行Spark Streaming中的KafkaWordCount示例程序,包括配置环境、创建Topic、发送与接收消息等关键环节。

概要

Spark应用开发实践性非常强,很多时候可能都会将时间花费在环境的搭建和运行上,如果有一个比较好的指导将会大大的缩短应用开发流程。Spark Streaming中涉及到和许多第三方程序的整合,源码中的例子如何真正跑起来,文档不是很多也不详细。

本篇主要讲述如何运行KafkaWordCount,这个需要涉及Kafka集群的搭建,还是说的越仔细越好。

搭建Kafka集群

步骤1:下载kafka 0.8.1及解压

wget https://www.apache.org/dyn/closer.cgi?path=/kafka/0.8.1.1/kafka_2.10-0.8.1.1.tgz
tar zvxf kafka_2.10-0.8.1.1.tgz
cd kafka_2.10-0.8.1.1

步骤2:启动zookeeper

bin/zookeeper-server-start.sh config/zookeeper.properties

步骤3:修改配置文件config/server.properties,添加如下内容

host.name=localhost

# Hostname the broker will advertise to producers and consumers. If not set, it uses the
# value for "host.name" if configured.  Otherwise, it will use the value returned from
# java.net.InetAddress.getCanonicalHostName().
advertised.host.name=localhost

步骤4:启动Kafka server

bin/kafka-server-start.sh config/server.properties

步骤5:创建topic

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1  --topic test

检验topic创建是否成功

bin/kafka-topics.sh --list --zookeeper localhost:2181

如果正常返回test

步骤6:打开producer,发送消息

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test 
##启动成功后,输入以下内容测试
This is a message
This is another message

 步骤7:打开consumer,接收消息

bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
###启动成功后,如果一切正常将会显示producer端输入的内容
This is a message
This is another message

运行KafkaWordCount

KafkaWordCount源文件位置 examples/src/main/scala/org/apache/spark/examples/streaming/KafkaWordCount.scala

尽管里面有使用说明,见下文,但如果不是事先对Kafka有一定的了解的话,决然不知道这些参数是什么意思,也不知道该如何填写

/**
 * Consumes messages from one or more topics in Kafka and does wordcount.
 * Usage: KafkaWordCount    
 *    is a list of one or more zookeeper servers that make quorum
 *    is the name of kafka consumer group
 *    is a list of one or more kafka topics to consume from
 *    is the number of threads the kafka consumer should use
 *
 * Example:
 *    `$ bin/run-example \
 *      org.apache.spark.examples.streaming.KafkaWordCount zoo01,zoo02,zoo03 \
 *      my-consumer-group topic1,topic2 1`
 */
object KafkaWordCount {
  def main(args: Array[String]) {
    if (args.length < 4) {
      System.err.println("Usage: KafkaWordCount    ")
      System.exit(1)
    }

    StreamingExamples.setStreamingLogLevels()

    val Array(zkQuorum, group, topics, numThreads) = args
    val sparkConf = new SparkConf().setAppName("KafkaWordCount")
    val ssc =  new StreamingContext(sparkConf, Seconds(2))
    ssc.checkpoint("checkpoint")

    val topicpMap = topics.split(",").map((_,numThreads.toInt)).toMap
    val lines = KafkaUtils.createStream(ssc, zkQuorum, group, topicpMap).map(_._2)
    val words = lines.flatMap(_.split(" "))
    val wordCounts = words.map(x => (x, 1L))
      .reduceByKeyAndWindow(_ + _, _ - _, Minutes(10), Seconds(2), 2)
    wordCounts.print()

    ssc.start()
    ssc.awaitTermination()
  }
}

讲清楚了写这篇博客的主要原因之后,来看一看该如何运行KafkaWordCount

步骤1:停止运行刚才的kafka-console-producer和kafka-console-consumer

步骤2:运行KafkaWordCountProducer

bin/run-example org.apache.spark.examples.streaming.KafkaWordCountProducer localhost:9092 test 3 5

解释一下参数的意思,localhost:9092表示producer的地址和端口, test表示topic,3表示每秒发多少条消息,5表示每条消息中有几个单词

步骤3:运行KafkaWordCount

 bin/run-example org.apache.spark.examples.streaming.KafkaWordCount localhost:2181 test-consumer-group test 1

解释一下参数, localhost:2181表示zookeeper的监听地址,test-consumer-group表示consumer-group的名称,必须和$KAFKA_HOME/config/consumer.properties中的group.id的配置内容一致,test表示topic,1表示线程数。

<think>我们正在处理关于Kafka2.12版本与SparkStreaming整合的问题。根据引用内容,我们需要关注以下几点:1.根据引用[2],SparkStreamingKafka整合需要引入对应的jar包,根据Kafka版本选择分支:spark-streaming-kafka-0-8和spark-streaming-kafka-0-10。而Kafka2.12版本指的是Scala版本(Kafka客户端是用Scala编写的,2.12表示Scala的版本),实际上Kafka的版本是0.10.x或更高(如1.x,2.x等)。因此,我们需要确定Kafka的具体版本(比如0.10.x,0.11.x,1.x,2.x等)来选择对应的jar包。2.引用[3]提到,SparkStreaming集成Kafka0.10较为简单,并且Kafka分区和Spark分区之间是1:1对应关系。3.引用[4]给出了一个提交SparkStreaming任务的命令示例,其中指定了主类和jar包。但是,用户的问题中明确提到“Kafka2.12版本”,这里需要澄清:Kafka的版本号通常由两部分组成,例如kafka_2.12-2.4.0,其中2.12是Scala版本,2.4.0是Kafka的版本。因此,我们需要知道Kafka的具体版本(如2.4.0)来确定使用哪个spark-streaming-kafka集成包。根据Spark官方文档,SparkStreamingKafka的集成方式如下:-对于Kafka0.8版本,使用spark-streaming-kafka-0-8-对于Kafka0.10及以上版本,使用spark-streaming-kafka-0-10由于Kafka2.12通常指的是Scala2.12编译的Kafka,而Kafka版本可能是0.10.2.0、2.4.0等。因此,我们假设用户使用的是较新的Kafka版本(如0.10或以上),那么应该使用spark-streaming-kafka-0-10。步骤:1.添加依赖:在项目中引入spark-streaming-kafka-0-10_2.12(注意:这里的2.12是Scala版本,需要与项目中使用的Scala版本一致,并且与Spark的Scala版本一致)。2.编写代码:使用DirectAPI(推荐)来消费Kafka数据。3.配置参数:设置Kafka消费者的相关参数(如bootstrap.servers,group.id,key.deserializer,value.deserializer,auto.offset.reset等)。4.提交任务:使用spark-submit提交应用程序,并确保包含spark-streaming-kafka-0-10_2.12依赖。下面是一个具体的步骤和示例代码:第一步:添加依赖(以Maven为例)```xml<dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming-kafka-0-10_2.12</artifactId><version>${spark.version}</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>${spark.version}</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.12</artifactId><version>${spark.version}</version></dependency>```注意:将${spark.version}替换为相应的Spark版本,如3.0.0。第二步:编写SparkStreaming代码(使用DirectAPI)```scalaimportorg.apache.kafka.clients.consumer.ConsumerConfigimportorg.apache.kafka.common.serialization.StringDeserializerimportorg.apache.spark.SparkConfimportorg.apache.spark.streaming._importorg.apache.spark.streaming.kafka010._objectKafkaSparkStreamingDemo{defmain(args:Array[String]):Unit={//创建StreamingContext,批次间隔5秒valconf=newSparkConf().setAppName("KafkaSparkStreaming").setMaster("local[*]")valssc=newStreamingContext(conf,Seconds(5))//配置Kafka参数valkafkaParams=Map[String,Object](ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG->"localhost:9092",ConsumerConfig.GROUP_ID_CONFIG->"spark-streaming-group",ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG->classOf[StringDeserializer],ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG->classOf[StringDeserializer],ConsumerConfig.AUTO_OFFSET_RESET_CONFIG->"latest",ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG->(false:java.lang.Boolean))//要消费的主题valtopics=Array("topic1")//创建DStreamvalstream=KafkaUtils.createDirectStream[String,String](ssc,LocationStrategies.PreferConsistent,ConsumerStrategies.Subscribe[String,String](topics,kafkaParams))//处理每条消息vallines=stream.map(record=>record.value)valwords=lines.flatMap(_.split(""))valwordCounts=words.map(word=>(word,1)).reduceByKey(_+_)//输出结果wordCounts.print()//启动流计算ssc.start()ssc.awaitTermination()}}```第三步:提交任务使用spark-submit提交任务,注意指定主类和jar包,以及相关的依赖。如果使用--packages选项,可以自动下载依赖:```spark-submit--masteryarn\--deploy-modecluster\--classcom.example.KafkaSparkStreamingDemo\--packagesorg.apache.spark:spark-streaming-kafka-0-10_2.12:3.0.0\/path/to/your-application.jar```或者,如果已经将依赖打包到uberjar中,则不需要--packages。注意事项:1.确保Spark版本和Kafka集成包的版本兼容。2.根据实际Kafka集群地址修改bootstrap.servers。3.根据需求调整消费者组ID(group.id)和偏移量重置策略(auto.offset.reset)。引用说明:[^2]提到了根据Kafka版本选择jar包分支的原则。[^3]提供了使用DirectAPI的简要说明。[^4]给出了提交任务的命令示例。因此,针对用户的问题,我们给出了使用Kafka0.10及以上版本(对应Scala2.12)的整合步骤。相关问题:1.SparkStreaming整合Kafka时如何管理偏移量?2.如何提高SparkStreaming消费Kafka数据的并行度?3.SparkStreaming整合Kafka时有哪些调优参数?</think>### 使用 Kafka 2.12 提交 Spark Streaming 任务的配置和步骤 #### 核心配置项 1. **依赖管理** 在项目构建文件(如 Maven/SBT)中添加对应版本的依赖: ```xml <!-- Maven 示例 --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>3.3.0</version> <!-- Spark 版本需匹配 --> </dependency> ``` **关键说明**: - `spark-streaming-kafka-0-10`:适用于 Kafka 0.10.x 及更高版本 - `_2.12`:Scala 2.12 版本(Kafka 2.12 即 Scala 2.12 编译版本)[^2][^3] 2. **Kafka 参数配置** ```scala val kafkaParams = Map[String, Object]( "bootstrap.servers" -> "kafka-server:9092", // Kafka 集群地址 "key.deserializer" -> classOf[StringDeserializer], "value.deserializer" -> classOf[StringDeserializer], "group.id" -> "spark-streaming-group", "auto.offset.reset" -> "latest", // 偏移量重置策略 "enable.auto.commit" -> (false: java.lang.Boolean) // 禁用自动提交 ) ``` **必选参数**:`bootstrap.servers`, `key.deserializer`, `value.deserializer`[^1] 3. **创建 Direct Stream** ```scala import org.apache.spark.streaming.kafka010._ val topics = Array("input-topic") val stream = KafkaUtils.createDirectStream[String, String]( streamingContext, LocationStrategies.PreferConsistent, // 分区分配策略 ConsumerStrategies.Subscribe[String, String](topics, kafkaParams) ) ``` Kafka 分区与 Spark 分区保持 1:1 映射关系[^3] #### 完整步骤示例(WordCount) ```scala import org.apache.spark.streaming._ import org.apache.spark.streaming.kafka010._ val conf = new SparkConf().setAppName("Kafka2Spark") val ssc = new StreamingContext(conf, Seconds(5)) // 1. Kafka 配置 val kafkaParams = Map( "bootstrap.servers" -> "kafka1:9092,kafka2:9092", "key.deserializer" -> classOf[StringDeserializer], "value.deserializer" -> classOf[StringDeserializer], "group.id" -> "wordcount-group", "auto.offset.reset" -> "earliest" ) // 2. 创建数据流 val topics = Set("text-topic") val messages = KafkaUtils.createDirectStream[String, String]( ssc, LocationStrategies.PreferConsistent, ConsumerStrategies.Subscribe[String, String](topics, kafkaParams) ) // 3. 数据处理 val words = messages.map(_.value).flatMap(_.split(" ")) val wordCounts = words.countByValue() // 4. 结果输出 wordCounts.print() ssc.start() ssc.awaitTermination() ``` #### 任务提交命令 ```bash spark-submit \ --master yarn \ --deploy-mode cluster \ --class com.example.KafkaStreamingApp \ --packages org.apache.spark:spark-streaming-kafka-0-10_2.12:3.3.0 \ /path/to/your-app.jar ``` **关键参数**: - `--packages`:自动下载 Kafka 集成依赖 - Scala 版本需与 Kafka 依赖的 `2.12` 后缀匹配[^2][^4] #### 注意事项 1. **偏移量管理**:需手动管理偏移量(如保存到 Zookeeper 或数据库) 2. **版本兼容性**: - Spark 3.x 推荐 Kafka Client 2.8.0+ - Scala 版本必须一致(如 `_2.12`) 3. **性能优化**: ```scala conf.set("spark.streaming.kafka.maxRatePerPartition", "1000") // 每分区消费速率 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值