Kafka与Spark Streaming集成笔记

目录

一、环境准备

二、Kafka基本操作

三、Spark Streaming集成Kafka

 KafkaStreamDemo.py代码

 运行文件流处理应用

测试数据流

四、Spark Streaming处理文件流

五、关键概念说明

六、注意事项


一、环境准备


1.确保已安装并运行以下服务:

  • Hadoop (HDFS)
  • YARN (ResourceManager和NodeManager)
  • Kafka
  • Spark

2.通过jps命令检查服务运行状态:

QuorumPeerMain  # ZooKeeper
Kafka           # Kafka服务器
ResourceManager # YARN资源管理器
NodeManager     # YARN节点管理器
DataNode        # HDFS数据节点
NameNode        # HDFS名称节点
SecondaryNameNode # HDFS二级名称节点

二、Kafka基本操作


1. 启动ZooKeeper和Kafka服务

cd /usr/local/kafka
bin/zookeeper-server-start.sh config/zookeeper.properties &
bin/kafka-server-start.sh config/server.properties &

2. 创建和管理Topic2. 创建和管理Topic

# 创建名为mytopic的主题
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic mytopic

# 列出所有主题
bin/kafka-topics.sh --list --zookeeper localhost:2181

3. 生产者和消费者测试

# 启动生产者(新终端)
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic mytopic

# 启动消费者(新终端)
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mytopic --from-beginning

三、Spark Streaming集成Kafka


1. 打开/创建文件

vi KafkaStreamDemo.py

2. 进入插入模式(开始输入文本)

  • 按 i 键进入插入模式(Insert mode),此时左下角会显示 -- INSERT --
  • 现在可以正常输入文本内容了

3. 常用编辑操作

  • 输入文本:直接打字即可
  • 换行:按回车键
  • 删除字符:
  • 退格键:删除光标前一个字符
  • x 键:删除光标所在字符(需先按ESC退出插入模式)

4. 保存与退出
首先按 ESC 键退出插入模式

然后输入:(“:”也要打)

:w 保存文件

:q 退出vi

:wq 保存并退出

:q! 强制退出不保存

5. 其他常用命令(在非插入模式下)

  • dd:删除当前行
  • yy:复制当前行
  • p:粘贴
  • /关键词:搜索文本
  • :set number:显示行号
  • :行号:跳转到指定行

 KafkaStreamDemo.py代码

from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils

# 初始化Spark上下文
sc = SparkContext('local[2]', 'KafkaStreamDemo')
sc.setLogLevel('OFF')  # 关闭日志

# 创建StreamingContext,批处理间隔5秒
ssc = StreamingContext(sc, 5)
ssc.checkpoint("file:///tmp/spark_checkpoint")  # 设置检查点

# 创建Kafka数据流
topics = ['mytopic']
kafkaParams = {'bootstrap.servers': 'localhost:9092'}
linesRdd = KafkaUtils.createDirectStream(ssc, topics, kafkaParams)

# 词频统计处理
def update_state(new_values, current_state):
    return sum(new_values) + (current_state or 0)

wordCounts = linesRdd.map(lambda x: x[1]) \
                   .flatMap(lambda line: line.split(' ')) \
                   .map(lambda word: (word, 1)) \
                   .reduceByKey(lambda a, b: a + b) \
                   .updateStateByKey(update_state)

wordCounts.pprint()

# 启动流处理
ssc.start()
ssc.awaitTermination()

 运行文件流处理应用

spark-submit --jars spark-streaming-kafka-0-8-assembly_2.11-2.4.8.jar FileStreamDemo.py

测试数据流

在Kafka生产者终端输入消息,观察Spark Streaming应用的输出结果。

四、Spark Streaming处理文件流

1. FileStreamDemo.py代码

# 导入必要的Spark和Spark Streaming库
from pyspark import SparkContext
from pyspark.streaming import StreamingContext

# 创建SparkContext,使用2个本地线程
# 'local[2]'表示使用本地2个核心运行
# 'FileStreamDemo'是应用程序名称
sc = SparkContext('local[2]', 'FileStreamDemo')
# 设置日志级别为OFF减少输出干扰
sc.setLogLevel('OFF')

# 创建StreamingContext,批处理间隔为5秒
# 第一个参数是SparkContext对象
# 第二个参数是批处理时间间隔(秒)
ssc = StreamingContext(sc, batchDuration=5)

# 优化建议:添加检查点用于故障恢复和状态维护
# ssc.checkpoint("file:///tmp/streaming_checkpoint")

# 监控指定目录(/home/spark/streaming/logfile)下的文件变化
# 注意:只处理新添加到目录中的文件,已有文件不会被读取
# 'file://'前缀表示本地文件系统
linesRdd = ssc.textFileStream('file:///home/spark/streaming/logfile')

# 数据处理流程(词频统计):
# 1. flatMap: 将每行文本按空格分割成单词
# 2. map: 将每个单词转换为(单词, 1)的键值对
# 3. reduceByKey: 按单词分组并累加计数
wordCounts = linesRdd.flatMap(lambda x: x.split(' ')) \
                # 优化建议:过滤空字符串
                .filter(lambda x: len(x) > 0) \
                .map(lambda x: (x, 1)) \
                .reduceByKey(lambda a, b: a + b)

# 打印每个批次的计算结果
# pprint()默认显示前10条记录
wordCounts.pprint()

# 启动流计算
ssc.start()
# 打印启动信息(可选)
print("Streaming application started...")
# 等待终止信号(Ctrl+C)
ssc.awaitTermination()

# 优化建议:可以添加以下功能
# 1. 单词转为小写:.map(lambda word: word.lower())
# 2. 结果排序:.transform(lambda rdd: rdd.sortBy(lambda x: -x[1]))
# 3. 更多过滤条件:.filter(lambda word: word.isalpha())

2. 运行文件流处理应用

spark-submit --jars spark-streaming-kafka-0-8-assembly_2.11-2.4.8.jar FileStreamDemo.py

3. 测试文件流

# 向监控目录添加文件
echo 'hello spark' > ~/streaming/logfile/1.txt

五、关键概念说明

  1. 检查点(Checkpoint): 用于保存流处理的状态信息,以便在故障恢复时使用
  2. 批处理间隔(Batch Duration): 设置流处理的时间窗口大小(本例为5秒)
  3. 状态更新(updateStateByKey): 用于维护跨批次的状态信息
  4. Direct Stream: Spark直接从Kafka brokers获取数据,不使用Receiver

六、注意事项

  1. 确保Kafka和Spark版本兼容
  2. 运行前检查所有服务是否正常启动
  3. 文件流处理需要确保监控目录存在且有读写权限
  4. 使用Ctrl+C终止流处理应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值