Spark Streaming 中的Sources、Transformations和Output Operation

本文详细介绍了Spark Streaming的核心概念,包括Discretized Streams (DStream)、Input DStreams与Receivers、Output Operations。DStream是Spark Streaming的基础抽象,表示连续的数据流,Input DStreams接收来自各种数据源的输入,如基本和高级数据源。Output Operations如reduceByKeyWindow用于窗口化的计算,提供灵活的数据处理。此外,文章还提到了文件流的监控、状态管理和DataFrame与SQL操作在流处理中的应用。
摘要由CSDN通过智能技术生成

一、Discretized Streams (DStream)

        Discretized Stream(DStream)是Spark Streaming 提供的最基础的抽象。它代表了一个连续不断的数据流,要么从源端接收到的数据流,要么是一个DStream经转换操作而生成的数据流。实际上,一个DStream代表的是Spark中RDD的一个序列(更多细节详见Spark Programming Guide)。每一个DStream中的RDD都包含了确定时间间隔的数据,就像我们如下图展示的那样:


        任何应用于DStream的操作都会转换成对RDD的操作。比如说,在之前的小例子中,我们将一个lines DStream转换成一个words DStream,flatMap操作应用于每一个lines DStream上的RDD,从而产生了words DStream上的RDD。这个过程如下:


        这些底层的RDD转换交由Spark引擎处理,为了方便,DStream操作隐藏了大多数细节并给开发者提供了一套高级别的API,这些操作在之后的章节中会做更加详细的介绍。

二、Input DStreams 和Receivers

        Input DStreams表征的是从流式数据源接收输入数据流的DStreams。在之前的例子中,lines DStreams代表的就是一个从Netcat服务端接收输入数据流的Input DStream,每一个Input DStream(除了file Stream,更多细节在后面会有讨论)都和一个Receiver对象相连接,这个Receiver对象用于从数据源接收数据并将其存储在Spark的内存中便于后续的处理。

    在源码中textFileStream的返回类型是DStream,不需要Receiver,socketTextStream的返回类型是ReceiverInputDStream,需要Receiver

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

        Basic Sources:对于StreamingContext API,数据源是可直接使用的,比如文件系统,或者端口连接。

        Advanced Source:像kafka、flume、Kinesis等数据源,它们需要通过一些额外的实用类才可以访问,这些数据源需要添加一些额外的依赖,如之前linking 章节讨论的那样。

        请注意:如果你想在你的Streaming应用中并行的接收多个流式数据,你可以创建多个Input DStreams(将在Performance Tuning中讨论),这个操作意味着会创建多个Receiver来同时接收多个数据流。但是,请注意Spark Worker/Executor是一个长服务,因此它需要占用一个core用于连接Spark Streaming 应用程序,因此,我们需要记住的十分重要的一点是,Spark Streaming应用程序需要有足够的的core用于处理数据接收和运行Receiver。

Points to remember

        当你在本地运行一个Spark Streaming 应用程序,请不要使用local 或者local[1]作为Master URL,他们都意味着你在本地运行任务时,只会启动一个线程,如果你使用的Input DStream是基于Receiver(比如网络端口、kafak、flume等),这个线程仅仅用来运行Receiver,这样就没有多余的线程用处理接收到的数据。因为,当你想要在本地运行Spark Streaming应用程序时,使用local[n]作为Master URL,n值必须大于Receiver的数量(在Spark Properties可查阅更多关于设置Master的信息)。

        当你在集群上运行Spark Streaming应用程序时也是一样,core数必须大于Receiver数,否则系统只接受数据而不处理数据。

File Streams

    为了读取任何兼容HDFS的文件系统上的数据,比如HDFS、S3、NFS等,一个DStream可以通过StreamingContext.fileStream[keyClass,valueClass,inputFormatClass]创建。

File Streams不需要运行Receiver,所以接收file数据不必分配core。

        对于一个简单的text File,最简单的方法是StreamingContext.textFileStream(dataDirectory)。

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

        也可以

streamingContext.textFileStream(dataDirectory)

目录是如何被监控的:

        Spark Streaming将会监控dataDirectory目录并处理该目录下创建的所有文件。

        当一个像“hdfs://namenode:8040/logs/”的目录被监控时,只要这个目录下的文件被发现就会被处理。

        可以提供POSIX glob pattern模式,例如“hdfs://namenode:8040/logs/2017/*”,在这里,DStream将会与该模式匹配的目录之中的所有文件组成,也就是说,它是目录的模式,而非目录中文件的模式。(别问我这句话啥意思,我真特么不知道啊,把原文贴一下你们自己看:POSIX glob pattern can be supplied, such as "hdfs://namenode:8040/logs/2017/*". Here, the DStream will consist of all files in the directories matching the pattern. That is: it is a pattern of directories, not of files in directories.

##这儿大家测一下目录中的子文件夹中的文件能否被监控到啊?

        所有的文件必须格式相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

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

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

打赏作者

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

抵扣说明:

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

余额充值