UpdataStateBykey updataStateBykey是特殊的reduceByKey, 相当于oldValue+reduceByKey(newValue1,newValue2),通过传入一个updateFunc来实现批次间数据累加的操作。
实现它必须设置checkPoint路径,updataStateBykey会自动将每次计算的结果持久化到磁盘,批次间的数据则是缓存在内存中。
缺点:大量占用内存,大量产生小文件 MapwithState mapwithState是spark1.6新增的累加操作,目前还在测试中,它的原理网上查不到,只知道是updataStateBykey的升级版,效率提升10倍。
缺点:资料不全,社区很小 不建议使用状态流累加操作,建议用窗口+第三方存储(redis)来达到同样的效果。
Spark Streaming中的updateStateByKey和mapWithState的区别和使用。
UpdateStateByKey:统计全局的key的状态,但是就算没有数据输入,他也会在每一个批次的时候返回之前的key的状态。
这样的缺点就是,如果数据量太大的话,而且我们需要checkpoint数据,这样会占用较大的存储。
如果要使用updateStateByKey,就需要设置一个checkpoint目录(updateStateByKey自己是无法保存key的状态的),开启checkpoint机制。因为key的state是在内存维护的,如果宕机,则重启之后之前维护的状态就没有了,所以要长期保存它的话需要启用checkpoint,以便恢复数据。
MapWithState:也是用于全局统计key的状态,但是它如果没有数据输入,便不会返回之前的key的状态,有一点增量的感觉。
这样做的好处是,我们可以只关心那些已经发生变化的key,对于没有数据输入,则不会返回那些没有变化的key的数据。
这样即使数据量很大,checkpoint也不会像updateStateByKey那样,占用太多的存储。