输入 DStreams 是代表输入数据是从流的源数据(streaming sources)接收到的流的 DStream 。在快速简单的例子中,行(lines)是一个输入 DStream ,因为它代表着从 netcat 服务器接收到的数据的流。每个输入离散流(input DStream)(除了文件流(file stream),在后面的章节进行讨论)都会与一个接收器(Scala doc,Java doc)对象联系,这个接收器对象从一个源头接收数据并且存储到 Sparks 的内存中用于处理。
Spark Streaming 提供了两种内置的流来源(streaming source)。
在本节的后边,我们将讨论每种类别中的现有的一些来源。
需要注意的是,如果你想要在你的流处理程序中并行的接收多个数据流,你可以创建多个输入离散流(input DStreams)(在 性能调整 部分进一步讨论)。这将创建同时接收多个数据流的多个接收器(receivers)。但需要注意,一个 Spark 的 worker/executor 是一个长期运行的任务(task),因此它将占用分配给 Spark Streaming 的应用程序的所有核中的一个核(core)。因此,要记住,一个 Spark Streaming 应用需要分配足够的核(core)(或线程(threads),如果本地运行的话)来处理所接收的数据,以及来运行接收器(receiver(s))。
需要记住的要点
我们已经简单地了解过了 ssc.socketTextStream(...) 在快速开始的例子中,例子中是从通过一个 TCP socket 连接接收到的文本数据中创建了一个离散流(DStream)。除了 sockets,StreamingContext API 也提供了根据文件作为输入来源创建离散流(DStreams)的方法。
streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory)
Spark Streaming 将监控 dataDirectory 目录,并处理任何在该目录下创建的文件(写在嵌套目录中的文件是不支持的)。注意 :
对于简单的文本文件,还有一个更加简单的方法 streamingContext.textFileStream(dataDirectory)。并且文件流(file streams)不需要运行一个接收器(receiver),因此,不需要分配内核(core)。
在 Python API 中 Python API fileStream 是不可用的,只有 textFileStream 是可用的。
想要了解更多的关于从 sockets 和文件(files)创建的流的细节,查看相关功能的 API 文档,Scala 中的 StreamingContext ,Java 中的 JavaStreamingContext 和 Python 中的 StreamingContext 。
Python API 在 Spark 2.0.2 中,这些来源中,Kafka,Kinesis 和 Flume 在 Python API 中都是可用的。
这一类别的来源需要使用非 Spark 库中的外部接口,它们中的其中一些还需要比较复杂的依赖关系(例如, Kafka 和 Flume)。因此,为了最小化有关的依赖关系的版本冲突的问题,这些资源本身不能创建 DStream 的功能,它是通过连接单独的类库实现创建 DStream 的功能。
需要注意的是这些高级来源在 Spark Shell 中是不可用的。因此,基于这些高级来源的应用程序不能在 shell 中被测试。如果你真的想要在 Spark shell 中使用它们,你必须下载带有它的依赖的相应的 Maven 组件的 JAR ,并且将其添加到 classpath 。
一些高级来源如下。
在 Python 中 Python API 还不支持自定义来源。
输入离散流(Input DStreams)也可以从创建自定义数据源。所有你需要做的就是实现一个用户定义(user-defined)的接收器(receiver)(查看下一章节去了解那是什么),这个接收器可以从自定义的数据源接收数据并将它推送到 Spark 。查看 自定义接收器指南(Custom Receiver Guide) 来了解更多。
可以有两种基于他们的可靠性的数据源。数据源(如 Kafka 和 Flume)允许传输的数据被确认。如果系统从这些可靠的数据来源接收数据,并且被确认(acknowledges)正确地接收数据,它可以确保数据不会因为任何类型的失败而导致数据丢失。这样就出现了 2 种接收器(receivers):
在 自定义接收器指南(Custom Receiver Guide) 中描述了关于如何去编写一个可靠的接收器的细节。