2016-04-04 17 views
6

स्पार्क में वैश्विक पढ़ने \ लिखने के चर को परिभाषित करने के लिए कैसे करें broadcast चर, जो केवल पढ़ने के लिए हैं, और accumulator चर, जो नोड्स द्वारा अपडेट किए जा सकते हैं, लेकिन पढ़ नहीं सकते हैं। क्या कोई तरीका है - या एक वर्कअराउंड - एक वैरिएबल को परिभाषित करने के लिए जो दोनों अद्यतन करने योग्य है और पढ़ा जा सकता है? इस तरह के एक पढ़ने के लिएस्पार्क

एक आवश्यकता \ बारे में वैश्विक चर एक कैश लागू करने के लिए किया जाएगा। चूंकि फ़ाइलों को लोड किया जाता है और आरडीडी के रूप में संसाधित किया जाता है, गणना की जाती है। इन गणनाओं के नतीजे - समानांतर में चल रहे कई नोड्स में हो रहा है - एक मानचित्र में रखा जाना चाहिए, जिसकी वजह से यह संसाधित होने वाली इकाई के कुछ गुणों की कुंजी है। चूंकि आरडीडी के भीतर की इकाइयों को संसाधित किया जाता है, तो कैश पूछताछ की जाती है।

स्कैला में ScalaCache है, जो Google Guava जैसे कैश कार्यान्वयन के लिए एक मुखौटा है। लेकिन स्पार्क एप्लिकेशन के भीतर इस तरह के कैश को कैसे शामिल किया जाएगा और एक्सेस किया जाएगा?

कैश जो SparkContext बनाता ड्राइवर आवेदन में एक चर के रूप में परिभाषित किया जा सकता है। लेकिन फिर वहाँ दो मुद्दों होगा:

  • प्रदर्शन शायद नेटवर्क ओवरहेड नोड्स और चालक अनुप्रयोग के बीच की वजह से खराब हो जाएगा।
  • मेरी समझ के लिए, प्रत्येक rdd को (इस मामले में कैश) की एक प्रति पारित की जाएगी जब चर को पहली बार फ़ंक्शन को पार किया गया हो। प्रत्येक rdd की अपनी प्रतिलिपि होगी, साझा किए गए वैश्विक चर तक पहुंच नहीं।

ऐसे कैश को लागू करने और स्टोर करने का सबसे अच्छा तरीका क्या है?

धन्यवाद

+1

तो यहां सवाल क्या है? – zero323

+0

स्पार्क में वैश्विक पढ़ने \ लिखने के चर को परिभाषित करने के लिए कैसे करें, उदा। मेरे उदाहरण में कैश को परिभाषित करने के लिए। – user1052610

+0

धन्यवाद Tzach - उस प्रश्न पर नई टिप्पणी जोड़ देगा – user1052610

उत्तर

6

ठीक है, ऐसा करने का सबसे अच्छा तरीका यह बिल्कुल नहीं कर रही है। सामान्य स्पार्क में प्रसंस्करण मॉडल के बारे में कोई गारंटी देता है प्रदान नहीं करता है

  • जहां,
  • जब,
  • में किस क्रम
  • (बेशक वंश/DAG द्वारा परिभाषित परिवर्तनों के आदेश को छोड़कर) और कितनी बार

दिया कोड का टुकड़ा मार डाला जाता है। इसके अलावा, स्पार्क आर्किटेक्चर पर सीधे निर्भर होने वाले कोई भी अपडेट ग्रैन्युलर नहीं हैं।

ये वे गुण हैं जो स्पार्क स्केलेबल और लचीला बनाते हैं लेकिन वही यह बात है जो साझा करने योग्य राज्य को लागू करने के लिए बहुत कठिन है और अधिकांश समय पूरी तरह से बेकार है।

  • उपयोग (JVM या निष्पादक धागा प्रति) Caching in Spark
  • उपयोग स्थानीय कैशिंग में Tzach Zohar द्वारा वर्णित विधियों में से एक आवेदन के साथ संयुक्त:

    यदि सब आप चाहते हैं एक सरल कैश तो है आप एक से अधिक विकल्प हैं चीजों को स्थानीय रखने के लिए विशिष्ट विभाजन

  • बाहरी सिस्टम के साथ संचार के लिए स्पार्क से स्वतंत्र नोड स्थानीय कैश का उपयोग करें (उदाहरण के लिए http अनुरोधों के लिए Nginx प्रॉक्सी)

यदि एप्लिकेशन को अधिक जटिल संचार की आवश्यकता है तो आप सिंक्रनाइज़ किए गए राज्य को रखने के लिए अलग-अलग संदेश पास करने का प्रयास कर सकते हैं लेकिन आम तौर पर इसे एक जटिल और संभावित नाजुक कोड की आवश्यकता होती है।

+0

स्पार्क स्ट्रीमिंगलाइनर एल्गोरिदम में एक कक्षा है जिसमें मॉडल ऑब्जेक्ट को अद्यतन किया जाता है और भविष्यवाणी के लिए उपयोग किया जाता है। क्या वह एक ही वस्तु पर पढ़ने के लिए उदाहरण के रूप में योग्य नहीं है। मुझे यकीन नहीं है, अगर आप कृपया समझा सकते हैं। –

+0

मैंने यहां से संबंधित एक प्रश्न भी पूछा है। https://stackoverflow.com/questions/43114971/how-does-sparks-streaminglinearregressionwithsgd-work –