Spark流计算是Spark核心API的扩展,能为数据流提供可扩展的、高吞吐量、容错的流处理。数据可从多个源输入如Kafka,Flume,Kinesis,或TCP接口,能够使用高层函数的复杂算法来处理如map, reduce, join和window。最后,经处理的数据可推送到文件系统、数据库和面板。事实上,也可以对数据流应用Spark的机器学习和图计算算法。
在内部,Spark Streaming接收实时输入数据流并将数据分成批次,然后将经Spark引擎处理产生的最终结果流以批次方式输出。
Spark Streaming提供一个高层抽象称为离散化流或DStream,来代表持续数据流。DStream可以通过Kafka、Flume和Kinesis等的输入数据流构建,或者在其他DStream上采用高层操作。DStream表现为一个RDDs序列。
Spark Streaming程序可以用Scala,Java或者Python写成,但一些API在Python中不同或无法使用。
一个简单的例子
假设我们通过监听TCP端口接收来自数据服务器的文本数据,我们想要对词数进行统计。
首先,我们载入StreamingContext,这是所有流功能的主进入点
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
然后,我们建立一个有两个线程的本地的StreamingContext,批次间隔1秒
# Create a local StreamingContext with two working thread and batch interval of 1 second
sc = SparkContext("local[2]", "NetworkWordCount")
ssc = StreamingContext(sc, 1)
我们构建DStream代表从TCP源来的流数据,制定hostname和port
# Create a DStream that will connect to hostname:port, like localhost:9999
lines = ssc.socketTextStream("localhost", 9999)
lines代表了接收自数据服务器的流数据。DStream的每个记录是一行文本,下一步我们用空格将行分成词
# Split each line into words
words = lines.flatMap(lambda line: line.split(" "))
flatMap是一对多的DStream操作,通过从源DStream的每个记录产生多个新记录来构建一个新的DStream。这里,每一行分成多个次,词的流由wordsDStream体现,下一步我们计算这些词
# Count each word in each batch
pairs = words.map(lambda word: (word, 1))
wordCounts = pairs.reduceByKey(lambda x, y: x + y)
# Print the first ten elements of each RDD generated in this DStream to the console
wordCounts.pprint()
wordsDStream进一步映射(一对一转换)到(word,1)对的DStream,然后通过取得每批次数据中的出现频率来归类。最后wordCounts.pprint()每集淼打印生成的一些计数。
注意当上述代码执行时,Spark Streaming只是设置开始执行时会进行的计算还不是实际开始处理,要开始处理需要最后调用
ssc.start() # Start the computation
ssc.awaitTermination() # Wait for the computation to terminate
该例子的全部代码可以在 https://github.com/apache/spark/blob/v2.1.1/examples/src/main/python/streaming/network_wordcount.py 下载
如果已经下载并build了Spark,可以运行例子如下,首先要运行Netcat作为一个数据服务器
$ nc -lk 9999
然后启动例子
$ ./bin/spark-submit examples/src/main/python/streaming/network_wordcount.py localhost 9999
这时,任何在运行netcat服务器终端输入的行会被计数并每过几秒打印在屏幕上。