2015-12-23 7 views
5

में मूल्यांकन किया जाता रहा मुद्दा यह है कि स्काला में वहाँ आपरेशन के 2 प्रकारक्यों जारी रहती है() lazily स्पार्क

  1. रूपांतरण
  2. क्रिया

रूपांतरण नक्शा(), फिल्टर (की तरह हैं समझा) आलसी मूल्यांकन किया जाता है। तो, यह निष्पादन क्रिया निष्पादन पर किया जा सकता है। उदाहरण के लिए यदि मैं पहले क्रिया निष्पादित करता हूं() तो स्पार्क केवल पहली पंक्ति पढ़ने के लिए अनुकूलित होगा।

लेकिन क्यों जारी रखें() ऑपरेशन का आलस्य मूल्यांकन किया जाता है। क्योंकि मैं जिस तरह से जाता हूं, उत्सुकता से या आलसी, यह भंडारण स्तर के अनुसार पूरे आरडीडी को जारी रखने जा रहा है।

क्या आप कृपया मुझे विस्तार से बता सकते हैं कि क्यों() कार्रवाई के बजाय परिवर्तन() है।

उत्तर

5

शुरुआत करने वालों के लिए उत्सुक दृढ़ता पूरी पाइपलाइन को प्रदूषित करेगी। cache या persist केवल इरादे व्यक्त करता है। इसका मतलब यह नहीं है कि हम कभी भी उस बिंदु पर पहुंच जाएंगे जब आरडीडी भौतिक हो और वास्तव में कैश किया जा सके। इसके अलावा ऐसे संदर्भ हैं जहां डेटा स्वचालित रूप से कैश किया जाता है।

क्योंकि किसी भी तरीके से मैं उत्सुकतापूर्वक या आलसी हूं, यह भंडारण स्तर के अनुसार पूरे आरडीडी को जारी रखने जा रहा है।

यह बिल्कुल सही नहीं है। बात है, persist लगातार नहीं है। के रूप में यह स्पष्ट रूप से MEMORY_ONLY हठ स्तर के लिए in the documentation कहा गया है:

RDD स्मृति में फिट नहीं करता है, कुछ विभाजन कैश नहीं किया जाएगा और मक्खी पर जब भी आवश्यकता हो पुनः गणना की जाएगी।

MEMORY_AND_DISK शेष डेटा के साथ डिस्क पर संग्रहीत किया जाता है, लेकिन अभी भी अगर वहाँ बाद में कैशिंग के लिए पर्याप्त स्मृति नहीं है बेदखल किया जा सकता है। क्या और भी महत्वपूर्ण है:

स्पार्क स्वचालित रूप से प्रत्येक नोड पर कैश उपयोग पर नज़र रखता है और एक हाल ही सबसे कम इस्तेमाल किया (LRU) फैशन में पुराने डेटा विभाजन बाहर चला जाता है।

आप यह भी तर्क कर सकते हैं कि cache/persist स्पार्क क्रियाएं हैं जो विशिष्ट आईओ दुष्प्रभाव के लिए क्रियान्वित कर रहे हैं से शब्दार्थ अलग है। cache स्पार्क इंजन के लिए एक संकेत है कि हम बाद में कोड के इस टुकड़े का पुन: उपयोग करना चाहेंगे।

0

लगातार भ्रमित नाम है क्योंकि यह आपके संदर्भ जीवनकाल से परे नहीं रहता है।

लगातार कैश के समान है। आंकड़ों को पहली बार गणना की जाती है ताकि यदि आप किसी अन्य गणना में अपने आरडीडी का उपयोग करते हैं, तो परिणाम पुन: गणना नहीं किए जाते हैं।

+1

झूठा वे समान नहीं हैं, 'जारी रखें' डिस्क पर बचाता है लेकिन 'कैश' मेम में बचाता है, इसके अलावा 'बने' के पास 'स्कैला' और 'जावा' एपीआई पर काम करने के कई तरीके हैं। –

+0

मैं खड़ा हूं (आंशिक रूप से सही): कैश() = persist() = persist (StorageLevel.MEMORY_ONLY) यह अभी भी अस्थायी रूप से मध्यवर्ती गणना को कैश करने का एक तरीका है। यह केवल तभी किया जाता है जब आवश्यक हो यह एक आलसी ऑपरेशन है –

+0

यह मेरा सवाल है "क्यों बने रहें() आलसी कॉल करें?" क्योंकि अंततः यह भंडारण स्तर के अनुसार (उस संदर्भ जीवनकाल के लिए) आरडीडी स्टोर करने जा रहा है (जैसे MEMORY_ONLY, DISK_ONLY, आदि)। अन्य परिवर्तनों में, मैं मानता हूं कि हम आलस्य के साथ लागत अनुकूलन प्राप्त कर सकते हैं। –

5

यदि आपके पास कुछ डेटा है जिसका आप उपयोग कर सकते हैं या नहीं, तो persist() उत्सुक अक्षम होगा। सामान्य स्पार्क रूपांतरण स्केल में def से मेल खाता है। एक persist इसे lazy val में बदल जाता है।

संबंधित मुद्दे