Spark 离散流(DStream – Discretized Stream)

1. 目的

本章将引导您了解Spark DStream。

2. DStream简介

Spark DStream(离散流)是Spark Streaming的高级抽象。DStream是一个连续的数据流,它接收来自各种数据源的输入,如Kafka,Flume,Kinesis或TCP套接字。它也可以是通过转换输入流而生成的数据流。在内部,DStream是一个连续的RDD流,DStream中的每个RDD都包含来自特定时间间隔的数据。

在DStream上的任何操作都会调用底层的RDD,DStream处理了所有细节,它为开发人员提供了一个方便使用的高级API来处理流数据。

3. DStream操作

与RDD类似,DStream也支持两种类型的操作,即:转换(Transformation)和输出(Output)操作。

3.1 转换操作

一些常用的转换如下:

Transformation

Meaning

map(func)

利用函数func处理原DStream的每个元素,返回一个新的DStream

flatMap(func)

与map相似,但是每个输入项可用被映射为0个或者多个输出项

filter(func)

返回一个新的DStream,它仅仅包含源DStream中满足函数func的项

repartition(numPartitions)

通过创建更多或者更少的partition改变这个DStream的并行级别(level of parallelism)

union(otherStream)

返回一个新的DStream,它包含源DStream和otherStream的联合元素

count()

通过计算源DStream中每个RDD的元素数量,返回一个包含单元素(single-element)RDDs的新DStream

reduce(func)

利用函数func聚集源DStream中每个RDD的元素,返回一个包含单元素(single-element)RDDs的新DStream。函数应该是相关联的,以使计算可以并行化

countByValue()

这个算子应用于元素类型为K的DStream上,返回一个(K,long)对的新DStream,每个键的值是在原DStream的每个RDD中的频率。

reduceByKey(func, [numTasks])

当在一个由(K,V)对组成的DStream上调用这个算子,返回一个新的由(K,V)对组成的DStream,每一个key的值均由给定的reduce函数聚集起来。注意:在默认情况下,这个算子利用了Spark默认的并发任务数去分组。你可以用numTasks参数设置不同的任务数

join(otherStream, [numTasks])

当应用于两个DStream(一个包含(K,V)对,一个包含(K,W)对),返回一个包含(K, (V, W))对的新DStream

cogroup(otherStream, [numTasks])

当应用于两个DStream(一个包含(K,V)对,一个包含(K,W)对),返回一个包含(K, Seq[V], Seq[W])的元组

transform(func)

通过对源DStream的每个RDD应用RDD-to-RDD函数,创建一个新的DStream。这个可以在DStream中的任何RDD操作中使用

updateStateByKey(func)

利用给定的函数更新DStream的状态,返回一个新"state"的DStream。

窗口(window)操作

Spark Streaming也支持窗口计算,它允许你在一个滑动窗口数据上应用转换。

一些常用的窗口操作如下:

Transformation

Meaning

window(windowLength, slideInterval)

基于源DStream产生的窗口化的批数据计算一个新的DStream

countByWindow(windowLength, slideInterval)

返回流中元素的一个滑动窗口数

reduceByWindow(func, windowLength, slideInterval)

返回一个单元素流。利用函数func聚集滑动时间间隔的流的元素创建这个单元素流。函数必须是相关联的以使计算能够正确的并行计算。

reduceByKeyAndWindow(func, windowLength, slideInterval, [numTasks])

应用到一个(K,V)对组成的DStream上,返回一个由(K,V)对组成的新的DStream。每一个key的值均由给定的reduce函数聚集起来。注意:在默认情况下,这个算子利用了Spark默认的并发任务数去分组。你可以用numTasks参数设置不同的任务数

countByValueAndWindow(windowLength, slideInterval, [numTasks])

应用到一个(K,V)对组成的DStream上,返回一个由(K,V)对组成的新的DStream。每个key的值都是它们在滑动窗口中出现的频率。

3.2 输出操作

输出操作允许DStream的操作输出到外部系统中,如数据库、文件系统等。输出操作实际上是允许外部系统消费转换后的数据,输出操作触发的实际操作是DStream转换。

一些常用的输出操作如下:

Output Operation

Meaning

print()

在DStream的每个批数据中打印前10条元素,这个操作在开发和调试中都非常有用。在Python API中调用pprint()

saveAsObjectFiles(prefix, [suffix])

保存DStream的内容为一个序列化的文件SequenceFile。每一个批间隔的文件的文件名基于prefixsuffix生成。"prefix-TIME_IN_MS[.suffix]",在Python API中不可用。

saveAsTextFiles(prefix, [suffix])

保存DStream的内容为一个文本文件。每一个批间隔的文件的文件名基于prefixsuffix生成。"prefix-TIME_IN_MS[.suffix]"

saveAsHadoopFiles(prefix, [suffix])

保存DStream的内容为一个hadoop文件。每一个批间隔的文件的文件名基于prefixsuffix生成。"prefix-TIME_IN_MS[.suffix]",在Python API中不可用。

foreachRDD(func)

在从流中生成的每个RDD上应用函数func的最通用的输出操作。这个函数应该推送每个RDD的数据到外部系统,例如保存RDD到文件或者通过网络写到数据库中。需要注意的是,func函数在驱动程序中执行,并且通常都有RDD action在里面推动RDD流的计算。

4. 输入DStreams和Receivers

输入DStreams表示从数据源获取的原始数据流。每一个输入流DStream和一个Receiver对象相关联,这个Receiver从源中获取数据,并将数据存入内存中用于处理。

Spark Streaming拥有两类数据源:

1)基本源(Basic Sources):这些源在StreamingContext API中直接可用。例如文件系统、套接字连接、Akka的actor等。

2)高级源(Advanced Sources):这些源包括Kafka,Flume,Kinesis,Twitter等等。它们需要通过额外的类来使用。

需要注意的是,如果你想在一个流应用中并行地创建多个输入DStream来接收多个数据流,你能够创建多个输入流。它将创建多个Receiver同时接收多个数据流。Receiver作为一个长期运行的任务运行在Spark worker或executor中,它占有一个核,这个核是分配给Spark Streaming应用程序的所有核中的一个。所以,为Spark Streaming应用程序分配足够的核用以处理接收的数据并且运行Receiver是非常重要的。

几点需要注意的地方:

1)如果分配给应用程序的核的数量少于或者等于输入DStreams或者Receivers的数量,系统只能够接收数据而不能处理它们。

2)当运行在本地,如果你的master URL被设置成了“local”,这样就只有一个核运行任务。对程序来说一个核是不够的,因为作为Receiver的输入DStream将会占用这个核,这样就没有剩余的核来处理数据了。

5. Receiver可靠性

基于可靠性有两类数据源。如果从这些可靠的源获取数据的系统能够正确的应答所接收的数据,它就能够确保在任何情况下不丢失数据。这样,就有两种类型的Receiver:

1)Reliable Receiver:一个可靠的Receiver正确的应答一个可靠的源,数据已经收到并且被正确地复制到了Spark中。

2)Unreliable Receiver :这类Receiver不支持应答。即使对于一个可靠的源,开发者可能实现一个非可靠的Receiver,这个Receiver不会正确应答这个源。

6. 结论

像Spark的RDD一样,Spark Streaming提供了一个称为DStream的高级抽象。DStream代表连续的数据流。在内部,DStream是一个连续的RDD流,DStream中的每个RDD都包含来自特定时间间隔的数据。像RDD一样,我们可以从输入DStream中获得DStream,如Kafka、Flume等,可以将转换应用于现有的DStream以获得新的DStream。

Spark 离散流(DStream – Discretized Stream)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

九十 四 − = 90