spark streaming programming guide 基础概念之输入离散流和接收方(三d)

本文介绍了Apache Spark Streaming中的数据源类型,包括基础源如文件系统和socket连接,以及高级源如Kafka、Flume和Kinesis。还讨论了自定义数据源的方法以及输入DStream的概念,并解释了可靠性和不可靠接收器的区别。

原文网站:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值