Spark Streaming输入流和接收器

输入 DStreams 是指输入数据从流的源数据接收到的 DStream。在入门示例中,lines 是一个输入DStream,因为它代表着从 netcat 服务器接收到的数据的流。每一个输入DStream(除了 file stream 之外)都与与一个 Receiver对象关联,它从数据源中获取数据,并且存储到Spark的内存中用于处理。

Spark Streaming 提供了两种内置的数据源:

  • 基础数据源:在 StreamingContext API 中直接可以使用的数据源。例如:file systems 和 socket connections。
  • 高级数据源:像 Kafka, Flume, Kinesis等等这样的数据源。可以通过额外的工具类来使用。

请注意,如果你想要在你的流处理程序中并行的接收多个数据流,你可以创建多个 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 > 运行接收器的数量。

  • 将逻辑扩展到集群上去运行,分配给 Spark Streaming 应用程序的内核(core)的内核数必须大于接收器(receiver)的数量。否则系统将接收数据,但是无法处理它。

一 基础数据源

我们已经简单地了解过了在 入门示例 中 jssc.socketTextStream("localhost", 9999) 的例子,例子中是通过从一个 TCP socket 连接接收到的文本数据来创建了一个离散流(DStream)。除了 sockets 之外,StreamingContext API 也提供了根据文件作为输入来源创建离散流(DStreams)的方法。

  • File Streams: 用于从文件中读取数据,在任何与 HDFS API 兼容的文件系统中(即,HDFS,S3,NFS 等),一个 DStream 可以通过StreamingContext.fileStream[]创建;从文件读取流数据不需要receiver,因为我们不需要为其分配内核;对于普通的文本文件,我们可以使用StreamingContext.textFileStream(dataDirectory)来创建:
streamingContext.fileStream(dataDirectory);

streamingContext.textFileStream(dataDirectory);

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

  • 文件必须具有相同的数据格式。
  • 一旦开始处理,这些文件必须不能再更改,因此如果文件被连续地追加,新的数据将不会被读取。

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

  • 自定义接收器:DStreams可以通过自定义Receiver接收数据。(自定义Receiver)
  • RDDs队列作为一个DStreams:为了使用测试数据测试 Spark Streaming 应用程序,还可以使用 streamingContext.queueStream(queueOfRDDs) 创建一个基于 RDDs 队列的 DStream,每个进入队列的 RDD 都将被视为 DStream 中的一个批次数据,并且就像一个流进行处理。

二 高级数据源

高级数据源需要使用非 Spark 库中的外部接口,其中一些还需要比较复杂的依赖关系(例如, Kafka 和 Flume)。因此,为了最小化有关的依赖关系的版本冲突的问题,这些资源本身不能创建 DStream 的功能。

请注意,这些高级数据源不能再 Spark shell 中使用。因此我们想要在 Spark shell 中使用它们,必须下载带有它的依赖的相应的 Maven 组件的 JAR ,并且将其添加到 classpath。

一些高级的 sources(数据源)如下.

  • Kafka: Spark Streaming 2.3.1 与 Kafka broker 版本 0.8.2.1 或更高是兼容的。更多细节请参阅 Kafka 集成指南

  • Flume: Spark Streaming 2.3.1 与 Flume 1.6.0 相兼容。更多细节请参阅 Flume 集成指南 

  • Kinesis: Spark Streaming 2.3.1 与 Kinesis Client Library 1.2.1 相兼容。更多细节请参阅 Kinesis 集成指南

三 自定义数据源

我们也可以通过自定义数据源创建输入DStreams。这样我们需要实现一个用户自定义的 receiver 它可以从自定义的数据源中接收数据并且推送它到 Spark。更多细节请参阅 自定义 Receiver 指南。

四 接收器的可靠性

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

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

你可能感兴趣的:(大数据/Spark/Spark,Streaming)