基于PySpark整合Spark Streaming与Kafka

本文详细介绍了如何基于PySpark整合Spark Streaming与Kafka,实现大数据实时计算。首先,讲述了程序环境准备,包括启动Zookeeper、Kafka及测试单实例Kafka。接着,详细阐述了配置依赖包、Spark Streaming实时消费Kafka消息的过程。讨论了Receiver与Direct两种消费消息方式,强调了Direct模式的优点,如避免内存占用和提高计算资源利用率。最后,分析了Direct模式下的offset管理,强调了自行管理offset的重要性。

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

  本文内容主要给出基于PySpark程序,整合Spark Streaming和Kafka,实现实时消费和处理topic消息,为PySpark开发大数据实时计算项目提供基本参考。(未来将陆续更新基于Scala开发大数据实时计算项目的文章)

1 程序环境准备:

  这里不再使用Spark的集群环境,因涉及的计算资源测试环境受限,目前两台虚拟机:1个vcore+2G内存,其中一台虚拟机启动Spark Streaming服务进程,另外一台虚拟机启动kafka进程。
虚拟机A:启动单实例kafka服务
虚拟机B:运行PySpark程序
  在VM A,程序环境要求安装jdk1.8以上以及与kafka匹配版本的scala版本
版本兼容说明:

kafka:kafka_2.11-2.4.0
java:java version "1.8.0_11"
scala: Scala 2.12.0

  这里需要注意:如果使用kafka_2.12版本以上,需要使用jdk1.8.0_212以上;kafka_2.12与jdk1.8.0_11有不兼容地方,kafka启动报错提示java.lang.VerifyError: Uninitialized object exists on backward branch 209

1.1 基本配置

(1)配置单机zk这里无需依赖ZooKeeper集群,只需使用kafka自带的zk服务即可
vim /opt/kafka_2.11-2.4.0/config/zookeeper.properties

dataDir=/opt/zookeeper # zk的snapshot数据存储路径
clientPort=2181 # 按默认端口

(2)配置kafka的,路径/opt/kafka_2.11-2.4.0/config/ server.properties

log.dirs=/opt/kafka-logs # 存放kafka数据目录
zookeeper.connect=127.0.0.1:2181 # 按默认连接本机zk即可
1.2 启动zk和kafka
[root@nn kafka_2.11-2.4.0]# pwd
/opt/kafka_2.12-2.4.0

[root@nn kafka_2.11-2.4.0]#  nohup ./bin/zookeeper-server-start.sh config/zookeeper.properties 2>&1 &

kafka server后台启动:

[root@nn kafka_2.11-2.4.0]# nohup bin/kafka-server-start.sh config/server.properties 2>&1 &
1.3 测试单实例Kafka

  对于kafka单节点而言,这里只能使用1个分区且1个replication-factor,topic名称为sparkapp

[root@nn kafka_2.11-2.4.0]# ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic sparkapp
Created topic sparkapp.

打开一个新的shell,用于启动producer

[root@nn kafka_2.11-2.4.0]# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic sparkapp

再打开一个新的shell,用于启动consumer

[root@nn kafka_2.11-2.4.0]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092  --topic sparkapp

  在producer shell输入字符串,consumer端可以看到相应输出,说明单机的kafka可以正常运行,下面将使用Spark Streaming实时读取kafka的输入流

2 整合streaming和kafka
2.1 配置依赖包

  具体说明参考官方文档spark streaming连接kafka需要依赖两个jar包(注意版本号):
spark-streaming-kafka-0-8-assembly_2.11-2.4.3.jar: 下载链接
spark-streaming-kafka-0-8_2.11-2.4.4.jar: 下载链接
  将这两个jar包放在spark 的jars目录下,需要注意的是:这两个jar包缺一不可,如果是在Spark集群上做测试,那么每个Spark节点都需要放置这两个jars包:


                
Spark StreamingKafka整合案例: 1. 项目背景 本案例是一个实时数据处理项目,主要使用Spark StreamingKafka进行数据处理和传输。数据源为Kafka,数据处理和计算使用Spark Streaming,最终将结果输出到MySQL数据库中。 2. 技术架构 本案例的技术架构如下: 数据源:Kafka 数据处理和计算:Spark Streaming 数据存储:MySQL 3. 实现步骤 1)创建Kafka生产者,向Kafka中写入数据。 2)创建Spark Streaming应用程序,从Kafka中读取数据。 3)对读取到的数据进行处理和计算。 4)将计算结果输出到MySQL数据库中。 4. 代码示例 以下是本案例的代码示例: 1)Kafka生产者代码: from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') for i in range(10): producer.send('test', b'message %d' % i) producer.close() 2)Spark Streaming代码: from pyspark.streaming.kafka import KafkaUtils from pyspark.streaming import StreamingContext from pyspark import SparkContext, SparkConf conf = SparkConf().setAppName('KafkaSparkStreaming').setMaster('local[2]') sc = SparkContext(conf=conf) ssc = StreamingContext(sc, 5) kafkaParams = {"metadata.broker.list": "localhost:9092"} stream = KafkaUtils.createDirectStream(ssc, ["test"], kafkaParams) lines = stream.map(lambda x: x[1]) counts = lines.flatMap(lambda line: line.split(" ")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b) counts.pprint() ssc.start() ssc.awaitTermination() 3)MySQL代码: import mysql.connector cnx = mysql.connector.connect(user='root', password='password', host='localhost', database='test') cursor = cnx.cursor() add_data = ("INSERT INTO word_count (word, count) VALUES (%s, %s)") data = [('hello', 1), ('world', 2), ('spark', 3)] for d in data: cursor.execute(add_data, d) cnx.commit() cursor.close() cnx.close() 5. 总结 本案例使用Spark StreamingKafka进行实时数据处理和传输,并将结果输出到MySQL数据库中。通过本案例的实现,可以深入了解Spark StreamingKafka的使用方法和技术原理,为实际项目的开发提供参考和借鉴。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值