मैं समझने की कोशिश कर रहा हूं कि स्पार्क का कैश कैसे काम करता है।स्पार्क के कैशिंग को समझना
यहाँ मेरी भोली समझ है, मुझे पता है कि अगर मैं कुछ याद कर रहा हूँ तो कृपया:
val rdd1 = sc.textFile("some data")
rdd1.cache() //marks rdd1 as cached
val rdd2 = rdd1.filter(...)
val rdd3 = rdd1.map(...)
rdd2.saveAsTextFile("...")
rdd3.saveAsTextFile("...")
ऊपर, rdd1 में केवल एक बार डिस्क (जैसे HDFS) से लोड किया जाएगा। (जब rdd2 बचाया जाता है तो मुझे लगता है) और फिर कैश से (मान लीजिए कि पर्याप्त रैम है) जब rdd3 बचाया जाता है)
अब मेरा प्रश्न है। मान लीजिए कि मैं rdd2 और rdd3 को कैश करना चाहता हूं क्योंकि दोनों का बाद में उपयोग किया जाएगा, लेकिन मुझे बनाने के बाद मुझे rdd1 की आवश्यकता नहीं है।
असल में नकल है, है ना? चूंकि एक बार rdd2 और rdd3 की गणना की जाती है, मुझे अब rdd1 की आवश्यकता नहीं है, मुझे शायद इसे अनपेक्षित करना चाहिए, है ना? सवाल कब है?
क्या यह काम करेगा? (विकल्प A)
val rdd1 = sc.textFile("some data")
rdd1.cache() // marks rdd as cached
val rdd2 = rdd1.filter(...)
val rdd3 = rdd1.map(...)
rdd2.cache()
rdd3.cache()
rdd1.unpersist()
चिंगारी DAG को unpersist कॉल होता है? या यह तुरंत किया जाता है? अगर यह तुरंत किया जाता है, तो जब मैं rdd2 और rdd3 से पढ़ता हूं, तो मूल रूप से rdd1 गैर कैश किया जाएगा, है ना?
क्या मुझे इसके बजाय ऐसा करना चाहिए (विकल्प बी)?
val rdd1 = sc.textFile("some data")
rdd1.cache() // marks rdd as cached
val rdd2 = rdd1.filter(...)
val rdd3 = rdd1.map(...)
rdd2.cache()
rdd3.cache()
rdd2.saveAsTextFile("...")
rdd3.saveAsTextFile("...")
rdd1.unpersist()
तो सवाल यह है: विकल्प पर्याप्त एक अच्छा है? यानी rdd1
अभी भी एक बार फ़ाइल लोड करेगा? या मुझे विकल्प बी के साथ जाने की ज़रूरत है?
हां, लगता है कि आप पर कर रहे हैं यह। यह थोड़ा दुर्भाग्यपूर्ण है, मेरी इच्छा है कि "कैश" को डीएजी ऑपरेशन में परिवर्तित कर दिया गया हो और न केवल आरडीडी आईडी को मानचित्र में जोड़ें ... ऐसे कई मामले हैं जहां आप कुछ मध्यस्थता से कैश करना चाहते हैं, एक नया आरडीडी बनाएं, तो पुराना छोड़ दो। शायद अच्छे सैद्धांतिक कारण हैं कि यह क्यों एक अच्छा विचार नहीं है ... किसी भी मामले में, एलआरयू (मुझे लगता है) कैश का ऑर्डर करने का मतलब है कि पुराने अप्रयुक्त आरडी 1 को निकाल दिया जाएगा यदि rdd2 और rdd3 को कैशिंग के लिए उस स्थान की आवश्यकता है ... –
इसलिए मैंने ज्यादातर देखा कि क्या लगातार/कैश और असिस्टिस्ट कर रहे हैं, लेकिन स्पार्क क्या कर रहा है, इस पर विचार करने के लिए अभी भी एक जगह है कि आप किसी अन्य से आरडीडी प्राप्त करते हैं और यह किसी भी तरह से अनुकूलित कैसे हो सकता है। मुझे यकीन नहीं है कि 'rdd1' को कैश करने की भी आवश्यकता है, इसे कैश किए जाने पर या डीएजी पाइपलाइन होने पर' rdd2' और 'rdd3' द्वारा चेकपॉइंट किया जा सकता है। हालांकि यह मेरे लिए एक भूरे रंग का क्षेत्र है। – Rich
डीबगर के माध्यम से थोड़ी अधिक जांच और ट्रेसिंग किया। 'rdd2' और' rdd3' निर्भरता के रूप में 'rdd1' को संदर्भित करेगा। 'rdd1' पहले क्रिया पर निष्पादित एक बार विभाजन में अपने डेटा को लोड करेगा। अब इस बिंदु पर 'rdd2' और' rdd3' दोनों विभाजन में 'rdd1' द्वारा पहले से लोड किए गए डेटा में उनके परिवर्तन लागू करते हैं। मेरा मानना है कि यदि आप एक ही सटीक आरडीडी पर कई कार्रवाइयां चलाते हैं तो कैशिंग मूल्य प्रदान करती है, लेकिन नई शाखाओं के आरडीडी के मामले में मुझे नहीं लगता कि आप एक ही मुद्दे में भाग लेते हैं क्योंकि मेरा मानना है कि स्पार्क को पता है कि 'rdd1' अभी भी एक है पहली बचत के बाद 'rdd3' के लिए निर्भरता। – Rich