updateStateByKey和mapWithState的区别
两者都会使用到checkpoint目录,
updateStateByKey出现在spark1.6之前,mapWithState出现在spark1.6之后,
mapWithState效率更高,更加常用。
- updateStateByKey底层是将preSateRDD和parentRDD进行co-group,然后对所有数据都将经过自定义的mapFun函数进行一次计算,即使当前batch只有一条数据也会进行这么复杂的计算,大大的降低了性能,并且计算时间会随着维护的状态的增加而增加。
- mapWithstate底层是创建了一个MapWithStateRDD,存的数据是MapWithStateRDDRecord对象,一个Partition对应一个MapWithStateRDDRecord对象,该对象记录了对应Partition所有的状态,每次只会对当前batch有的数据进行跟新,而不会像updateStateByKey一样对所有数据计算。
mapWithstate的统计结果会把最新的展示出来,不完全展示。
参考:
https://www.jianshu.com/p/a54b142067e5
https://www.jianshu.com/p/3e4b9c5c6e02