Spark Streaming 原理(一)

(一)Spark执行原理

一个应用Application由一个任务控制节点Driver和若干个作业Job构成,一个作业由多个阶段Stage构成,一个阶段由多个任务Task组成TaskSet

当执行一个应用时,任务控制节点会向集群管理器ClusterManager申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行task。

二:SparkStreaming原理

 1)整体流程

Spark Streaming 是基于spark的流式批处理引擎,其基本原理是把输入数据以某一时间间隔批量的处理(微批次),当批处理间隔缩短到秒级时,便可以用于处理实时数据流。其实就是把流式计算当作一系列连续的小规模批处理来对待!其实就是用批处理(小批次)的思想来做流处理

Spark Streaming中,会有一个接收器组件Receiver,作为一个长期运行的task跑在一个Executor上。每个Receiver都会负责一个input DStream(比如从文件中读取数据的文件流,比如套接字socket流,或者从Kafka中读取的一个输入流等等)。Spark Streaming通过input DStream与外部数据源进行连接,读取相关数据。

Spark Streaming从各种输入源中读取数据,并把数据分组为小的批次。新的批次按均匀的时间间隔创建出来。在每个时间区间开始的时候,一个新的批次就创建出来,在该区间内收到的数据都会被添加到这个批次中。在时间区间结束时,批次停止增长。

时间区间的大小是由批次间隔这个参数决定的。批次间隔一般设在500毫秒到几秒之间,由应用开发者配置。

每个输入批次都形成一个RDD,以 Spark 作业的方式处理并生成其他的 RDD。

处理的结果可以以批处理的方式传给外部系统。

Spark Streaming的工作流程像下面的图所示一样,接受到实时数据后,给数据分批次,然后传给Spark Engine处理最后生成该批次的结果。

​​​​​​​2)计算流程

通过上面的学习我们知道了Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是还是SparkCore

Spark Streaming为每个输入源启动对应的接收器。

接收器以任务task的形式运行在应用的执行器进程(Executor)中,并将接收到的数据按照batch size(如5秒)分成一段一段的数据RDD,这些离散的RDD数据放一起统称为DStream(Discretized Stream)

每一段数据都转换成Spark中的RDD,然后将Spark Streaming中对DStream的Transformation操作变为针对Spark中对RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。也就是开发者对DStream进行的操作就是对RDD进行的操作

驱动器程序中的 StreamingContext 会周期性地运行 Spark 作业来处理这些数据,把数据与之前时间区间中的 RDD 进行整合

当然整个流式计算根据业务的需求可以对中间的结果进行缓存或者存储到外部设备。

注意:

    上图中,工作节点中的task总共最少需要2个

    一个作为接收器源源不断的接收数据

    一个作为运行器,处理/计算划分好的一个个的数据批次RDD

3)​​​​​​​​​​​​​​容错性

对于流式计算来说,容错性至关重要。首先我们要明确一下Spark中RDD的容错机制。

--RDD的依赖关系/血统让RDD的操作具备容错性,如果某一个分区的数据丢失/计算失败,可以根据依赖关系顺藤摸瓜找到父RDD,重新计算即可

对于Spark Streaming来说,其RDD的传承关系如下图所示:

图示说明

每一个椭圆形表示一个RDD

椭圆形中的每个圆形代表一个RDD中的一个Partition分区

每一列的多个RDD表示一个DStream(图中有三列所以有三个DStream)

每一行最后一个RDD则表示每一个Batch Size所产生的中间结果RDD

容错原理

从底层原理来看:每一个RDD都是一个不可变的分布式可重算的数据集,lineage记录着确定性的操作依赖关系,所以只要输入数据是可容错的,那么任意一个RDD的分区(Partition)出错或不可用,都是可以利用原始输入数据通过转换操作而重新算出的。 我们可以看到图中的DStream由RDD构成,每一个RDD都是通过lineage相连接的,所以是可容错的!

从数据来源来看:Spark Streaming输入数据可以来自于磁盘,例如HDFS或网络数据流,一般来自于Kafka

HDFS的数据本来就是多副本,天然容错;网络输入的数据Spark Streaming也会将每一个数据流拷贝两份到其他的机器以保证容错性,所以RDD中任意的Partition出错,都可以并行地在其他机器上将缺失的Partition计算出来。这种容错恢复方式比连续计算模型(如Storm)的效率更高。

总结:SparkStreaming的数据源一般是容错的,对于数据的处理底层是RDD,也是容错的,所以最终SparkStreaming是容错的!

​​​​​​​4)准实时性

对于实时性的讨论,会牵涉到流式处理框架的应用场景。

Spark Streaming将流式计算分解成多个Spark Job,对于每一时间段数据的处理都会经过Spark DAG图分解以及Spark的任务集的调度过程。

对于目前版本的Spark Streaming而言,其最小的Batch Size的选取在0.5~5秒钟之间(Storm目前最小的延迟是100ms左右)

所以Spark Streaming能够满足流式准实时计算场景(对实时性要求非常高的如高频实时交易场景则不太适合)

    

​​​​​​​(三) Spark Streaming数据抽象

​​​​​​​1:什么是DStream

DStream(Discretized Stream,离散化数据流,连续不断的数据流)是Spark Streaming的基础抽象,代表持续性的数据流和经过各种Spark算子操作后的结果数据流

可以从以下多个角度深入理解DStream

1).DStream本质上就是一系列时间上连续的RDD

准确来说是每隔一小段时间生成一个RDD,包含该段时间间隔内的数据

2).对DStream的数据的进行操作也是按照RDD为单位来进行的

3).DStream和DStream之间存在依赖关系,在一个固定的时间点,存在依赖关系的DSrteam对应的RDD也存在依赖关系,每个一个固定的时间,其实生产了一个小的DAG,周期性的将生成的小DAG提交到集群中运行

4).Spark Streaming使用数据源产生的数据流创建DStream,也可以在已有的DStream上使用一些操作来创建新的DStream

总结

简单来说DStream就是对RDD的封装,你对DStream进行操作,就是对RDD进行操作

对于DataFrame/DataSet/DStream来说本质上都可以理解成RDD

​​​​​​​2:DStream相关操作

DStream上的操作与RDD的类似,分为Transformations(转换)和Output Operations(输出)/Action两种,

Transformations转换操作中还有一些比较特殊的操作,如:updateStateByKey()、transform()以及各种Window相关的操作

​​​​​​​  1)Transformations

常见Transformation

无状态转换:每个批次的处理不依赖于之前批次的数据

Transformation

Meaning

map(func)

对DStream中的各个元素进行func函数操作,然后返回一个新的DStream

flatMap(func)

与map方法类似,只不过各个输入项可以被输出为零个或多个输出项

filter(func)

过滤出所有函数func返回值为true的DStream元素并返回一个新的DStream

repartition(numPartitions)

增加或减少DStream中的分区数,从而改变DStream的并行度

union(otherStream)

将源DStream和输入参数为otherDStream的元素合并,并返回一个新的DStream.

count()

通过对DStream中的各个RDD中的元素进行计数,然后返回只有一个元素的RDD构成的DStream

reduce(func)

对源DStream中的各个RDD中的元素利用func进行聚合操作,然后返回只有一个元素的RDD构成的新的DStream.

countByValue()

对于元素类型为K的DStream,返回一个元素为(K,Long)键值对形式的新的DStream,Long对应的值为源DStream中各个RDD的key出现的次数

reduceByKey(func, [numTasks])

利用func函数对源DStream中的key进行聚合操作,然后返回新的(K,V)对构成的DStream

join(otherStream, [numTasks])

输入为(K,V)、(K,W)类型的DStream,返回一个新的(K,(V,W)类型的DStream

cogroup(otherStream, [numTasks])

输入为(K,V)、(K,W)类型的DStream,返回一个新的 (K, Seq[V], Seq[W]) 元组类型的DStream

transform(func)

通过RDD-to-RDD函数作用于DStream中的各个RDD,可以是任意的RDD操作,从而返回一个新的RDD

特殊的Transformations--是我们要新学习的

有状态转换:当前批次的处理需要使用之前批次的数据或者中间结果。有状态转换包括基于追踪状态变化的转换(updateStateByKey)和滑动窗口的转换

1.UpdateStateByKey(func)

2.Window Operations开窗函数

​​​​​​​2)Output/Action

Output Operations可以将DStream的数据输出到外部的数据库或文件系统

当某个Output Operations被调用时,spark streaming程序才会开始真正的计算过程(与RDD的Action类似)

Output Operation

Meaning

print()

打印到控制台

saveAsTextFiles(prefix, [suffix])

保存流的内容为文本文件,文件名为"prefix-TIME_IN_MS[.suffix]".

saveAsObjectFiles(prefix,[suffix])

保存流的内容为SequenceFile,文件名为 "prefix-TIME_IN_MS[.suffix]".

saveAsHadoopFiles(prefix,[suffix])

保存流的内容为hadoop文件,文件名为"prefix-TIME_IN_MS[.suffix]".

foreachRDD(func)

对Dstream里面的每个RDD执行func

​​​​​​​(四)总结

猜你喜欢

转载自blog.csdn.net/qq_38483094/article/details/98885928