我应该使用状态计算吗? Spark Streaming状态计算说明

时间:2016-07-21 14:10:06

标签: java apache-spark state spark-streaming

这是我的情况:我从不同的设备接收数据,这些设备有自己的签名,时间戳和标志。然后,我使用(flag==SAVE_VALUE)函数过滤文件中的foreachRDD,但前提是它通过了这个条件:

(it is the first time I receive this signature)
OR
(I already have this signature && the timestamp is older than an hour)

直到我在本地环境中,这对我来说意味着使用Map,我在那里存储了所有ID和最后收到的时间戳。现在我想把这个逻辑放在Spark中。我应该怎么做? 我觉得这是有状态Dstream的情况,但我无法完全理解:

  • 我应该如何在Dstream中存储类似地图的rdd?或者如何创建单个“地图RDD
  • 如何比较到达的新数据?

1 个答案:

答案 0 :(得分:1)

看看mapWithState(),这正是你想要的。

StateSpecFunction中,只要新值到达同一个密钥,您就可以确定是要更新,保留还是删除当前状态。您可以访问当前状态和新状态,因此您可以在两者之间进行任何类型的比较。

它还内置了对超时的支持,可以分区为多个执行程序。

您可以通过在stateSnapshots()的返回值上调用mapWithState()来访问全局地图。否则,返回值将由每批StateSpecFunction的返回值决定。

在Spark 1.6中添加了

mapWithState(),之前有一个名为updateStateByKey()的类似函数,它大致相同,但在较大的数据集上表现更差。