2012-04-16 2 views
5

मुझे आश्चर्य है कि क्या सदस्य ऑब्जेक्ट जोड़ना संभव है जिसे एकाधिक मानचित्र() कॉल में उपयोग किया जा सकता है। उदाहरण के लिए, एक StringBuilder:हैडोप का मैपर ऑब्जेक्ट एकाधिक थ्रेड में साझा किया गया है?

private StringBuilder builder; 

public void map(...){ 
    ... 

    builder.setLength(0); 
    builder.append(a); 
    builder.append(b); 
    builder.append(c); 
    d = builder.toString(); 

    ... 
} 

जाहिर है, अगर नक्शाकार वस्तु से अधिक थ्रेड में साझा किया जाने, बिल्डर वस्तु ऊपर के रूप में एक से अधिक धागे से समवर्ती पहुंच के कारण उम्मीद से व्यवहार नहीं करेगा।

तो मेरा सवाल यह है: क्या यह आश्वस्त है कि हैडूप में प्रत्येक थ्रेड अपने लिए एक समर्पित मैपर ऑब्जेक्ट का उपयोग करेगा? या यह एक विन्यास योग्य व्यवहार है?

धन्यवाद

उत्तर

2

जब तक आप MultithreadedMapper कक्षा का उपयोग नहीं कर रहे हैं, लेकिन स्वयं, कोई समस्या नहीं होगी। map() अनुक्रमिक कहा जाता है और समानांतर में नहीं।

कॉल के बीच कुछ ऑब्जेक्ट्स बफर करने के लिए StringBuilder या अन्य डेटा संरचनाओं का उपयोग करना आम है। लेकिन सुनिश्चित करें कि आप अपनी इनपुट ऑब्जेक्ट्स से ऑब्जेक्ट क्लोन करते हैं, केवल एक ऑब्जेक्ट है और यह बहुत से जीसी को रोकने के लिए बार-बार भर जाएगा।

इसलिए दौड़ की स्थिति को सिंक्रनाइज़ करने या देखभाल करने की कोई आवश्यकता नहीं है।

+0

यही वह है जिसे मैं जानना चाहता हूं। धन्यवाद। – JRaSH

+1

यदि आपको संपूर्ण कुंजी/मान वस्तु की आवश्यकता है, तो आपको केवल ऑब्जेक्ट क्लोन करने की आवश्यकता है, अन्यथा यदि आपको स्ट्रिंगबफर में जो कुछ सामग्री जोड़ती है, तो आपको ठीक लगेगा। आप जिस भी कॉल को मैप कॉल के बीच बफर कर रहे हैं, उसे रेड्यूसर को फ्लश/लिखने के लिए क्लीनअप विधि (मैं ओवरराइड करने के लिए नाम भूल जाता हूं) को भूलना न भूलें, अन्यथा आप Reducers पर कभी भी कुछ डेटा नहीं भेज पाएंगे। – Drizzt321

0

मुझे नहीं लगता कि यह संभव है। इसका कारण यह है कि प्रत्येक मैपर अपने स्वयं के जेवीएम में चलाता है (उन्हें विभिन्न मशीनों पर वितरित किया जाएगा), इसलिए कोई तरीका नहीं है कि आप एक चर या ऑब्जेक्ट को कई मैपर्स या रेड्यूसर में आसानी से साझा कर सकें।

अब अगर अपने सभी मानचित्रकारों ही नोड पर चलाने के लिए, मेरा मानना ​​है कि JVM के लिए एक विन्यास है कहीं पुन: उपयोग, लेकिन ईमानदारी से मैं उस के साथ परेशान नहीं हैं, खासकर यदि आपको केवल एक StringBuilder :)

है मैंने एक बार पहले यह प्रश्न देखा है, और इसे एप्लिकेशन के डिज़ाइन को बदलकर बहुत आसानी से हल किया जा सकता है। हो सकता है कि आप यह देखने के लिए क्या कर रहे हैं कि यह वास्तव में जरूरी है या नहीं, इसके बारे में आप और अधिक बता सकते हैं। यदि आपको वास्तव में इसकी आवश्यकता है, तो आप अभी भी अपनी ऑब्जेक्ट को क्रमबद्ध कर सकते हैं, इसे एचडीएफएस में डाल सकते हैं, फिर इसे प्रत्येक मैपर के साथ पढ़ सकते हैं, इसे deserialize, लेकिन यह पीछे की ओर लगता है।

+0

हाय, मेरा मतलब एकाधिक मैपर्स में एक चर साझा करने का नहीं है। जहां तक ​​मुझे पता है, प्रत्येक मैपर के मानचित्र() विधि को कई बार कहा जाता है, जहां मुझे लगता है कि मैं कुछ संसाधनों को बचा सकता हूं। तो मैपर उदाहरण में सदस्य ऑब्जेक्ट डालने से, इस objet को कई मानचित्र() कॉल में बिना किसी इन्सिट और डी-इनिट के बार-बार कॉल किया जा सकता है। मेरी चिंताओं यह है: यदि नक्शा() को समवर्ती रूप से कहा जाता है, तो यह memeber ऑब्जेक्ट का उपयोग करने में एक समस्या का सामना कर सकता है। – JRaSH

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