<<Spark Streaming Programming Guide>> - Part 1 综述

原文地址:http://spark.apache.org/docs/latest/streaming-programming-guide.html

综述:

Spark Streaming是基于Spark核心包的扩展,它具备可扩容(可以增加节点),高通量(处理数据量大)和可容错(能够在节点失败时重启恢复)的特性对数据流进行处理。数据流可以从很多数据源获得,例如Kafka, Flume, Kinesis, 或者简单的TCP socket,我们可以使用基本的变换函数如map, reduce,join和window构建任意复杂的算法来处理流数据,从而实现我们想要的逻辑。最终,处理后的数据可以持久化到文件系统,数据库或者直接显示在动态仪表盘上。另外,如同RDD上一样,可以在数据流上很容易应用Spark的机器学习图处理方法。
Spark Streaming

在Spark内部,Spark Streaming将接收到的数据流切分成一个个小的批处理,然后再由Spark 引擎批量生成结果的数据流。
Spark Streaming

Spark Streaming引入了一个高度抽象的概念discretized stream (DStream),离散数据流, 用来代表客观世界持续不断的数据流。DStream可以通过之前提过的数据源如Kafka, Flume, and Kinesis获得,亦可以通过其他的DStream变换而来。在内部,DStream就是一组RDD序列(多个RDD组成的序列),对DStream的操作实际上对一组RDD的操作。既然RDD transform之后还是RDD,所以DStream transform之后还是DStream.


简单例子
在扎进具体的细节之前,我们先看一个简单例子大概了解Spark Streaming的程序到底长什么样子。假设我们在监听一个TCP Socket,它源源不断的发给我们一行行的句子,每一行句子由若干个空格分隔的单词。我们想统计一下过去某一个时间段内接收到所有单词及其频数。示例代码以Python为例,其他语言Java和Scala样例代码,请参照原文。


首先我们需要导入StreamingContext,它是Spark Streaming功能的入口,在下面的程序中我们直接和间接地指定了这个Spark程序有2个执行的线程,批处理的周期是1秒,它意味着我们统计的是过去1秒钟的接收到的数据。

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

# Create a local StreamingContext with two working thread and batch interval of 1 second
sc = SparkContext("local[2]", "NetworkWordCount")
ssc = StreamingContext(sc, 1)


通过这个StreamingContext,我们能够创建一个DStream代表从Socket 监听到的数据流,Socket 地址通过主机名和端口指定,在我们的例子中指定的是本机的9999端口。

# Create a DStream that will connect to hostname:port, like localhost:9999
lines = ssc.socketTextStream("localhost", 9999)

DStream变量lines由一组RDD组成,每一个RDD是过去1秒钟内监听的所有数据,尽管是1秒,一个RDD数据仍然可能包含不止一行的句子,每一行句子由若干个由空格分隔的单词组成。接下来我们将DStream进行flatMap操作,实际上是对每一个RDD的flatMap的操作,flatMap的操作是首先将每一行的句子按照空格提取为一个个单词构成的数组,然后再将数组打扁(flatten),从而构成由多个小数组连接为成一个只有一层的大数组。这个从单个RDD的视角去看,包含多行句子RDD转换成了单词的RDD,如果从DStream,即一组RDD的视角看,结果集words依然是一组RDD的集合,即还是一个DStream。

# Split each line into words
words = lines.flatMap(lambda line: line.split(" "))

继续进行,对DStream 'word' 进行map操作,即对每一个包含其中的RDD进行map操作,操作的内容是将每一个单词转换成key-value的pair RDD,key是单词,value是常数1. 结果集依然是一组RDD,即依然是DStream。然后进行reduceByKey操作,从而将相同key的value进行加和,从而求得每一个单词出现的个数。最后通过pprint()函数打印前10条记录。

译者的话:其实我认为更实际的应用场景中,与其给出任意十个单词出现的频数,不如将结果按照频数进行降序排序,然后列出出现频度最高的N的单词及其具体的频数。


# 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()

注意到目前为止,我们只是定义了计算方式,还实际上启动任何实际的流处理。当所有的计算方式定义结束后,我们可以执行下面的代码从而启动流处理程序。

ssc.start()             # Start the computation
ssc.awaitTermination()  # Wait for the computation to terminate


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值