我有一个Kafka经纪人,其中包含来自IoT应用程序的JSON数据。我从Spark Streaming应用程序连接到此服务器以进行一些处理。
我想在内存(RAM)中保存json数据的某些特定字段,我相信我可以使用cache()
和persist()
运算符来实现这些字段。
下次当我在Spark Streaming应用程序中收到新的JSON数据时,我会检查内存(RAM)是否有可以检索的共同字段。如果是的话,我做了一些简单的计算,最后我更新了我保存在内存(RAM)中的字段的值。
因此,我想知道我之前所描述的是否可行。如果是,我是否必须使用cache()或persist()?如何从内存中检索我的字段?
答案 0 :(得分:4)
可能cache
/ persist
使用内存或磁盘作为Spark应用程序中的数据(不一定只用于Spark Streaming应用程序 - 它更常用) caching in Spark)。
但是......在Spark Streaming中,你得到了对这种称为有状态计算的用例的特别支持。请参阅Spark Streaming Programming Guide以了解可能的内容。
我认为对于您的用例mapWithState运算符正是您所追求的。
答案 1 :(得分:0)
Spark无法正常工作。请以分布式的方式思考。
保留RAM的第一部分。您可以使用cache()
或persist()
任何人,因为他们默认将数据保存在工作人员的内存中。
您可以从 Apache Spark代码验证这一点。
/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def cache(): this.type = persist()
据我了解您的用例,您需要使用UpdateStateByKey操作来实现您的第二个用例!
有关窗口的更多信息,请参阅here。