2012-05-18 10 views
8

मैं hadoop-1.0.1java भाषा में K means को लागू करने का प्रयास कर रहा हूं। मैं अब निराश हूँ। हालांकि मुझे k means के पूर्ण कार्यान्वयन के github लिंक मिला लेकिन Hadoop में नौसिखिया के रूप में, मैं इसे दूसरे कोड की प्रतिलिपि के बिना सीखना चाहता हूं। मेरे पास और reduce फ़ंक्शन का hadoop में उपलब्ध फ़ंक्शन का मूल ज्ञान है। क्या कोई मुझे k meansmapper और reducer कक्षा को लागू करने का विचार प्रदान कर सकता है। क्या इसे पुनरावृत्ति की आवश्यकता है?के लिए मैपर और रेड्यूसर का अर्थ जावा में हैडोप में एल्गोरिदम

+0

हाहा मेरे प्रसिद्ध के-साधन :) आपको किस विशिष्ट ज्ञान की आवश्यकता है? और हाँ इसे पुनरावृत्ति की आवश्यकता है। –

+0

@ थॉमसजंगब्लूट: मैंने 'हडूप' द्वारा प्रदान किए गए 'वर्डकाउंट' उदाहरण को देखा। वह काफी आसान था। लेकिन 'के मतलब' में, मैं आगे बढ़ने में असमर्थ हूं। 'हडूप' में पुनरावृत्ति कैसे करें, 'मैपर' और 'रेड्यूसर' क्या होना चाहिए। चूंकि इसे 'कुंजी मान जोड़ी' की आवश्यकता होती है, तो 'कुंजी' क्या है और 'जोड़ी' क्या है? यदि आप मुझे विस्तार से समझा सकते हैं, तो मैं आपका आभारी रहूंगा। कृप्या। –

+0

निश्चित रूप से, मैं वर्तमान में एक पैच पर काम कर रहा हूं, मैं आपको 10-20 मिनट में कुछ और जानकारी प्रदान करूंगा। –

उत्तर

9

ठीक है, मैं आपको यह बताने के लिए जाता हूं कि मैपरेडस में के-साधनों को लागू करते समय मैंने क्या सोचा था। यह कार्यान्वयन महौत से अलग है, मुख्य रूप से क्योंकि यह दिखाने के लिए कि कैसे एल्गोरिदम वितरित सेटअप (और वास्तविक उत्पादन उपयोग के लिए नहीं) में काम कर सकता है। मैं यह भी मानता हूं कि आप वास्तव में जानते हैं कि के-साधन कैसे काम करते हैं।

होने ने कहा कि हम तीन मुख्य चरण में पूरे एल्गोरिथ्म विभाजित करने के लिए है: स्तर

नौकरी स्तर

  1. नौकरी स्तर
  2. मानचित्र स्तर
  3. कम

    नौकरी का स्तर काफी सरल है, यह लिखा है इनपुट में इनपुट (कुंजी = ClusterCenter नामक वर्ग और मूल्य = VectorWritable नामक वर्ग), हैडोप नौकरी के साथ पुनरावृत्ति को संभालना और पूरे काम के आउटपुट को पढ़ना।

    VectorWritable इस मामले में मेरे स्वयं के गणित पुस्तकालय से एक क्रमिक कार्यान्वयन है, लेकिन वास्तव में एक साधारण डबल सरणी से कुछ भी नहीं।

    ClusterCenter मुख्य रूप से VectorWritable है, लेकिन सुविधा कार्यों के साथ जो आमतौर पर केंद्र (उदाहरण के लिए औसत) की आवश्यकता होती है।

    के-मतलब में आपके पास के-वेक्टर के कुछ बीजसेट हैं जो आपके प्रारंभिक केंद्र और कुछ इनपुट वेक्टर हैं जिन्हें आप क्लस्टर करना चाहते हैं। यह MapReduce में बिल्कुल वही है, लेकिन मैं उन्हें दो अलग-अलग फाइलों में लिख रहा हूं। पहली फ़ाइल में केवल वेक्टर और कुछ डमी कुंजी केंद्र होते हैं और दूसरी फ़ाइल में वास्तविक प्रारंभिक केंद्र होते हैं (अर्थात् cen.seq)।

    डिस्क पर लिखे गए सभी के बाद आप अपना पहला काम शुरू कर सकते हैं। यह निश्चित रूप से पहले Mapper लॉन्च करेगा जो अगला विषय है।

    मानचित्र स्तर

    MapReduce में यह हमेशा क्या में आ रहा है और क्या बाहर जा रहा है (वस्तुओं के संदर्भ में) पता करने के लिए स्मार्ट है। तो नौकरी के स्तर से हम जानते हैं कि हमारे पास ClusterCenter और VectorWritable इनपुट के रूप में है, जबकि ClusterCenter वर्तमान में केवल एक डमी है। निश्चित रूप से हम आउटपुट के समान होना चाहते हैं, क्योंकि नक्शा चरण सामान्य के-साधनों से प्रसिद्ध असाइनमेंट चरण है।

    आप इनपुट वेक्टर और केंद्रों के बीच तुलना के लिए स्मृति स्तर पर बनाए गए असली केंद्र फ़ाइल को पढ़ रहे हैं।इसलिए आपके पास यह दूरी मीट्रिक परिभाषित है, मैपर में यह ManhattanDistance पर हार्डकोड किया गया है। थोड़ा और विशिष्ट होने के लिए, आपको मानचित्र चरण में अपने इनपुट का एक हिस्सा मिलता है और फिर आप प्रत्येक इनपुट "कुंजी मूल्य जोड़ी" (यह एक जोड़ी या टुपल होता है जिसमें कुंजी और मूल्य शामिल होता है) प्रत्येक के साथ तुलना करता है केंद्र। यहां आप ट्रैकिंग कर रहे हैं कि कौन सा केंद्र निकटतम है और उसके बाद इनपुट वेक्टर के साथ डिस्क पर निकटतम ClusterCenter ऑब्जेक्ट लिखकर इसे केंद्र में असाइन करें।

    आपका आउटपुट तब होता है: n-vectors उनके असाइन किए गए केंद्र (कुंजी के रूप में) के साथ। हैडोप अब आपकी कुंजी द्वारा सॉर्टिंग और ग्रुपिंग कर रहा है, इसलिए आपको कम कार्य में एक ही केंद्र के लिए प्रत्येक असाइन किए गए वेक्टर मिलते हैं।

    स्तर को कम

    जैसा कि ऊपर कहा, यदि आप एक ClusterCenter और कम करने के चरण में उसको दिए गए VectorWritable के होगा। यह सामान्य के-साधनों में आपके पास सामान्य अपडेट चरण है। तो आप बस सभी वैक्टरों पर पुनरावृत्त कर रहे हैं, उन्हें संक्षेप में और औसत औसत कर रहे हैं।

    अब आपके पास एक नया "मीन" है जिसका आप तुलना कर सकते हैं जिसका अर्थ पहले सौंपा गया था। यहां आप दो केंद्रों के बीच एक अंतर को माप सकते हैं जो हमें बताता है कि केंद्र कितना स्थानांतरित हुआ। आदर्श रूप से यह स्थानांतरित नहीं होता और converged नहीं होता।

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

    असल में आप अब अगले केंद्र के लिए नया केंद्र और डिस्क पर सभी वैक्टर लिख रहे हैं। क्लीनअप चरण के अतिरिक्त, आप मानचित्र के चरण में उपयोग किए जाने वाले पथ पर सभी नए एकत्रित केंद्र लिख रहे हैं, इसलिए नए पुनरावृत्ति में नए वैक्टर हैं।


    अब नौकरी के चरण में, MapReduce नौकरी अब किया जाना चाहिए। अब हम उस नौकरी के काउंटर का निरीक्षण कर रहे हैं ताकि यह पता चल सके कि कितने केंद्र अभी तक एकत्र नहीं हुए हैं। यह काउंटर थोड़ी देर के लिए यह निर्धारित करने के लिए प्रयोग किया जाता है कि पूरा एल्गोरिदम समाप्त हो सकता है या नहीं। यदि नहीं, तो पर वापस जाएं मानचित्र स्तर पैराग्राफ फिर से, लेकिन इनपुट के रूप में पिछले नौकरी से आउटपुट का उपयोग करें।

    वास्तव में यह संपूर्ण वूडू था।

    स्पष्ट कारणों से इसका उत्पादन में उपयोग नहीं किया जाना चाहिए, क्योंकि इसका प्रदर्शन भयानक है। Mahout के अधिक ट्यून संस्करण का बेहतर उपयोग करें। लेकिन शैक्षणिक उद्देश्यों के लिए यह एल्गोरिदम ठीक है;)

    यदि आपके कोई और प्रश्न हैं, तो मुझे एक मेल या टिप्पणी लिखने के लिए स्वतंत्र महसूस करें।

+1

के उपयोगकर्ता परिभाषित है, मेरे उदाहरण के मामले में यह 2 को हार्डकोड किया गया है। मैं आपको बाकी को सॉर्ट करने के लिए एक मेल लिखता हूं;) –

+0

हाय, मैं हड़पने और कोशिश करने के लिए बहुत नया हूं मेरी पहली MapReduce नौकरी को लागू करने के लिए। उदाहरण के लिए केएमन्स के लिए, मैं किसी बिंदु पर अपनी नौकरियों को रोकने के लिए एक पुनरावृत्ति पाश का उपयोग कर रहा हूं लेकिन मुझे समझ में नहीं आ रहा है कि हम पुनरावृत्तियों में उन्हें हटाने के लिए फाइल सिस्टम के अस्तित्व की जांच क्यों करते हैं? इस तरह: अगर (fs.exists (_input_path)) { fs.delete (_input_path, true); } –

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