2012-09-09 15 views
5

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

Input: [email protected]@boolean 
MapOutput : songname userid 
ReduceOutput : songname number_of_listening 

किसी भी विचार कैसे यह करने के लिए?

+0

मैं इस लिंक जानकारीपूर्ण जहाँ तक क्या पहले से ही सम्मान के साथ Hadoop द्वारा किया जाता है के रूप में छँटाई करने के लिए मिला: https://pkghosh.wordpress.com/2011/04/13/map-reduce-secondary-sort- क्या यह सब/ –

उत्तर

2

प्रति the docs, रेड्यूसर आउटपुट को फिर से क्रमबद्ध नहीं किया जाता है। JobConf.setOutputValueGroupingComparator(Class) के लिए उचित मान निर्धारित करके या फिर एक अलग चरण में अंतिम आउटपुट को रेड्यूसर से सॉर्ट करके रेडक्टर (यदि यह आपके एप्लिकेशन के लिए काम करता है) में इनपुट को सॉर्ट करें।

+0

उत्तर के लिए धन्यवाद, reducer के लिए इनपुट मूल्यों को सॉर्ट करना मेरी समस्या का समाधान नहीं करता है। दूसरे के इनपुट के रूप में पहले आउटपुट लेने के दो नौकरियां शुरू करने का एक तरीका है? –

+0

@ हाइलीकाफिनेटेड सही है। अपनी एमआर कक्षा में जो मैपर और रेड्यूसर को कॉन्फ़िगर करता है, केवल दूसरी नौकरी के इनपुट के रूप में पहली नौकरी के आउटपुट को इंगित करने वाली दूसरी नौकरी को कॉन्फ़िगर और सबमिट करें। सबमिट करने के बजाय सबमिट करें और प्रतीक्षा करें। –

+0

धन्यवाद क्रिस। मैं यह कैसे कर सकता हूं? मुझे दोनों नौकरी खोलने चाहिए (एक के बाद एक), या दोनों एक साथ शुरू करने का एक तरीका है? मुझे जॉब एपीआई [लिंक] (http://hadoop.apache.org/common/docs/r1.0.3/api/index.html) दिखाई देता है और पूर्व-निर्धारित इनपुट लेने के लिए कोई तरीका नहीं है। क्षमा करें, लेकिन यह मेरा पहला समय हैडूप के साथ काम कर रहा है। –

5

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

public static class Map extends Mapper<LongWritable,Text,IntWritable,Text>{ 
    private Text word = new Text(); 
    public void map(LongWritable key, Text value, Context context) throws IO Exception, Interrupted Exception{ 
    String line = value.toString(); 
    StringTokenizer tokenizer = new StringTokenizer(line); 
    word.set(tokenizer.nextToken()); 
    IntWritable number = new IntWritable(Integer.parseInt(tokenizer.nextToken())); 
    context.write(number,word); 
    }  
} 

कि LongWritable मूल्य के आधार पर आपके [LongWritable, पाठ] अपनी पहली MapReduce के उत्पादन को सॉर्ट होगा। मुझे बताएं कि यह कैसे काम करता है!

सीएल

+1

हैडोप 2.4.0 के मैपर क्लास जावाडोक से: "यदि नौकरी शून्य कम हो जाती है तो मैपर का आउटपुट सीधे आउटपुटफॉर्मैट को चाबियों के बिना सॉर्ट किए बिना लिखा जाता है।" क्या इसका मतलब यह नहीं है कि आपका जवाब वास्तव में गलत है? –