0


2023_Spark_实验二十五:SparkStreaming读取Kafka数据源:使用Direct方式

SparkStreaming读取Kafka数据源:使用Direct方式

一、前提工作

  • 安装了zookeeper
  • 安装了Kafka
  • 实验环境:kafka + zookeeper + spark
  • 实验流程

二、实验内容

实验要求:实现的从kafka读取实现wordcount程序

启动zookeeper

  1. zk.sh start
  2. # zk.sh脚本 参考教程 https://blog.csdn.net/pblh123/article/details/134730738?spm=1001.2014.3001.5502

启动Kafka

  1. kf.sh start
  2. # kf.sh 参照教程 https://blog.csdn.net/pblh123/article/details/134730738?spm=1001.2014.3001.5502

(测试用,实验不做)创建Kafka主题,如test,可参考:Kafka的安装与基本操作

--topic 定义topic名

--replication-factor 定义副本数

--partitions 定义分区数

--bootstrap-server 连接的Kafka Broker主机名称和端口号

--create 创建主题

--describe 查看主题详细描述

  1. # 创建kafka主题测试
  2. /opt/module/kafka_2.12-3.0.0/bin/kafka-topics.sh --create --bootstrap-server hd1:9092 --replication-factor 3 --partitions 1 --topic gnutest2
  3. # 再次查看first主题的详情
  4. /opt/module/kafka_2.12-3.0.0/bin/kafka-topics.sh --bootstrap-server hd1:9092 --describe --topic gnutest2

启动Kafka控制台生产者,可参考:Kafka的安装与基本操作

  1. # 创建kafka生产者
  2. /opt/module/kafka_2.12-3.0.0/bin/kafka-console-producer.sh --bootstrap-server hd1:9092 --topic gnutest2

创建maven项目

添加kafka依赖

  1. <!--- 添加streaming依赖 --->
  2. <dependency>
  3. <groupId>org.apache.spark</groupId>
  4. <artifactId>spark-streaming_2.13</artifactId>
  5. <version>${spark.version}</version>
  6. </dependency>
  7. <!--- 添加streaming kafka依赖 --->
  8. <dependency>
  9. <groupId>org.apache.spark</groupId>
  10. <artifactId>spark-streaming-kafka-0-10_2.13</artifactId>
  11. <version>3.4.1</version>
  12. </dependency>

编写程序,如下所示:

  1. package exams
  2. import org.apache.kafka.common.serialization.StringDeserializer
  3. import org.apache.spark.SparkContext
  4. import org.apache.spark.sql.SparkSession
  5. import org.apache.spark.streaming.dstream.DStream
  6. import org.apache.spark.streaming.kafka010._
  7. import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
  8. import org.apache.spark.streaming.{Seconds, StreamingContext}
  9. import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
  10. import java.lang
  11. /**
  12. * @projectName SparkLearning2023
  13. * @package exams
  14. * @className exams.SparkStreamingReadKafka
  15. * @description ${description}
  16. * @author pblh123
  17. * @date 2023/12/1 15:19
  18. * @version 1.0
  19. *
  20. */
  21. object SparkStreamingReadKafka {
  22. def main(args: Array[String]): Unit = {
  23. // 1. 创建spark,sc对象
  24. if (args.length != 2) {
  25. println("您需要输入一个参数")
  26. System.exit(5)
  27. }
  28. val musrl: String = args(0)
  29. val spark: SparkSession = new SparkSession.Builder()
  30. .appName(s"${this.getClass.getSimpleName}")
  31. .master(musrl)
  32. .getOrCreate()
  33. val sc: SparkContext = spark.sparkContext
  34. // 生成streamingContext对象
  35. val ssc: StreamingContext = new StreamingContext(sc, Seconds(5))
  36. // 2. 代码主体
  37. val bststrapServers = args(1)
  38. val kafkaParms: Map[String, Object] = Map[String, Object](
  39. "bootstrap.servers" -> bststrapServers, //kafka列表
  40. "key.deserializer" -> classOf[StringDeserializer], kv 的序列化类型
  41. "value.deserializer" -> classOf[StringDeserializer],
  42. "group.id" -> "use_a_separate_group_id_for_each_stream", //消费者组
  43. "auto.offset.reset" -> "latest", //如果没有记录偏移量,第一次从最开始读,有偏移量,接着偏移量读
  44. "enable.auto.commit" -> (true: java.lang.Boolean) // 消费者不自动提交偏移量
  45. )
  46. val topics = Array("gnutest2", "t100")
  47. // createDirectStream: 主动拉取数据
  48. val stream = KafkaUtils.createDirectStream[String, String](
  49. ssc,
  50. PreferConsistent,
  51. Subscribe[String, String](topics, kafkaParms)
  52. )
  53. val mapDStream: DStream[(String, String)] = stream.map(record => (record.key, record.value))
  54. //kafka 是一个key value 格式的, 默认key 为null ,一般用不上
  55. val resultRDD: DStream[(String, Int)] = mapDStream.flatMap(_._2.split(" ")).map((_, 1)).reduceByKey(_ + _)
  56. // 打印
  57. resultRDD.print()
  58. // 3. 关闭sc,spark对象
  59. ssc.start()
  60. ssc.awaitTermination()
  61. ssc.stop()
  62. sc.stop()
  63. spark.stop()
  64. }
  65. }

配置输入参数

生产者追加数据

标签: spark kafka 大数据

本文转载自: https://blog.csdn.net/pblh123/article/details/134734340
版权归原作者 pblh123 所有, 如有侵权,请联系我们删除。

“2023_Spark_实验二十五:SparkStreaming读取Kafka数据源:使用Direct方式”的评论:

还没有评论