[英]Caching DStream in Spark Streaming
我有一個Spark流傳輸過程,該過程將從kafka讀取數據到DStream中。
在我的管道中,我做了兩次 (一個接一個):
DStream.foreachRDD(在RDD上轉換並插入到目標中)。
(每次我進行不同的處理並將數據插入到不同的目的地)。
我想知道從卡夫卡讀取數據后DStream.cache會如何工作嗎? 有可能做到嗎?
現在該過程實際上是從Kafka讀取數據兩次嗎?
請記住,不可能將兩個foreachRDD放在一個中(因為兩個路徑完全不同,所以那里有狀態轉換-需要在DStream上應用...)
謝謝你的幫助
有兩種選擇:
使用Dstream.cache()
將基礎RDD標記為已緩存。 在超時之后,Spark Streaming將負責保持RDD的持久性,該設置由spark.cleaner.ttl
配置控制。
使用附加的foreachRDD
將cache()
和unpersist(false)
副作用操作應用於DStream中的RDD:
例如:
val kafkaDStream = ???
val targetRDD = kafkaRDD
.transformation(...)
.transformation(...)
...
// Right before the lineage fork mark the RDD as cacheable:
targetRDD.foreachRDD{rdd => rdd.cache(...)}
targetRDD.foreachRDD{do stuff 1}
targetRDD.foreachRDD{do stuff 2}
targetRDD.foreachRDD{rdd => rdd.unpersist(false)}
請注意,如果可以的話,您可以將緩存作為do stuff 1
的第一條語句。
我更喜歡這個選項,因為它可以讓我對緩存的生命周期進行細粒度的控制,並且可以讓我在需要時立即清理內容,而不必依賴於ttl。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.