Spark流计算(一)

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 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服务器终端输入的行会被计数并每过几秒打印在屏幕上。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值