यह एक और तरीका है। विभाजन की संख्या के आधार पर मैपर की संख्या तय की जाती है। हकीकत में यह विभाजन बनाने के लिए InputFormat
का उपयोग है, जिसका आप उपयोग कर रहे हैं। जब तक विभाजन की संख्या तय नहीं की जाती है तब तक आपको मैपर की संख्या के बारे में कोई जानकारी नहीं है। और, यह हमेशा नहीं होता है कि विभाजन एचडीएफएस ब्लॉक आकार के आधार पर बनाए जाएंगे। यह आपके इनपुटफॉर्मैट की getSplits()
विधि के अंदर तर्क पर निर्भर करता है।
बेहतर समझने के लिए, मान लें कि आप एमआर का उपयोग करके अपने MySQL में संग्रहीत डेटा संसाधित कर रहे हैं। चूंकि इस मामले में ब्लॉक की कोई अवधारणा नहीं है, इसलिए सिद्धांत जो एचडीएफएस ब्लॉक के आधार पर हमेशा बनाए जाते हैं, विफल रहता है। सही? तब विभाजन के निर्माण के बारे में क्या?एक संभावना है कि आपकी MySQL तालिका में पंक्तियों की श्रेणियों के आधार पर विभाजन बनाएं (और यह DBInputFormat
है, एक संबंधपरक डेटाबेस से डेटा पढ़ने के लिए एक इनपुट प्रारूप)। मान लें कि आपके पास 100 पंक्तियां हैं। फिर आपके पास प्रत्येक 20 पंक्तियों के 5 विभाजन हो सकते हैं।
यह केवल FileInputFormat
(फ़ाइलों में संग्रहीत डेटा को संभालने के लिए एक इनपुटफॉर्मैट) के आधार पर इनपुटफॉर्मैट्स के लिए है, जो कि इनपुट फ़ाइलों के बाइट्स में कुल आकार के आधार पर विभाजित किए जाते हैं। हालांकि, इनपुट फाइलों के फाइलसिस्टम को अवरुद्ध करने के लिए इनपुट विभाजन के लिए ऊपरी बाध्य माना जाता है। यदि आपके पास एचडीएफएस ब्लॉक आकार से छोटी फ़ाइल है, तो आपको उस फ़ाइल के लिए केवल 1 मैपर मिलेगा। यदि आप कुछ अलग व्यवहार करना चाहते हैं, तो आप mapred.min.split.size का उपयोग कर सकते हैं। लेकिन यह फिर से आपके इनपुटफॉर्मैट के getSplits() पर निर्भर करता है।
एमआर split
और एचडीएफएस block
के बीच एक मौलिक अंतर है और लोग अक्सर इस से भ्रमित हो जाते हैं। एक ब्लॉक डेटा का एक भौतिक टुकड़ा है जबकि विभाजन एक तार्किक टुकड़ा है जिसे मैपर को खिलाया जा रहा है। एक विभाजन में इनपुट डेटा नहीं होता है, यह केवल डेटा का संदर्भ है। फिर एक विभाजन क्या है? एक विभाजन में मूल रूप से 2 चीजें हैं: length in bytes
और storage locations
का एक सेट, जो कि होस्टनाम स्ट्रिंग्स हैं।
आपके प्रश्न पर वापस आ रहा है। हैडोप 200 से अधिक मैपर की अनुमति देता है। ऐसा कहकर, यह 500 एमबी डेटा के लिए 200 मैपर होने के लिए ज्यादा समझ में नहीं आता है। हमेशा याद रखें कि जब आप हडोप के बारे में बात करते हैं, तो आप बहुत विशाल डेटा से निपट रहे हैं। प्रत्येक मैपर में केवल 2.5 एमबी डेटा भेजना एक ओवरकिल होगा। और हां, यदि कोई मुफ्त सीपीयू स्लॉट नहीं है तो कुछ मैपर मौजूदा मैपर्स के पूरा होने के बाद चल सकते हैं। लेकिन एमआर ढांचा बहुत बुद्धिमान है और इस तरह की स्थिति से बचने के लिए अपनी पूरी कोशिश करता है। यदि मशीन जहां संसाधित डेटा मौजूद है, तो कोई मुफ्त सीपीयू स्लॉट नहीं है, डेटा को पास के नोड में स्थानांतरित किया जाएगा, जहां फ्री स्लॉट उपलब्ध हैं, और संसाधित हो जाएं।
HTH
इसके अलावा, सभी मैपर एक साथ चलते हैं या उनमें से कुछ धारावाहिक में भाग सकते हैं? - यदि पर्याप्त नक्शा स्लॉट हैं तो सभी मानचित्र कार्य एक साथ लॉन्च किए जाएंगे। यदि आपके पास उपलब्ध स्लॉट की तुलना में अधिक नक्शा कार्य हैं तो अतिरिक्त मानचित्र कार्य पूरा करने के लिए मैपर चलाने के लिए प्रतीक्षा करेंगे। –
यह भी ध्यान दें कि मैंने माना है कि आप पुराने मानचित्रित एपीआई का उपयोग कर रहे हैं क्योंकि मेरा कोड उस पर आधारित है। FileInputFormat के getSplits का हस्ताक्षर यहां दिया गया है और इसमें पैरामीटर के रूप में numSplits है। सार्वजनिक इनपुटप्लिट [] getSplits (जॉबकॉन्फ़ जॉब, int numSplits) –
यह दूसरी तरफ है – Tagar