簡體   English   中英

在Spark Streaming中緩存DStream

[英]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配置控制。

  • 使用附加的foreachRDDcache()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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM