目录
一、环境准备
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
五、关键概念说明
- 检查点(Checkpoint): 用于保存流处理的状态信息,以便在故障恢复时使用
- 批处理间隔(Batch Duration): 设置流处理的时间窗口大小(本例为5秒)
- 状态更新(updateStateByKey): 用于维护跨批次的状态信息
- Direct Stream: Spark直接从Kafka brokers获取数据,不使用Receiver
六、注意事项
- 确保Kafka和Spark版本兼容
- 运行前检查所有服务是否正常启动
- 文件流处理需要确保监控目录存在且有读写权限
- 使用Ctrl+C终止流处理应用