我正在开发一个流媒体应用程序,我正在缓存一个大型RDD(仅在内存中)..
Dstream.cache()
Dstream.foreachRDD(..)
Dstream.foreachRDD(..)
我想知道Dstream是否无法适应内存.. RDD是否重新计算或引发异常?
我问这个问题,因为我正在使用mapwithState函数开发一个有状态的应用程序,该函数在内部使用仅在内存中存在的内部流。(https://github.com/wliuxad/spark/blob/master/streaming/src/main/scala/org/apache/spark/streaming/dstream/MapWithStateDStream.scala#L109-109)
答案 0 :(得分:0)
取决于我们正在谈论的RDD。 MapWithStateDStream
将数据缓存在OpenHashMapBasedStateMap
中。它不会溢出到磁盘上。这意味着您需要有足够的内存才能使应用程序正常工作。当你想到它时,你怎么能驱逐国家?它不是一些持久存在的RDD,它是应用程序逻辑的一部分。
被驱逐的一件事是来自您的来源的缓存RDD
。从您之前的示例中我看到您正在使用Kafka,这意味着一旦Spark认为适合,缓存的KafkaRDD
将被逐出。