Spark-Streaming整合Kafka实现wordcount

Spark Streaming连接Kafka进行词频统计
该博客介绍了如何使用Spark Streaming从Kafka获取数据并进行词频统计。配置了Spark 2.3.4、Kafka 2.10和Scala 2.11的版本,并提供了创建Maven工程的POM文件配置。在代码中,创建了Spark Streaming上下文,通过KafkaUtils创建直接流连接到Kafka,订阅主题并进行数据处理。在运行时,需要注意Scala环境的配置以及确保所有依赖正确。最后,展示了如何启动生产者发送数据到Kafka,以及消费者端的运行结果。

配置版本信息:spark-2.3.4,Kafka-2.10,Scala-2.11,JDK8

1.创建Maven工程

配置Pom文件

	<properties>
        <spark.version>2.3.4</spark.version>
        <kafka.version>2.1.0</kafka.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>${kafka.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>
    </dependencies>

连接Kafka并进行词频统计


import org.apache.kafka.clients.consumer.{ConsumerConfig, ConsumerRecord}
import org.apache.spark.streaming.dstream.{DStream, InputDStream}
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Duration, Seconds, StreamingContext}

object SSKafka_Direct {
  def main(args: Array[String]): Unit = {
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("streaming")
    val ssc = new StreamingContext(sparkConf,Duration(10000))  //采集周期10s
    //TODO SparkStreaming读取Kafka的数据
    //kafka配置信息
    val kafkaPara: Map[String, Object] = Map[String, Object](
      //zookeeper地址	
      ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> "slaver1:9092,slaver2:9092,slaver3:9092",
      ConsumerConfig.GROUP_ID_CONFIG -> "app",
      "key.deserializer" -> "org.apache.kafka.common.serialization.StringDeserializer",
      "value.deserializer" -> "org.apache.kafka.common.serialization.StringDeserializer"
    )

    val kafkaDStream: InputDStream[ConsumerRecord[String, String]] =
      KafkaUtils.createDirectStream[String, String](
        ssc,
        LocationStrategies.PreferConsistent,
        //订阅的topic名kafka_spark
        ConsumerStrategies.Subscribe[String, String](Set("kafka_spark"), kafkaPara))
    val valueDStream: DStream[String] = kafkaDStream.map(record=>record.value())
    valueDStream.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).print()

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

注1new不出Scala文件
1.检查是否安装了Scala插件
2.检查是否将目录设置为source
3.检查是否导入scala JDK,在projectStructure—>Modules—>Dependencies中+—>Libraray—>scalaSDK
注2在运行的时候报错:找不到或者加载不到主类
版本不兼容,使用上文提供的POM文件即可解决

2.创建生产者,发送数据

依次启动zookeeper,Hadoop,Kafka,spark
创建topic,生产者

kafka-topics.sh --create --zookeeper slaver1:2181 --replication-factor 1 --partitions 3 --topic kafka_spark
kafka-console-producer.sh --broker-list slaver1:9092 --topic  kafka_spark

启动程序,在消费者端口输入单词,运行结果如下:
在这里插入图片描述

<think>首先,用户的问题是:“spark-streaming”,这似乎是关于Spark Streaming的,但信息不完整。用户可能是在询问Spark Streaming的基本概念、用法或其他方面。由于用户说“请使用中文回答问题”,我需要用中文回复。 用户指令强调:在回答完问题后,必须根据用户的问题及我的回答提出3-5个相关问题。相关问题必须以“§§相关问题§§”开头,并输出在末尾。禁止换行分散,意思是整个输出要连贯。 示例格式显示:先回答问题,然后代码块(如果有),然后是“§§相关问题§§”后跟问题列表。 用户的问题是“spark-streaming”,这可能是一个拼写错误或简写,应该是“Spark Streaming”。Spark Streaming是Apache Spark的一个组件,用于实时流处理。 由于用户没有指定具体问题,我假设他们在问Spark Streaming的基本介绍。我应该提供一个简洁的概述。 我的回答结构: 1. 回答问题:用中文解释Spark Streaming是什么。 2. 如果需要,提供代码示例(如示例中所示)。 3. 最后,以“§§相关问题§§”开头,提出3-5个相关问题。 相关问题必须基于用户的问题和我的回答。用户的问题是“spark-streaming”,所以我需要提出相关问题。 可能的回答内容: - 定义Spark Streaming- 简要描述其工作原理。 - 可能提供一个简单的代码示例(如用Python或Scala),因为示例中有代码块。 示例格式中有一个Python代码块,所以我应该包括一个简单的Spark Streaming代码示例。 在Spark Streaming中,常见的代码是用Scala或Python写的。例如,一个简单的WordCount示例。 确保所有内容用中文。 步骤: 1. 回答:解释Spark Streaming。 2. 提供代码示例(可选,但示例中有)。 3. 结束于“§§相关问题§§”后跟问题列表。 相关问题:3-5个,基于主题。例如: - Spark Streaming与其他流处理框架的比较。 - 如何设置Spark Streaming- 常见用例。 - 优化技巧等。 最后,输出必须是连贯的,没有不必要的换行。 草拟回答: - 开头:Spark Streaming是Apache Spark的一个扩展,用于实时数据处理... - 代码:用Python写一个简单的Spark Streaming应用。 - 然后:§§相关问题§§ 1. 第一个问题 2. 第二个 3. 第三个 确保代码块正确格式化。在Markdown中,用三个反引号包围代码。 完整输出: 用户的问题:spark-streaming 我的回答:Spark Streaming 是 Apache Spark 的一个组件,用于处理实时数据流。它允许开发人员使用类似批处理的API来处理流数据,支持高吞吐量和容错性。 然后代码示例: ```python from pyspark.streaming import StreamingContext # 创建StreamingContext,每1秒批处理间隔 ssc = StreamingContext(sparkContext, 1) # 创建一个DStream,监听localhost:9999 lines = ssc.socketTextStream("localhost", 9999) # 分割每行成单词 words = lines.flatMap(lambda line: line.split(" ")) # 计数每个单词 pairs = words.map(lambda word: (word, 1)) wordCounts = pairs.reduceByKey(lambda x, y: x + y) # 打印结果 wordCounts.pprint() ssc.start() # 启动计算 ssc.awaitTermination() # 等待计算终止 ``` 然后:§§相关问题§§ 1. Spark StreamingKafka 如何集成? 2. 如何处理 Spark Streaming 中的故障恢复? 3. Spark Streaming 的微批处理模式是什么? 4. 有哪些常见的 Spark Streaming 用例? 我需要确保有3-5个问题。 现在,用中文写所有内容。</think>Spark Streaming 是 Apache Spark 的一个扩展模块,专门用于处理实时数据流。它采用微批处理(Micro-Batching)架构,将连续的数据流分割成小批次,然后使用 Spark 的批处理引擎进行处理。这允许开发者使用熟悉的 DataFrame 或 RDD API 来实现高吞吐、低延迟的流式应用,并支持容错性和 Exactly-Once 语义。核心概念包括 DStream(Discretized Stream),它代表一个连续的数据序列,通过转换操作(如 `map`、`reduceByKey`)进行处理。Spark Streaming 常用于日志分析、实时监控和事件处理等场景。 以下是一个简单的 Python 代码示例,展示如何使用 Spark Streaming 实现一个基本的单词计数应用(需要先启动一个本地 Socket 服务器): ```python from pyspark import SparkContext from pyspark.streaming import StreamingContext # 初始化 SparkContext 和 StreamingContext(批处理间隔为1秒) sc = SparkContext("local[2]", "SparkStreamingExample") ssc = StreamingContext(sc, 1) # 创建一个 DStream,监听本地端口 9999 lines = ssc.socketTextStream("localhost", 9999) # 处理数据流:分割单词并计数 words = lines.flatMap(lambda line: line.split(" ")) pairs = words.map(lambda word: (word, 1)) word_counts = pairs.reduceByKey(lambda a, b: a + b) # 打印结果 word_counts.pprint() # 启动流处理 ssc.start() ssc.awaitTermination() # 等待终止 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值