开发者学堂课程【大数据Spark2020版(知识精讲与实战演练)第五阶段:SparkStreaming 原理_DStream 的有向无环图】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/692/detail/12136
SparkStreaming 原理_DStream 的有向无环图
内容介绍:
一、DAG 的定义
二、RDD 与 DStream 的区别
三、DStream 原理的组建
一、DAG 的定义
DAG 也叫有向无环图,有向无环图(DAG)=>数据的处理是一环扣着一环的,数据的处理是分步骤的,这叫有向,数据的处理不能首尾交接,如果首尾交接的话就会形成无限循环的执行,这叫做无环。
举例来说,在把数据转换成一种形态的时候,需要分为十个步骤,每一个步骤之间可以连接起来,最终可以生成一个结果,这个结果就可能要把这两个步骤数据集给结合起来,这样的是有项的图。
有向无环图就代表数据的处理是有方向的,但是不能收尾相接。
如果是 RDD 的 wordCount ,代码大致如下
val textRDD = sc.textFile( ...)
val splitRDD = textRDD. flatMap (_.split("“))
val tupleRDD = splitRDD . map((_, 1))
val reduceRDD = tupleRDD . reduceByKey(_ + _)
用图形表示如下(可以理解为有向无环图)
同样, DStream 的代码大致如下
val lines : Dstream [ String] = ssc.socketTextStream( . . .)
val words : DStream[String] = lines . flatMap(_.split(" ") )
val wordCounts : DStream[ (String,Int)] = words . map(x => (x,1)) . reduceByKey(_+ _)
同理, DStream 也可以形成 DAG 如下
看起来 DStream 和 RDD 很相似。
1.DStream 内部是由 RDD 组成的
2.DStream 本身也是可以组成 DAG 的,因为 DStream 通过一些转换算子,也是生成了新的 DStream
提问:DStream 内部的 RDD 之间有没有 DAG 呢?
二、RDD 与 DStream 的区别
val dstream1 = ssc.socketText0
val dstream2 = dstream1.map
val dstream3 = dstream2.flatmap
第—个 RDD
val rdd1 = ..
val rdd2 = rdd1.map
val rdd3 = rdd2.flatmap
第二个 RDD
val rdd1 = ...
val rdd2 = rdd1.mapval
rdd3 = rdd2.flatmap
整个 RDD 的有向无环图,最终构成一个逻辑上的 DStream 有向无环图。每一个RDD 都有相应的有向无环图。
●DStream 的数据是不断进入的,RDD 是针对一个数据的操作
●像 RDD 一样,DStream 也有不同的子类,通过不同的算子生成
●一个 DStream 代表一个数据集,其中包含了针对于上一个数据的操作
●DStream 根据时间切片,划分为多个 RDD ,针对 DStream 的计算函数,会作用于每一个 DStream 中的 RDD
三、DStream 原理的组建
搜索“DstreamGrpha ”,可以将 DstreamGraph 理解为是 Dstream 的一个图,Dstream 的 DAG 通过 DstreamGraph 生成,这个图表示了 Dstream 的有向无环图是如何构成的。
DstreamGraph 是先进行定义,然后用 start 进行运行,可以使用 stop 停止运行,可以用 setBatchDuration 指定每个批次的时间间隔,也可以指定入口addInputStream 和出口 addOutputstream
●每个 DStream 都有一个关联的 DStreamGraph 对象
●DstreamGraph 负责表示 DStream 之间的的依赖关系和运行步骤
●DStreamGraph 中会单独记录 InputDStream 和 OutputDStream