在官网下载,对应 spark 和 scala 版本的 jar 包
https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka-0-8-assembly
我在 spark 的目录下 创建了一个 external_jars 的目录,并把这个 jar 包放到这个目录下
- 启动 spark
- 启动 zookeeper
- 启动 kafka
jps 查看进程如下
在 kafka 的 bin 目录下,创建名为 rs 的 topic,注意,最好不要用 localhost
bin/kafka-topics.sh --create --zookeeper master:2181 --replication-factor 1 --partitions 1 --topic rs
查看创建的 topic
bin/kafka-topics.sh --list --zookeeper master:2181
启动生产者进程
bin/kafka-console-producer.sh --broker-list master:9092 --topic rs
启动消费者进程
bin/kafka-console-consumer.sh --bootstrap-server master:9092 --topic rs --from-beginning
编写 produer.py,不断产生消息
from kafka import KafkaProducer
import time
#创建KafkaProducer,连接broker
producer = KafkaProducer(bootstrap_servers='master:9092')
#每隔一段时间发送一端字符串数据到broker
def send_data():
for i in range(60):
producer.send('rs',b"hello,kafka,spark,streaming,kafka")
time.sleep(0.1)
send_data()
编写 consumer.py,用 spark-streaming 从 Kafka 中消费信息
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
from pyspark.sql.session import SparkSession
topic="rs"
spark = SparkSession.builder.master("local[2]").getOrCreate()
sc = spark.sparkContext
ssc = StreamingContext(sc,3)
#创建direct连接,指定要连接的topic和broker地址
ks = KafkaUtils.createDirectStream(ssc,[topic],{"metadata.broker.list":"master:9092"})
#(None,内容)
ks.pprint()
#以下代码每操作一次,就打印输出一次
lines = ks.map(lambda x:x[1])
lines.pprint()
words = lines.flatMap(lambda line:line.split(","))
words.pprint()
pairs = words.map(lambda word:(word,1))
pairs.pprint()
counts = pairs.reduceByKey(lambda x,y:x+y)
counts.pprint()
ssc.start()
#等待计算结束
ssc.awaitTermination()
此时直接启动程序 python consumer.py 会报错
Spark Streaming's Kafka libraries not found in class path. Try one of the following.
必须用 spark-submit 提交 python 程序,并上传 jar 包(最开始下载的那个 jar 包,我下载的 jar 包名字是 spark-streaming-kafka-0-8-assembly_2.11-2.4.4.jar),注意 jar 包的路径要对
spark-submit --jars /usr/local/src/spark-2.4.4-bin-hadoop2.6/external_jars/spark-streaming-kafka-0-8-assembly_2.11-2.4.4.jar consumer.py
这个成功启动只会会输出很多日志信息的
然后在启动 productor.py 就 ok 了
python productor.py
查看日志信息
对接成功!