(版本定制)第14课:Spark Streaming源码解读之State管理之updateStateByKey和mapWithState解密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(版本定制)第14课:Spark Streaming源码解读之State管理之updateStateByKey和mapWithState解密相关的知识,希望对你有一定的参考价值。

本期内容:

    1、updateStateByKey解密

    2、mapWithState解密

背景:
整个Spark Streaming是按照Batch Duractions划分Job的。但是很多时候我们需要算过去的一天甚至一周的数据,这个时候不可避免的要进行状态管理,而Spark Streaming每个Batch Duractions都会产生一个Job,Job里面都是RDD,

所以此时面临的问题就是怎么对状态进行维护?这个时候就需要借助updateStateByKey和mapWithState方法完成核心的步骤。


1、简单看下updateStateByKey源码:

     在DStream中updateStateByKey和mapWithState是通过隐式转换来完成,本身没有这样的方法。

implicit def toPairDStreamFunctions[K, V](stream: DStream[(K, V)])
   (
implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null):
 PairDStreamFunctions[
K, V] = {
new PairDStreamFunctions[K, V](stream)
}
[: ClassTag](
    updateFunc: ([]Option[]) => Option[]
  ): DStream[()] = ssc.withScope {
  updateStateByKey(updateFuncdefaultPartitioner())
}

最终会通过StateDStream中的computeUsingPreviousRDD和compute来完成这样的功能,简单的流程图如下:

技术分享

2、简单看下mapWithState源码

mapWithState是返回MapWithStateDStream对象,维护和更新历史状态都是基于Key,使用一个function对key-value形式的数据进行状态维护

[: ClassTag: ClassTag](
    spec: StateSpec[]
  ): MapWithStateDStream[] = {
MapWithStateDStreamImpl[](
    selfspec.asInstanceOf[StateSpecImpl[]]
  )
}

通过InternalMapWithStateDStream类中的compute来完成,简单的流程图如下:

技术分享

备注:

资料来源于:DT_大数据梦工厂(Spark发行版本定制)

更多私密内容,请关注微信公众号:DT_Spark

如果您对大数据Spark感兴趣,可以免费听由王家林老师每天晚上2000开设的Spark永久免费公开课,地址YY房间号:68917580


本文出自 “DT_Spark大数据梦工厂” 博客,请务必保留此出处http://18610086859.blog.51cto.com/11484530/1784090

以上是关于(版本定制)第14课:Spark Streaming源码解读之State管理之updateStateByKey和mapWithState解密的主要内容,如果未能解决你的问题,请参考以下文章

(版本定制)第12课:Spark Streaming源码解读之Executor容错安全性

(版本定制)第16课:Spark Streaming源码解读之数据清理内幕彻底解密

(版本定制)第11课:Spark Streaming源码解读之Driver中的ReceiverTracker彻底研究和思考

(版本定制)第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析

(版本定制)第15课:Spark Streaming源码解读之No Receivers彻底思考

(版本定制)第10课:Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考