Page tree

2017-07-25 Apache Spark 2.2.0 官方文档中文版发布 : http://spark.apachecn.org/docs/cn/2.2.0/


MachineLearning 优酷地址 : http://i.youku.com/apachecn

Skip to end of metadata
Go to start of metadata

输入 DStreams 是代表输入数据是从流的源数据(streaming sources)接收到的流的 DStream 。在快速简单的例子中,行(lines)是一个输入 DStream ,因为它代表着从 netcat 服务器接收到的数据的流。每个输入离散流(input DStream)(除了文件流(file stream),在后面的章节进行讨论)都会与一个接收器(Scala docJava doc)对象联系,这个接收器对象从一个源头接收数据并且存储到 Sparks 的内存中用于处理。

Spark Streaming 提供了两种内置的流来源(streaming source)。

  • Basic sources(基本来源): 在 StreamingContext API 中直接可用的源(source)。例如,文件系统(file systems),和 socket 连接(socket connections)。
  • Advanced sources(高级来源): 就像 KafkaFlumeKinesis 之类的通过额外的实体类来使用的来源。这些都需要连接额外的依赖,就像在 连接 部分的讨论。

在本节的后边,我们将讨论每种类别中的现有的一些来源。

需要注意的是,如果你想要在你的流处理程序中并行的接收多个数据流,你可以创建多个输入离散流(input DStreams)(在 性能调整 部分进一步讨论)。这将创建同时接收多个数据流的多个接收器(receivers)。但需要注意,一个 Spark 的 worker/executor 是一个长期运行的任务(task),因此它将占用分配给 Spark Streaming 的应用程序的所有核中的一个核(core)。因此,要记住,一个 Spark Streaming 应用需要分配足够的核(core)(或线程(threads),如果本地运行的话)来处理所接收的数据,以及来运行接收器(receiver(s))。

需要记住的要点

  • 当在本地运行一个 Spark Streaming 程序的时候,不要使用 "local" 或者 "local[1]" 作为 master 的 URL 。这两种方法中的任何一个都意味着只有一个线程将用于运行本地任务。如果你正在使用一个基于接收器(receiver)的输入离散流(input DStream)(例如, sockets ,Kafka ,Flume 等),则该单独的线程将用于运行接收器(receiver),而没有留下任何的线程用于处理接收到的数据。因此,在本地运行时,总是用 "local[n]" 作为 master URL ,其中的 n > 运行接收器的数量(查看 更多 来了解怎样去设置 master 的信息)。
  • 将逻辑扩展到集群上去运行,分配给 Spark Streaming 应用程序的内核(core)的内核数必须大于接收器(receiver)的数量。否则系统将接收数据,但是无法处理它。

Basic Sources(基本来源)

我们已经简单地了解过了 ssc.socketTextStream(...) 在快速开始的例子中,例子中是从通过一个 TCP socket 连接接收到的文本数据中创建了一个离散流(DStream)。除了 socketsStreamingContext API 也提供了根据文件作为输入来源创建离散流(DStreams)的方法。

  • 文件流(FileStreams):用于从文件中读取数据,在任何与 HDFSAPI 兼容的文件系统中(即,HDFSS3NFS 等),一个离散流(DStream)可以像下面这样创建 : 
  streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory)

Spark Streaming 将监控 dataDirectory 目录,并处理任何在该目录下创建的文件(写在嵌套目录中的文件是不支持的)。注意 : 

    • 文件必须具有相同的数据格式。
    • 文件必须在 dataDirectory 目录中通过原子移动或者重命名它们到这个 dataDirectory 目录下来创建。
    • 一旦移动,这些文件必须不能再更改,因此如果文件被连续地追加,新的数据将不会被读取。

对于简单的文本文件,还有一个更加简单的方法 streamingContext.textFileStream(dataDirectory)。并且文件流(file streams)不需要运行一个接收器(receiver),因此,不需要分配内核(core)。

在 Python API 中 Python API fileStream 是不可用的,只有 textFileStream 是可用的。

  • Streams based on Custom Receivers(基于自定义的接收器的流): 离散流(DStreams)可以使用通过自定义的接收器接收到的数据来创建。查看 自定义接收器指南 来了解更多细节。
  • Queue of RDDs as a Stream(RDDs 队列作为一个流): 为了使用测试数据测试 Spark Streaming 应用程序,还可以使用 streamingContext.queueStream(queueOfRDDs) 创建一个基于 RDDs 队列的离散流(DStream),每个进入队列的 RDD 都将被视为 DStream 中的一个批次数据,并且就像一个流进行处理。

想要了解更多的关于从 sockets 和文件(files)创建的流的细节,查看相关功能的 API 文档,Scala 中的 StreamingContext Java 中的 JavaStreamingContext 和 Python 中的 StreamingContext 

Advanced Sources(高级来源

Python API  在 Spark 2.0.2 中,这些来源中,KafkaKinesis 和 Flume 在 Python API 中都是可用的。

这一类别的来源需要使用非 Spark 库中的外部接口,它们中的其中一些还需要比较复杂的依赖关系(例如, Kafka 和 Flume)。因此,为了最小化有关的依赖关系的版本冲突的问题,这些资源本身不能创建 DStream 的功能,它是通过连接单独的类库实现创建 DStream 的功能。

需要注意的是这些高级来源在 Spark Shell 中是不可用的。因此,基于这些高级来源的应用程序不能在 shell 中被测试。如果你真的想要在 Spark shell 中使用它们,你必须下载带有它的依赖的相应的 Maven 组件的 JAR ,并且将其添加到 classpath 。

一些高级来源如下。

  • Kafka : Spark Streaming 2.0.2 与 Kafka 0.8.2.1 以及更高版本兼容。查看 Kafka 集成指南 来了解更多细节。
  • Flume : Spark Streaming 2.0.2 与 Flume 1.6.0 兼容。查看 Flume 集成指南 来了解更多细节。
  • Kinesis : Spark Streaming 2.0.2 与 Kinesis 客户端库 1.2.1 兼容。查看 Kinesis 集成指南 来了解更多细节。

Custom Sources(自定义来源)

在 Python 中 Python API 还不支持自定义来源。

输入离散流(Input DStreams)也可以从创建自定义数据源。所有你需要做的就是实现一个用户定义(user-defined)的接收器(receiver)(查看下一章节去了解那是什么),这个接收器可以从自定义的数据源接收数据并将它推送到 Spark 。查看 自定义接收器指南(Custom Receiver Guide) 来了解更多。

Reveiver Reliability(接收器的可靠性)

可以有两种基于他们的可靠性的数据源。数据源(如 Kafka 和 Flume)允许传输的数据被确认。如果系统从这些可靠的数据来源接收数据,并且被确认(acknowledges)正确地接收数据,它可以确保数据不会因为任何类型的失败而导致数据丢失。这样就出现了 2 种接收器(receivers): 

  1. Reliable Receiver(可靠的接收器)- 当数据被接收并存储在 Spark 中并带有备份副本时,一个可靠的接收器(reliable receiver)正确地发送确认(acknowledgment)给一个可靠的数据源(reliable source)。
  2. Unreliable Receiver(不可靠的接收器)- 一个不可靠的接收器( unreliable receiver )不发送确认(acknowledgment)到数据源。这可以用于不支持确认的数据源,或者甚至是可靠的数据源当你不想或者不需要进行复杂的确认的时候。

 自定义接收器指南(Custom Receiver Guide) 中描述了关于如何去编写一个可靠的接收器的细节。