SparkStreaming
之 mapWithState
算子:
mapWithState
是1.6版本之后推出的- 必须设置
checkpoint
来储存历史数据 mapWithState
和updateStateByKey
的区别:他们类似,都是有状态DStream
操作,两者都是数据增量的数据。区别在于,updateStateByKey
是输出增量数据(即使本批次没有更新。有的值没有发生变化,还会再打印出来),随着时间的增加,输出的数据越来越多,这样会影响计算的效率,对CPU
和内存压力较大。而mapWithState
则只输出本批次数据(本批次数据的变化),但是也含有状态更新。checkpoint
的数据会分散存储在不同的分区中,在进行状态更新时,首先会对当前key
做hash
,再到对应的分区中去更新状态,这种方式大大提高了效率.- 源码中有一个注解(
@Experimental
),说明是实验性质的。
举例来说(wordCount):
1、使用 updateStateByKey
例如第一批数据为: hello how when hello
则结果输出为:(how,1) (when,1) (hello,2)
第二批数据为: when what hi
则结果输出为: (hello,2) (how,1) (when,2) (what,1) (hi,1)
说明:即使是第二批次没有输入 hello
和 how
,结果还是会数据 hello
和 how
的累计数量
2、使用 mapWithState
例如第一批数据为: hello how when hello
则结果输出为:(how,1) (when,1) (hello,2)
第二批数据为: when what hi
则结果输出为: (when,2) (what,1) (hi,1)