Spark流计算(一)

来源:互联网 发布:手机卡iphone7在线软件 编辑:程序博客网 时间:2024/06/05 17:54

Spark流计算是Spark核心API的扩展,能为数据流提供可扩展的、高吞吐量、容错的流处理。数据可从多个源输入如Kafka,Flume,Kinesis,或TCP接口,能够使用高层函数的复杂算法来处理如map, reduce, join和window。最后,经处理的数据可推送到文件系统、数据库和面板。事实上,也可以对数据流应用Spark的机器学习和图计算算法。


Spark Streaming

在内部,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 SparkContextfrom pyspark.streaming import StreamingContext

然后,我们建立一个有两个线程的本地的StreamingContext,批次间隔1秒

# Create a local StreamingContext with two working thread and batch interval of 1 secondsc = SparkContext("local[2]", "NetworkWordCount")ssc = StreamingContext(sc, 1)
我们构建DStream代表从TCP源来的流数据,制定hostname和port

# Create a DStream that will connect to hostname:port, like localhost:9999lines = ssc.socketTextStream("localhost", 9999)
lines代表了接收自数据服务器的流数据。DStream的每个记录是一行文本,下一步我们用空格将行分成词

# Split each line into wordswords = lines.flatMap(lambda line: line.split(" "))
flatMap是一对多的DStream操作,通过从源DStream的每个记录产生多个新记录来构建一个新的DStream。这里,每一行分成多个次,词的流由wordsDStream体现,下一步我们计算这些词

# Count each word in each batchpairs = 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 consolewordCounts.pprint()
wordsDStream进一步映射(一对一转换)到(word,1)对的DStream,然后通过取得每批次数据中的出现频率来归类。最后wordCounts.pprint()每集淼打印生成的一些计数。

注意当上述代码执行时,Spark Streaming只是设置开始执行时会进行的计算还不是实际开始处理,要开始处理需要最后调用

ssc.start()             # Start the computationssc.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服务器终端输入的行会被计数并每过几秒打印在屏幕上。

阅读全文
0 0