在之前学习的RDD和DataFrame数据集主要处理的是离线数据,随着时代发展进步,我们会发现越来越多数据是在源源不断发回到数据中心,同时需要立刻响应给用户,这样的情况我们就会用到实时处理,常用的场景有实时显示某商场一小时人流密度、实时显示当天火车站人口总数等等。接下来从实时数据源说起,实时数据源主要有:
File Source指的是文件作为数据来源,常用的有本地文件file和分布式系统hdfs,这边以本地文件来说明,实现代码如下
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
if __name__ == '__main__':
sc = SparkContext(appName="inputSourceStreaming", master="local[*]")
# 第二个参数指统计多长时间的数据
ssc = StreamingContext(sc, 5)
lines = ssc.textFileStream("file:///home/llh/data/streaming")
counts = lines.flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
counts.pprint()
# -------------------------------------------
# Time: 2019-07-31 18:11:55
# -------------------------------------------
# ('hong', 2)
# ('zhang', 2)
# ('li', 2)
# ('san', 2)
# ('wang', 2)
ssc.start()
ssc.awaitTermination()
然后不断向/home/llh/data/streaming/目录下拷贝文件,结果如上面注释所示
Socket Source指网络套接字作为数据来源,用命令nc模拟网络发送信息,实现代码如下
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
if __name__ == '__main__':
sc = SparkContext(appName="inputSourceStreaming", master="local[*]")
# 第二个参数指统计多长时间的数据
ssc = StreamingContext(sc, 5)
lines = ssc.socketTextStream("localhost", 9999)
counts = lines.flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
counts.pprint()
# -------------------------------------------
# Time: 2019-07-31 18: 43:25
# -------------------------------------------
# ('hadoop', 1)
# ('spark', 1)
ssc.start()
ssc.awaitTermination()
命令端执行~$ nc -lk 9999
hadoop spark
之后运行代码即可
Flume是一个高可用海量收集日志系统,因此可作为数据来源,实现代码如下
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.flume import FlumeUtils
if __name__ == '__main__':
sc = SparkContext(appName="inputSourceStreaming", master="local[*]")
# 第二个参数指统计多长时间的数据
ssc = StreamingContext(sc, 5)
lines = FlumeUtils.createStream("localhost", 34545)
counts = lines.flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
counts.pprint()
ssc.start()
ssc.awaitTermination()
Kafka是一款分布式消息队列,常作为中间件用于传输,隔离,Kafka是以上四种里面实际开发最常用的流式数据来源,一样实现代码如下
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
if __name__ == '__main__':
sc = SparkContext(appName="inputSourceStreaming", master="local[*]")
# 第二个参数指统计多长时间的数据
ssc = StreamingContext(sc, 5)
kvs = KafkaUtils.createDirectStream(ssc, "topic-name", "localhost:9092")
lines = kvs.map(lambda x: x[1])
counts = lines.flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
counts.pprint()
ssc.start()
ssc.awaitTermination()
好了,以上就是实时处理主要数据来源,第四种最为重要必须掌握。
Spark学习目录: