关于Dstream的转化操作的详细解释

关于Dstream的转化操作的详细解释_第1张图片
众所周知,在SparkCore中,RDD支持Transform和Action两种类型的算子操作,同样的,作为代表了一系列连续 RDD序列的DStream,同样也有相应的操作,如下图所示:
关于Dstream的转化操作的详细解释_第2张图片
在此,我着重讲一下Dstream的转化操作。
DStream的转化操作可以分为无状态(stateless)和有状态(stateful)两种。

无状态转化操作

无状态的转化操作,就是把简单的RDD转化操作应用到每个批次上,也就是转化DStream中的每一个RDD。部分无状态转化操作列在了下表。
注意,针对键值对的DStream转化操作(比如reduceByKey())要添加import.StreamingContext._ 才能在scala中使用。和RDD一样,在Java中需要通过mapToPair()创建出一个JavaPairDStream 才能使用。

函数名称 目的 Scala示例 用来操作DStream[T]的用户自定义函数的函数签名
map() 对DStream中的每个元素应用给定函数,返回由各元素输出的元素组成的DStream ds.map(x => x+1) f:(T) -> U
flatMap() 对DStream中的每个元素应用给定函数,返回由铬元素输出的迭代器组成的DStream ds.flatMap(x => x.split("\t") f:T -> Iterable[U]
filter() 返回由给定DStream中通过筛选的元素组成的DStream ds.filter(x => x!=1) f:T -> T
repartition() 改变DStream的分区数 ds.repartition(10) N/A
reduceByKey() 将每个批次中键相同的记录归约 ds.reduceByKey((x,y) => x+ y) f:T,T->T
groupByKey() 将每个批次中的记录根据键分组 ds.groupByKey() N/A

需要记住的是,尽管这些函数看起来作用在整个流上一样,但事实上每个DStream在内部都是由许多RDD(批次)组成,且无状态转化操作是分别应用到每个RDD上的。例如,reduceByKey()会归约每个时间分区中的数据,但不会归约不同分区之间的数据。我们稍后会讲的有状态的转化操作则会整合不同时间分区内的数据。

无状态转化操作也能在多个DStream间整合数据,不过也是在各个时间区间内。例如,键值对DStream拥有和RDD一样的与连接相关的转换操作,也就是cogroup()、leftOuterJoin()等。我们可以在DStream上使用这些操作,这样就对每个批次分别执行了对应的RDD操作。
如果这些无状态转化操作不够用,DStream还提供了一个叫做transform()的高级操作符,可以让你直接操作其内部的RDD。这个transform()操作允许你对DStream提供任意一个RDD到RDD的函数。这个函数会在数据流中的每个批次中被调用,生成一个新的流。transform()的一个常见应用就是重用你为RDD写的批处理代码。例如,如果你有一个叫做extractOutliers()的函数,用来从一个日志记录的RDD中提取出异常值的RDD,你就可以在transform()中重用他。

有状态转化操作

DStream的有状态转化操作时跨时间区间跟踪数据的操作,也就是说,一些先前批次的数据也可以被用来在新的批次中计算结果。主要的两种类型是滑动窗口和updateStateByKey(),前者以一个时间阶段为滑动窗口进行操作,后者则用来跟踪每个键的状态变化。

滑动窗口

滑动窗口转换操作的计算过程如下图所示,我们可以事先设定一个滑动窗口的长度(也就是窗口的持续时间),并且设定滑动窗口的时间间隔(每隔多长时间执行一次计算),然后,就可以让窗口按照指定时间间隔在源DStream上滑动,每次窗口停放的位置上,都会有一部分DStream被框入窗口内,形成一个小段的DStream,这时,就可以启动对这个小段DStream的计算。
关于Dstream的转化操作的详细解释_第3张图片

UpdateStateByKey

以DStream中的数据进行按key做reduce操作,然后对各个批次的数据进行累加
在有新的数据信息进入或更新时。能够让用户保持想要的不论什么状。使用这个功能须要完毕两步:

  1. 定义状态:能够是随意数据类型
  2. 定义状态更新函数:用一个函数指定怎样使用先前的状态。从输入流中的新值更新状态。
    对于有状态操作,要不断的把当前和历史的时间切片的RDD累加计算,随着时间的流失,计算的数据规模会变得越来越大。

。。。。

手打不易,转载请注明,谢谢!!!

你可能感兴趣的:(spark,基础知识)