पाठ 16 / 25

Caching और Persistence

बार-बार उपयोग होने वाले DataFrame को cache करें और काम पूरा होने पर छोड़ दें।

एक बार गणना, कई बार उपयोग

Lazy evaluation के कारण हर action अपनी पूरी lineage स्रोत से दोबारा गणना करता है। एक ही महँगा DataFrame कई बार उपयोग करें (जैसे loop में या कई outputs के लिए), तो cache() या persist(level) पहले action के बाद उसके partitions executor memory में रखता है (ज़रूरत पर disk पर छलकाकर)। सिर्फ़ वह डेटा cache करें जो बार-बार उपयोग होता है और दोबारा गणना में महँगा है; सब कुछ cache करना memory बर्बाद करता है और evictions करा सकता है। काम पूरा होने पर unpersist() बुलाएँ, और याद रखें कि caching भी lazy है: वह पहले action पर भरती है।

मापें, फिर सबसे बड़ी लागत ठीक करें

ज़्यादातर धीमे jobs shuffles, skew, छोटी files या दोबारा गणना के कारण धीमे होते हैं।

तीन उपाय: cache, join रणनीति, layout।
चित्र 5.1 — Cache, join रणनीति और layout।

Cache करना और छोड़ना, चलाकर

मैंने यह Apache Spark 4.0.0 (PySpark, local mode, official Docker image में) पर चलाया। cache() और एक action के बाद is_cached डिफ़ॉल्ट storage level (memory, disk पर छलकते हुए) के साथ True है। unpersist() के बाद False।

c = orders.cache(); c.count()
print(c.is_cached, c.storageLevel)
c.unpersist(); print(c.is_cached)

Output:

True Disk Memory Deserialized 1x Replicated
False

Storage tab देखें

Spark UI का Storage tab दिखाता है कि क्या cache है और कितनी memory लेता है। Cached blocks बार-बार हटते रहें तो caching मदद नहीं कर रही।

त्वरित जाँच: Caching कब सार्थक है?

  • जब DataFrame एक बार उपयोग हो
  • हर DataFrame के लिए हमेशा
  • जब एक महँगा DataFrame कई बार उपयोग हो
  • कभी नहीं
Answer

जब एक महँगा DataFrame कई बार उपयोग हो — Caching दोबारा गणना से बचाती है, जो तभी मदद करती है जब डेटा दोबारा उपयोग हो।