2012-10-07 12 views
6

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

धन्यवाद!

उत्तर

6

हाँ एकाधिक आउटपुट के साथ करना संभव है, दस्तावेज़ों के दौरान एकाधिक आउटपुट के माध्यम से पास किए गए किसी आउटपुट को रेड्यूसर द्वारा अनदेखा किया जाता है, इसलिए यह वही है जो आप चाहते हैं। मैं my GitHub पर एक छोटा सा उदाहरण लिखता हूं और मुझे आशा है कि आपको यह उपयोगी लगेगा।

+0

उत्तर के लिए धन्यवाद! मैंने कोशिश की, यह काम करता है! –

1

आप बस अपनी नक्शाकार कार्यान्वयन से सीधे HDFS के उत्पादन में लिख सकते हैं - बस संदर्भ के विन्यास का उपयोग कर एक फाइल सिस्टम वस्तु बनाने और उसके बाद एक फ़ाइल बनाने के लिए, यह करने के लिए लिख सकते हैं और इसे बाहर बंद करने के लिए याद रखें:

public void cleanup(Context context) { 
    FileSystem fs = FileSystem.get(context.getConfiguration()); 
    PrintStream ps = new PrintStream(fs.create(
     new Path("/path/to/output", "map-output"))); 
    ps.println("test"); 
    ps.close(); 
} 

अन्य विचारों के लिए चीजें - प्रत्येक फ़ाइल को एचडीएफएस में विशिष्ट रूप से नामित करने की आवश्यकता है, इसलिए आप मैपर आईडी नंबर के साथ फ़ाइल नाम प्रत्ययित कर सकते हैं, लेकिन आपको सट्टा निष्पादन की सराहना करने की भी आवश्यकता है (जिसमें आपका मैपर कार्य उदाहरण दो स्थानों पर चल रहा है - दोनों कोशिश कर रहे हैं एचडीएफएस में एक ही फाइल को लिखने के लिए)।

आप सामान्य रूप से इस से दूर हो जाते हैं क्योंकि आउटपुट कमिश्नर कार्य आईडी और प्रयास संख्या के साथ एक टीएमपी एचडीएफएस निर्देशिका में फ़ाइलों को बनाता है, केवल उस कार्य प्रयास के प्रतिबद्ध होने पर इसे सही स्थान और फ़ाइल नाम पर ले जाता है। मैप-साइड चलाते समय इस समस्या के आसपास कोई रास्ता नहीं है (डेटा को स्थानीय फाइल सिस्टम में लिखा जाता है) बिना सट्टा निष्पादन को बंद कर या एचडीएफएस में कई फाइलें बनाने के बिना, प्रत्येक प्रयास में से एक।

तो एक और अधिक 'पूर्ण' समाधान दिखाई देगा:

FileSystem fs = FileSystem.get(context.getConfiguration()); 
PrintStream ps = new PrintStream(fs.create(new Path(
     "/path/to/output", String.format("map-output-%05d-%d", 
     context.getTaskAttemptID().getTaskID().getId(), 
     context.getTaskAttemptID().getId())))); 
ps.println("test"); 
ps.close(); 

MultipleOutputs मदद मिलेगी आप पक्ष को कम है, लेकिन मुझे नहीं लगता मानचित्र साइड यह काम करेगा क्योंकि वहां कोई उत्पादन committer और काम निर्देशिका एचडीएफएस में नहीं है।

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

+0

हाय, क्रिस! उत्तर के लिए धन्यवाद! मैंने मैपर में एकाधिक आउटपुट तर्क को लागू करने का प्रयास किया। मुझे लगता है कि जो भी मैं output.collect का उपयोग करके भेजता हूं वह केवल रेड्यूसर को भेजा जा रहा है। आउटपुट जो मैं एक अलग फ़ोल्डर में एकाधिक आउटपुट का उपयोग करके लिखता हूं, जहां तक ​​मैंने जांच की है, reducer को नहीं भेजा जाता है। क्या मैं अपने प्रोजेक्ट के लिए इस प्रकार के कार्यान्वयन का उपयोग कर सकता हूं? ऐसा करने में कोई कमी है? –

+0

मुझे यकीन नहीं है कि मैं आपकी टिप्पणी पूरी तरह से समझता हूं - लेकिन यदि आपने जो कोशिश की है वह आपके लिए काम कर रही है तो इसका इस्तेमाल करें। –

+0

उत्तर के लिए धन्यवाद! –