Spark流编程指引(四)---------------------------DStreams基本模型,输入DStreams和接收者

离散流(DStreams)

离散流或者称为DStreams是Spark流编程提供的基本抽象。它代表了持续的数据流,从一个数据源接收到的数据流或者是在一个输入流上应用转变操作处理后的数据流。

在内部实现上,DStream代表了一系列连续的RDDs.RDDs是Spark对不可变的,分布式数据集的抽象。DStream中的每个RDD包含了一定间隔内的数据,正如下图所示:

任何应用在DStream上的操作都会被转换成应用在底层RDD上的操作。比如,在前面介绍的转换一个行流到单词流的的例子里,flatMap操作作用在lines DStream上的每个RDDs上,然后产生了words DStream的RDDs。正如下图所示:

这些底层的RDD转换操作被Spark引擎计算。DStreams隐藏了大部分的细节,提供给开始者便捷地高层次的API。


输入DStreams和接收者

DStreams中的输入DStreams代表了从源流中接收到的输入数据流。在前面的例子中,lines就是一个输入DStreams,它代表了从网络服务器中接收到的数据流。

每个输入DStreams都与一个接收对象相关。这个接收对象从一个源中接收数据并存储在Spark内存中用于以后的处理。

SPark流提供了两种内置的源流:

1.基本的源:StreamingContext API直接可用的源,比如:文件系统,socket连接,和Akka actors

2.高级源:一些源比如:Kafka, Flume, Kinesis, Twitter。需要通过额外的实用工具类来支持。在上一节的链接章节中有说明。

接下来,我们将要讨论两种类型中的一些源。

注意:如果你想要在你的流程序里并行地接收多个流的数据,你可以创建多个输入的DStreams.这将会创建多个接收者同时从多个数据流中接收数据。但是注意SPark worker/executor作为一个长期运行的任务,这样做将会占用分配给Spark流程序的一个cpu核心。所以,要记住给Spark流程序分配足够的CPU(线程数,如果是本地模式),以便处理接收到的数据和运行接收者程序。

需要记住的关键点:

1.当在本地运行Spark流程序时,不要使用"local"或者"local[1]"作为master URL。因为,这意味着只用一个线程运行本地任务。如果你在使用一个基于接收者(如sockets, Kafka, Flume)的输入DStream,这个线程将会被用来运行接收者任务,就不会有线程来处理接收到的数据。所以,当运行在本地模式时,总是应该使用"local[n]"作为master URL,n要大于运行的接收都个数。

2.同样的道理,当运行在集群模式时,分配给Spark流程序的核心数也必须大于接收者的个数。否则,系统将只会接收数据,但是确不能处理数据。


基本的源:

在上一节的例子中,我们创建了一个DStream从一个TCP连接中接收文本数据。在例子中,我们看到了ssc.socketTextStream(...)的用法。除sockets外,Spark的Streaming API还提供了以文件和Akka actors作为输入源来创建DStreams的方法。

文件流:

为了从任何与HDFS API兼容的文件系统(如HDFS,S3,NFS等)的文件中读取数据,一个DStream可以用以下的方式创建:

  streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory)

Spark流将会监控dataDirectory指明的目录,并处理目录下任何文件的创建事件(嵌套目录还不支持)。注意以下几点:

1.所有文件必须有相同的数据格式

2.在dataDirectory下创建的文件必须是通过原子的移动或重命名操作。

3.一旦被移动了,文件就不能被修改。就是说如果文件正在被持续的写入,新的数据将不会被读取。

对于简单的文本文件,有一个更简单的方法streamingContext.textFileStream(dataDirectory)。另外,文件流不需要执行一个接收者,所以不需要分配核心。

对于pythonAPI,文件流还不支持,只支持textFileStream方法。


基于典型的Actors的流:

可以通过使用streamingContext.actorStream(actorProps, actor-name)方法创建从Akka actors接收数据流的DStreams。

对于pythonAPI,由于actors只在JAVA和Scala库里支持,所以actorStream还不支持python.


将RDDs队列当作流:

为了用测试数据测试Spark Streaming应用程序,我们可以基于一个RDDs队列来创建一个DStream,通过使用streamingContext.queueStream(queueOfRDDs)方法。加入到队列中的每个RDD都会被当成DStream的一个批次的数据,以流的方式被处理。

想要了解更多的关于基于sockets, files, 和actors的流的细节。可以查看相关的API文档:StreamingContext for Scala, JavaStreamingContext for Java, and StreamingContext for Python.


高级源:

使用这类的源需要非Spark的外部接口,其中的一些源需要复杂的依懒(如Kafka 和 Flume)。所以,为了尽量减少依懒间的版本冲突问题,从这些源创建DStream的功能被划分到不同的库中。这样就可以根据需要明确地链接不同的库。比如,想要从Twitter的tweets流中创建一个DStream,你需要做如下几步:

1.链接:向SBT或Maven工程添加坐标为spark-streaming-twitter_2.10的依懒。

2.编程:导入TwitterUtils类,并照下面的方法用TwitterUtils.createStream创建一个DStream。

3.部署:生成一个包含所有依懒的JAR包,然后部署应用。我们将在后面“部署应用”一节中详细介绍部署相关的知识。

import org.apache.spark.streaming.twitter._

TwitterUtils.createStream(ssc, None)
注意:这些高级源在Spark Shell里不可用,所以不能在shell里测试基于这些源的应用程序。如果你真的想在Spark Shell里使用它们,你必须下载依懒的相关Maven JAR包,并添加到CLASSPATH。

下面是关于一些高级源的说明:


自定义源:

python还不支持。

也可以通过自定义源来创建输入DStreams.你需要实现一个receiver方法用来从自定义的源中接收数据,并将其压入Spark。查看Custom ReceiverGuide以获取更多信息。

接收者的可靠性:

基于可靠性,有两种数据源。一些源(如Kafka 和 Flume)允许对传送的数据进行确认。如果从这些可靠数据源接收数据的系统正确地确认了接收到的数据,就可以保证没有因为任何错误而丢失数据。这就产生了两种类型的接收者:

1.可靠的接收者:一个可靠的接收者正确地确认了一个可靠的源,数据已经被接收并以备份地形式存储到Spark中。

2.不可靠的接收者:这些源的接收者不支持确认。甚至对于一个可靠的源,可以实现一个不进行复杂确认的不可靠的接收者。

怎样开发一个可靠的接收者,可以参考Custom Receiver Guide


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self-motivation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值