原文网站:
http://spark.apache.org/docs/latest/streaming-programming-guide.html
本篇译文链接:
http://spark.apache.org/docs/latest/streaming-programming-guide.html#input-dstreams-and-receivers
输入的Dstream表示从流资源所输入的流数据的Dstream(译者加:之所以叫输入的Dstream应该是为了和转换之后或者输出的Dstream进行区分)。在我们之前的例子中(http://spark.apache.org/docs/latest/streaming-programming-guide.html#a-quick-example),Dstream line表示从netcat服务器中解析的数据流。每个输入的数据流(除了文件流,后面会讨论)都和一个接受器相关联,接收器会负责接收数据并将其存储在spark的内存当中,以便后面进行处理。
spark streaming内置的数据源处理种类包括两种:
基础源:StreamingContext API直接支持的源,包括文件系统、socket连接等;
高级源:通过额外的扩展支持诸如kafka、flume、kinesis等,在连接(http://spark.apache.org/docs/latest/streaming-programming-guide.html#linking)中有讨论支持方式。
我们将在后续的文章中介绍下每个类别中某些源的处理方式。
如果你需要在你的流处理项目中同时处理不同种类的数据源,你可以创建多个种类的DStream(后续会进行讨论,http://spark.apache.org/docs/latest/streaming-programming-guide.html#level-of-parallelism-in-data-receiving)。这也会导致项目创建多个接收器以便同时接收不同种类的数据。但是,因为spark的处理器/执行器是一个长期的任务,因而他(接收器)也会占用一个内核。因而,在启动项目的时候一定要记得分配足够的内核。
需要注意:
a.当在本地运行spark streaming的时候,不要将master url设置为local或者local[1],因为这两者都只会启动一个线程执行程序。如果你使用的Dstream依赖于接收器(例如socket,kafka,flume等),这时候这个线程会被接收器占用,而没有线程对数据进行处理。因此如果进行本地运行的时候,一定要将master url设置为local[n],其中n要大于接收器的数量。
b.将上面的逻辑扩展到集群运行的方式是同样的原理。
基础源
在之前的例子中,我们已经看到通过使用方法 ssc.socketTextStream()可以接收tcp socket连接的数据。除了socket的方式之外,StreamingContext API 也提供了对于文件的处理。
1)文件流
对于兼容hdfs api的文件系统(包括hdfs,s3,nfs等),我们都可以创建对应的Dstream。创建方法为:
spark streaming 通过监控文件夹dataDirectory可以感知并且处理该目录下新建的文件(在子目录下的文件无法感知)。需要注意:
a.所有的文件的内容格式必须一致;
b.文件必须是moving过来或者重命名得到的;
c.文件一旦创建之后是不允许被改变的。因此如果文件是不断append得到的,新的数据是看不到的。
对于文本文件,有一个更简洁的读取方式streamingContext.textFileStream(dataDirectory)。因为文件流的读取不需要接收器,因而不需要额外的内核。
对于python api,fileStream是不可用的。
2)通过自定义获取的流数据
Dstream可以通过自定义的接收器来处理,参见:http://spark.apache.org/docs/latest/streaming-custom-receivers.html
3)通过rdd队列生成的流数据
通过调用api streamingContext.queueStream(queueOfRDDs),我们可以根据rdd队列生成Dstream。队列中每个rdd都会被认为是数据流的一小块进行处理。
可以参见 http://spark.apache.org/docs/latest/api/python/pyspark.streaming.html#pyspark.streaming.StreamingContext更多内容。
高级源
这些高级源需要非spark库的扩展支持,有些有非常复杂的依赖关系。因而为了减少这些依赖的冲突,根据这些源创建Dstream的功能已经被移至单独的库里面http://spark.apache.org/docs/latest/streaming-programming-guide.html#linking。
因为这些高级源在spark shell中是不可用的,因而不可用sparkshell对这些功能进行测试。如果你非常希望spark shell对这些高级源支持,那需要你额外下载对应的maven artifact jar以及相关的依赖,并且添加到对应的路径中。支持的高级源如下:
a.kafka spark streaming 2.0.1兼容kafka的版本为0.8.2.1及其更高的版本。参见:http://spark.apache.org/docs/latest/streaming-kafka-integration.html
b.flume spark streaming 2.0.1兼容的flume版本为1.6.0,参见:http://spark.apache.org/docs/latest/streaming-flume-integration.html
c.kinesis spark streaming 2.0.1兼容kinesis客户端库的版本为1.2.1,参见http://spark.apache.org/docs/latest/streaming-kinesis-integration.html
自定义源
python api还不支持。
输入的Dstream也可以通过自定义的数据源来生成,这就需要你来自定义一个接收器,并且该接收器能够接收自定义源的数据并将其推送到spark中,详细方法参见:http://spark.apache.org/docs/latest/streaming-custom-receivers.html
接收器的可靠性
如果根据接收器的可靠性,我们可以把数据源分成两类。像kafka和flume的这些源会对传输的数据进行确认。如果系统从这类数据源接收数据,则可以保证数据的准确性。所以会有如下两类的接收器:
a.可靠的接收器
可靠的接收器会向依赖的数据源发送确认消息。
b.不可靠的接收器
不可靠的接收器不会确认数据源的准确性。这类接收器可以用于那些不支持准确传输的源,亦或者不想进行确认。
如何编写可靠的接收器可以参见:http://spark.apache.org/docs/latest/streaming-custom-receivers.html