输入 DStreams 表示从 source 中获取输入数据流的 DStreams。在入门示例中,lines 表示输入DStream,它代表从netcat服务器获取的数据流。每一个输入DStream(除 file stream)都与一个 Receiver (接收器)相关联,接收器从 source 中获取数据,并将数据存入 Spark 内存中来进行处理。 输入 DStreams 表示从数据源获取的原始数据流。Spark Streaming 提供了两类内置的流源(streaming sources):
我们将稍后讨论这两类数据源。
请注意,如果希望在流应用程序中并行的接收多个数据流,你可以创建多个输入 DStream(在性能调优部分中进一步讨论)。这需要创建多个接收器(Receivers),来同时接收多个数据流。但请注意,Spark 的 worker/executor 是一个长期运行的任务,因此会占用分配给 Spark Streaming 应用程序的其中一个核(core)。因此,记住重要的一点,Spark Streaming 应用程序需要分配足够的核(或线程,如果在本地运行)来处理接收的数据,以及来运行接收器。
注意
local
或 local [1]
作为 master 的 URL。这两个都意味着只会有一个线程用于本地任务运行。如果使用基于接收器(例如套接字,Kafka,Flume等)的输入 DStream,那么唯一的那个线程会用于运行接收器,不会有其他线程来处理接收到的数据。因此,在本地运行时,始终使用 local [n]
作为 master 的 URL,其中 n > 要运行的接收器的数目
。在入门实例中我们已经了解到 ssc.socketTextStream(...)
,它通过 TCP 套接字连接从数据服务器获取文本数据创建 DStream。除了套接字,StreamingContext API 也提供了把文件作为输入源创建 DStreams 的方法。
可以从与 HDFS API 兼容的任何文件系统(即,HDFS,S3,NFS等)上的文件读取数据,DStream 可以使用如下命令创建:
Java:
streamingContext.fileStream<KeyClass, ValueClass, InputFormatClass>(dataDirectory);
Scala:
streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory)
Spark Streaming 会监视 dataDirectory 目录并处理在该目录中创建的任何文件(不支持嵌套目录中写入的文件)。
注意
对于简单的文本文件,有一个更简单的方法:
streamingContext.textFileStream(dataDirectory)
文件流不需要运行接收器(Receiver),因此不需要分配核。
fileStream 在 Python API 中不可用,只有 textFileStream 可用。
可以使用通过自定义的接收器接收的数据流创建 DStream。有关详细信息,请参阅自定义接收器指南。
要使用测试数据测试 Spark Streaming 应用程序,还可以使用 streamingContext.queueStream(queueOfRDDs)
基于 RDD 队列创建 DStream。 推送到队列中的每个 RDD 将被视为 DStream 中的一批次数据,并像流一样处理。
这类数据源需要使用非Spark库的外部接口,其中一些需要复杂依赖(例如,Kafka和Flume)。因此,为了尽量减少依赖的版本冲突问题,这些数据源本身不能创建 DStream 的功能,它是通过 依赖 单独的类库实现创建 DStream 的功能。
请注意,这些高级源在 Spark Shell 中不可用,因此基于这些高级数据源的应用程序无法在 shell 中测试。如果你真的想在 Spark shell 中使用它们,那么你必须下载相应的 Maven 组件的JAR及其依赖项,并将其添加到 classpath 中。
介绍一下常用的高级数据源:
这在Python中还不支持。
输入DStreams也可以从自定义数据源中创建。如果你这样做,需要实现一个自定义接收器(Receiver),可以从自定义数据源接收数据,并推送到Spark。有关详细信息,请参阅自定义接收器指南。
基于Receiver的可靠性,可以分为两种数据源。如Kafka和Flume之类的数据源允许传输的数据被确认。如果从这些可靠源接收数据,并且被确认正确的接收数据,则可以确保不会由于任何种类的故障而丢失数据。这样就出现了两种接收器(Receiver):
Spark Streaming 版本: 2.2.0
原文:http://spark.apache.org/docs/2.2.0/streaming-programming-guide.html#input-dstreams-and-receivers