2013-02-26 117 views
8

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

उत्तर

4

मैं एडब्ल्यूएस ईएमआर हैडोप 1.0.3 का उपयोग कर रहा हूं, और के/वी जोड़े के आधार पर विभिन्न निर्देशिकाओं और फ़ाइलों को निर्दिष्ट करना संभव है। MultipleOutputs कक्षा से निम्न कार्यों में से किसी का उपयोग करें:

public void write(KEYOUT key, VALUEOUT value, String baseOutputPath) 

या

public <K,V> void write(String namedOutput, K key, V value, 
         String baseOutputPath) 

पूर्व write विधि कुंजी की आवश्यकता है नक्शा उत्पादन कुंजी के रूप में एक ही प्रकार के होने के लिए (मामले में आप इस का उपयोग कर रहे मैपर में) या आउटपुट कुंजी को कम करने के समान प्रकार (यदि आप इसे रेड्यूसर में उपयोग कर रहे हैं)। मूल्य को समान रूप से टाइप किया जाना चाहिए।

public static void addNamedOutput(Job job, 
           String namedOutput, 
           Class<? extends OutputFormat> outputFormatClass, 
           Class<?> keyClass, 
           Class<?> valueClass) 

तो अगर आप Context की तुलना में अलग उत्पादन प्रकार की जरूरत उपयोग कर रहा है:

बाद write विधि जब आप सेटअप MultipleObjects स्थिर addNamedOutput समारोह उपयोग करने वाली प्रॉपर्टी प्रकार निर्दिष्ट मैच के लिए कुंजी/मान प्रकार की आवश्यकता है , आपको बाद के write विधि का उपयोग करना होगा। इस निर्मित "dir1/भाग-R-00000" नाम फ़ाइलें,

multipleOutputs.write("output1", key, value, "dir1/part"); 

मेरे मामले में:

विभिन्न उत्पादन निर्देशिका हो रही करने के लिए चाल इस तरह एक baseOutputPath कि एक निर्देशिका विभाजक शामिल पारित करने के लिए, है।

मैं एक baseOutputPath कि .. निर्देशिका, इसलिए सभी baseOutputPath रों सख्ती से पथ -output पैरामीटर के लिए पारित में निहित होते हैं का उपयोग करने में सफल नहीं था।

एकाधिक आउटपुट का सेटअप और सही तरीके से उपयोग करने के तरीके के बारे में अधिक जानकारी के लिए, मुझे यह कोड मिला (मेरा नहीं, लेकिन मुझे यह बहुत उपयोगी पाया गया है; विभिन्न आउटपुट निर्देशिकाओं का उपयोग नहीं करता है)। https://github.com/rystsov/learning-hadoop/blob/master/src/main/java/com/twitter/rystsov/mr/MultipulOutputExample.java

+0

मैं यह उल्लेख करना भूल गया कि मैंने कुंजी/मूल्य डेटा के आधार पर 'बेसऑटपुटपैथ' को अलग-अलग परीक्षण किया है, और यह सफलतापूर्वक विभिन्न फ़ाइलों में आउटपुट करता है। – Eddified

+0

मुझे खुशी है कि आपने इसका उल्लेख किया है, मुझे अंततः यह पता चला था :) – Amar

+0

धन्यवाद "dir1/part" भाग के लिए बहुत कुछ, उस बारे में सोचा नहीं होगा! – ssgao

0

इसी के लिए: Hadoop Reducer: How can I output to multiple directories using speculative execution?

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

+0

यह आसान नहीं लगता है: पी एकाधिकTextOutputFormat के लिए कोई कामकाज? या क्या हम नई एपीआई का उपयोग कर एकाधिकTextOutputFormat जैसे कुछ कार्यान्वित कर सकते हैं? – Amar

+0

जैसा कि कई आउटपुट के जावाडोक में बताया गया है, मैंने अपने काम और reducer में नीचे कोड जोड़ा और यह ठीक काम करता है। नौकरी में: एकाधिकऑटपुट .addNamedOutput (नौकरी, नाम आउटपुटस्ट्रिंग, आउटपुटफॉर्मैट क्लास, कीक्लास, वैल्यूक्लास); reducer में: mos = new MultipleOutputs (संदर्भ); ... /* रनटाइम */बेसआउटपुट = "एबीसी/xyz/फ़ाइल नाम" पर गणना की गई; mos.write (कुंजी, मान, आधार आउटपुट); – techuser

+0

सफाई() में mos.close() को मत भूलना। –

-1

बंद करने के लिए सबसे अच्छा जवाब के लिए, Hadoop की ओर रुख है - (। शुरू करने स्नातकोत्तर 253) निश्चित गाइड 3 एड

एक HDG पुस्तक से अंश -

"पुराने मैपरेडस एपीआई में, एकाधिक आउटपुट बनाने के लिए दो कक्षाएं हैं: एकाधिकऑटपुटफॉर्मेट और एकाधिक आउटपुट। संक्षेप में, एकाधिकऑटपुट्स पूरी तरह से फीचर्ड हैं, लेकिन एकाधिकऑटपुटफॉर्मेट आउटपुट निर्देशिका संरचना और फ़ाइल नामकरण पर अधिक नियंत्रण रखता है। नई API में एकाधिक आउटपुट पुरानी एपीआई में दो एकाधिक आउटपुट कक्षाओं की सर्वोत्तम सुविधाओं को जोड़ती है। "

यह एक उदाहरण है कि आप एकाधिक संरचनाओं का उपयोग कर निर्देशिका संरचना, फ़ाइल नामकरण और आउटपुट प्रारूप को कैसे नियंत्रित कर सकते हैं।

एचटीएच।

+0

क्या एकाधिकऑटपुट कुंजी-मूल्य जोड़े के आधार पर फ्लाई पर आउटपुट फ़ोल्डर का नाम या फ़ाइल नाम तय करने की अनुमति देता है ?? मुझे ऐसा नहीं लगता है, अगर कोई रास्ता है तो कृपया मुझे बताएं। – Amar

+0

हाँ दोस्त और मैं इसे नहीं मिला! एकाधिकऑटपुट का उपयोग करके आप केवल * * सेट * * प्री-डिफ़ाइंड * फ़ाइलपैथ पर लिख सकते हैं। और आप अपने 'रन() 'में' एकाधिकऑटपुट .addNamedOutput()' का उपयोग कर ऐसा करते हैं। यह संभव है कि मैं यहां कुछ याद कर रहा हूं लेकिन ऐसे बयान देने से rathe, अगर यह आसानी से कहीं और * पाया जाता है, तो आप कम से कम एक लिंक पोस्ट कर सकते थे। – Amar

+0

मुझे यह भी संदेह है कि आपने एकाधिकTextOutputFormat या एकाधिक आउटपुट का उपयोग किया है! पुस्तक को पढ़ना, यह स्पष्ट रूप से बताता है कि उदाहरण से पहले: * MutipleTextOutputFormat की तुलना में एकाधिकऑटपुट * का उपयोग करते समय आउटपुट के नामकरण पर कम नियंत्रण होता है। – Amar