一、Discretized Streams (DStream)
Discretized Stream(DStream)是Spark Streaming 提供的最基础的抽象。它代表了一个连续不断的数据流,要么从源端接收到的数据流,要么是一个DStream经转换操作而生成的数据流。实际上,一个DStream代表的是Spark中RDD的一个序列(更多细节详见Spark Programming Guide)。每一个DStream中的RDD都包含了确定时间间隔的数据,就像我们如下图展示的那样:
任何应用于DStream的操作都会转换成对RDD的操作。比如说,在之前的小例子中,我们将一个lines DStream转换成一个words DStream,flatMap操作应用于每一个lines DStream上的RDD,从而产生了words DStream上的RDD。这个过程如下:
这些底层的RDD转换交由Spark引擎处理,为了方便,DStream操作隐藏了大多数细节并给开发者提供了一套高级别的API,这些操作在之后的章节中会做更加详细的介绍。
二、Input DStreams 和Receivers
Input DStreams表征的是从流式数据源接收输入数据流的DStreams。在之前的例子中,lines DStreams代表的就是一个从Netcat服务端接收输入数据流的Input DStream,每一个Input DStream(除了file Stream,更多细节在后面会有讨论)都和一个Receiver对象相连接,这个Receiver对象用于从数据源接收数据并将其存储在Spark的内存中便于后续的处理。
在源码中textFileStream的返回类型是DStream,不需要Receiver,socketTextStream的返回类型是ReceiverInputDStream,需要Receiver
Spark Streaming提供了两种内置的Streaming源:
Basic Sources:对于StreamingContext API,数据源是可直接使用的,比如文件系统,或者端口连接。
Advanced Source:像kafka、flume、Kinesis等数据源,它们需要通过一些额外的实用类才可以访问,这些数据源需要添加一些额外的依赖,如之前linking 章节讨论的那样。
请注意:如果你想在你的Streaming应用中并行的接收多个流式数据,你可以创建多个Input DStreams(将在Performance Tuning中讨论),这个操作意味着会创建多个Receiver来同时接收多个数据流。但是,请注意Spark Worker/Executor是一个长服务,因此它需要占用一个core用于连接Spark Streaming 应用程序,因此,我们需要记住的十分重要的一点是,Spark Streaming应用程序需要有足够的的core用于处理数据接收和运行Receiver。
Points to remember
当你在本地运行一个Spark Streaming 应用程序,请不要使用local 或者local[1]作为Master URL,他们都意味着你在本地运行任务时,只会启动一个线程,如果你使用的Input DStream是基于Receiver(比如网络端口、kafak、flume等),这个线程仅仅用来运行Receiver,这样就没有多余的线程用处理接收到的数据。因为,当你想要在本地运行Spark Streaming应用程序时,使用local[n]作为Master URL,n值必须大于Receiver的数量(在Spark Properties可查阅更多关于设置Master的信息)。
当你在集群上运行Spark Streaming应用程序时也是一样,core数必须大于Receiver数,否则系统只接受数据而不处理数据。
File Streams
为了读取任何兼容HDFS的文件系统上的数据,比如HDFS、S3、NFS等,一个DStream可以通过StreamingContext.fileStream[keyClass,valueClass,inputFormatClass]创建。
File Streams不需要运行Receiver,所以接收file数据不必分配core。
对于一个简单的text File,最简单的方法是StreamingContext.textFileStream(dataDirectory)。
streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory)
也可以
streamingContext.textFileStream(dataDirectory)
目录是如何被监控的:
Spark Streaming将会监控dataDirectory目录并处理该目录下创建的所有文件。
当一个像“hdfs://namenode:8040/logs/”的目录被监控时,只要这个目录下的文件被发现就会被处理。
可以提供POSIX glob pattern模式,例如“hdfs://namenode:8040/logs/2017/*”,在这里,DStream将会与该模式匹配的目录之中的所有文件组成,也就是说,它是目录的模式,而非目录中文件的模式。(别问我这句话啥意思,我真特么不知道啊,把原文贴一下你们自己看:A POSIX glob pattern can be supplied, such as "hdfs://namenode:8040/logs/2017/*"
. Here, the DStream will consist of all files in the directories matching the pattern. That is: it is a pattern of directories, not of files in directories.)
##这儿大家测一下目录中的子文件夹中的文件能否被监控到啊?
所有的文件必须格式相同。