Spark之SparkStreaming-Input DStreams and Receivers

一、Input DStreams and Receivers

  Input DStreams是表示从源数据接收的数据流的DStream。 在wordcount案例中,lines是一个Input DStream,因为它表示从netcat的9999端口接收的数据流。 每个输入DStream(文件流除本节稍后讨论)与Receiver(Scala doc,Java doc)对象相关联,该对象从源接收数据并将其存储在Spark的内存中进行处理。

Spark Streaming提供了两类内置的streaming sources。

  basic source:StreamingContext API中直接提供的资源。示例:file systems, and socket connections。
  Advanced sources:像kafak,Flume, Kinesis等等,可以通过外部的实用工具类来获得。这些需要链接到链接部分中讨论的额外依赖关系。
我们将在本节稍后讨论每个类别中的一些来源。

请注意,如果要在流式应用程序中并行接收多个数据流,则可以创建多个 Input DStream(在“性能调优”部分进一步讨论)。这将创建多个receiver,同时接收多个数据流。但是请注意,Sparkworker/executor是一个长期运行的任务,因此它占据分配给Spark Streaming应用程序的核心之一。因此,重要的是要记住,Spark Streaming应用程序需要分配足够的内核(或线程,如果在本地运行)来处理接收到的数据,以及运行接收器(所以将内核数设置多些)。

Points to remember

  当本地运行Spark Streaming程序时,不要使用“local”或“local [1]”作为master URL。 这两者意味着只有一个线程将用于在本地运行任务。 如果您正在使用基于receiver(e.g. sockets, Kafka, Flume, etc)的Input DStream,则单线程将用于运行接收器,不会留出线程来处理接收到的数据。 因此,当在本地运行时,始终使用“local [n]”作为master URL,其中n>要运行的接收器数量(有关如何设置主机的信息,请参阅Spark属性)。
  将逻辑扩展到在集群上运行,分配给Spark Streaming应用程序的core数量必须大于接收器数量。 否则系统将收到数据,但无法处理它。

1.1、Basic Sources

使用jssc.socketTextStream(...)通过TCP Socket接收的文本数据创建了一个DStream。 除了Socket之外,StreamingContext API提供了从文件创建DStreams作为Input Source的方法。

FileStream:用于从与HDFS API(即HDFS,S3,NFS等)兼容的任何文件系统上的文件读取数据,DStream可以创建为:

 streamingContext.fileStream<KeyClass, ValueClass, InputFormatClass>(dataDirectory);

Spark Streaming将监视目录dataDirectory并处理在该目录中创建的任何文件(不支持嵌套目录中写入的文件)。 注意:
  文件必须具有相同的数据格式
  必须通过将数据原子移动或重命名到数据目录中,在dataDirectory中创建文件。
  移动后,文件不能更改。 因此,如果文件被不断附加,则不会读取新的数据。
对于简单的文本文件,有一个更容易的方法streamingContext.textFileStream(dataDirectory)。 而文件流不需要运行接收器,因此不需要分配内核。

Streams based on Custom Receivers:可以通过自定义接收器接收的数据流创建DStream。

Queue of RDDs as a Stream::为了使用测试数据测试Spark Streaming应用程序,还可以使用streamingContext.queueStream(queueOfRDDs)创建基于RDD队列的DStream。 推送到队列中的每个RDD将被视为DStream中的一批数据,并像流一样处理。

1.2、Advanced Sources

  这种类别的源需要与外部非Spark库进行连接,其中一些具有复杂的依赖关系(例如Kafka和Flume)。 因此,为了最小化与依赖关系的版本冲突相关的问题,从这些源创建DStream的功能已被移动到可以在必要时显式链接到单独的库。

请注意,这些高级源在Spark shell中不可用,因此在shell中无法测试基于这些高级源的应用程序。 如果您真的想在Spark shell中使用它们,则必须下载相应的Maven artifact’s JAR及其依赖项,并将其添加到类路径中。

1.3、Custom Sources

也可以通过自定义数据源创建输入DStream。 所有你需要做的是实现一个用户定义的接收器(请参见下一部分来了解是什么)可以从自定义源接收数据并将其推入到Spark中。 See the Custom Receiver Guide for details.

1.4、Receiver Reliability

  基于可靠性可以有两种数据源。 来源(如Kafka和Flume)允许传输的数据被确认。 如果从这些可靠来源接收数据的系统正确地确认接收到的数据,则可以确保由于任何种类的故障而不会丢失任何数据。 这导致两种接收器:

Reliable Receiver - 当数据已被接收并且通过复制存储在Spark中时,可靠的接收器正确地向可靠的源发送确认。
Unreliable Receiver - 不可靠的接收器不向源发送确认。 这可以用于不支持确认的源,或者甚至当不想要或需要进入确认的复杂性时,用于可靠的源。
Custom Receiver Guide.中讨论了如何编写可靠接收器的细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值