Spark状态管理State的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Spark状态管理State的应⽤
场景描述
如果⼀个task在处理过程中挂掉了,那么它在内存中的状态都会丢失,所有的数据都需要重新计算。

那么我就需要⼀个东西保存历史状态State。

⾸先区分⼀下两个概念,state⼀般指⼀个具体的task/operator的状态。

⽽checkpoint则表⽰了⼀个Job,在⼀个特定时刻的⼀份全局状态快照,即包含了所有task/operator的状态。

我们在这⾥讨论的是state。

Spark的状态更新
updateStateByKey
updateStateByKey会统计全局的key的状态,不管⼜没有数据输⼊,它会在每⼀个批次间隔返回之前的key的状态。

updateStateByKey会对已存在的key进⾏state的状态更新,同时还会对每个新出现的key执⾏相同的更新函数操作。

如果通过更新函数对state更新后返回来为none,此时刻key对应的state状态会被删除(state可以是任意类型的数据的结构)。

mapWithState
mapWithState也会统计全局的key的状态,但是如果没有数据输⼊,便不会返回之前的key的状态,类似于增量的感觉。

updateStateByKey和mapWithState的区别
updateStateByKey可以在指定的批次间隔内返回之前的全部历史数据,包括新增的,改变的和没有改变的。

由于updateStateByKey在使⽤的时候⼀定要做checkpoint,当数据量过⼤的时候,checkpoint会占据庞⼤的数据量,会影响性能,效率不⾼。

mapWithState只返回变化后的key的值,这样做的好处是,我们可以只是关⼼那些已经发⽣的变化的key,对于没有数据输⼊,则不会返回那些没有变化的key的数据。

这样的话,即使数据量很⼤,checkpoint也不会像updateStateByKey那样,占⽤太多的存储,效率⽐较⾼(再⽣产环境中建议使⽤这个)。

updateStateByKey⽰例:
def updateFunction(currValues:Seq[Int],preValue:Option[Int]): Option[Int] = {
val currValueSum = currValues.sum
//上⾯的Int类型都可以⽤对象类型替换
Some(currValueSum + preValue.getOrElse(0)) //当前值的和加上历史值
}
kafkaStream.map(r => (r._2,1)).updateStateByKey(updateFunction _)
这⾥的updateFunction⽅法就是需要我们⾃⼰去实现的状态跟新的逻辑,currValues就是当前批次的所有值,preValue是历史维护的状
态,updateStateByKey返回的是包含历史所有状态信息的DStream。

mapWithState⽰例:
val initialRDD = ssc.sparkContext.parallelize(List[(String, Int)]())
//⾃定义mappingFunction,累加单词出现的次数并更新状态
val mappingFunc = (word: String, count: Option[Int], state: State[Int]) => {
val sum = count.getOrElse(0) + state.getOption.getOrElse(0)
val output = (word, sum)
state.update(sum)
output
}
//调⽤mapWithState进⾏管理流数据的状态
kafkaStream.map(r => (r._2,1)).mapWithState(StateSpec.function(mappingFunc).initialState(initialRDD)).print()
这⾥的initialRDD就是初始化状态,updateStateByKey也有对应的API。

这⾥的mappingFun也是需要我们⾃⼰实现的状态跟新逻辑,调⽤state.update()就是对状态的跟新,output就是通过mapWithState后返回的DStream中的数据形式。

注意这⾥不是直接传⼊的mappingFunc函数,⽽是⼀个StateSpec 的对象,其实也是对函数的⼀个包装⽽已。

整理⾃:
⼤数据技术与架构公众号,作者wzw。

相关文档
最新文档