2011-07-27 8 views
6

मैं mapreduce नौकरी: मेरी कोड मानचित्र वर्ग:Hadoop mapreduce: एक MapReduce काम के भीतर मानचित्रकारों चेनिंग के लिए ड्राइवर

public static class MapClass extends Mapper<Text, Text, Text, LongWritable> { 

    @Override 
    public void map(Text key, Text value, Context context) 
     throws IOException, InterruptedException { 
    } 
} 

और मैं ChainMapper उपयोग करना चाहते हैं:

1. Job job = new Job(conf, "Job with chained tasks"); 
2. job.setJarByClass(MapReduce.class); 
3. job.setInputFormatClass(TextInputFormat.class); 
4. job.setOutputFormatClass(TextOutputFormat.class); 

5. FileInputFormat.setInputPaths(job, new Path(InputFile)); 
6. FileOutputFormat.setOutputPath(job, new Path(OutputFile)); 

7. JobConf map1 = new JobConf(false); 

8. ChainMapper.addMapper(
     job, 
     MapClass.class, 
     Text.class, 
     Text.class, 
     Text.class, 
     Text.class, 
     true, 
     map1 
     ); 

लेकिन अपनी रिपोर्ट है लाइन 8:

इस लाइन पर एकाधिक मार्कर - 'addMappe का होना आर ' - विधि addMapper (जॉबकॉन्फ, कक्षा>, कक्षा, कक्षा, कक्षा, कक्षा, बूलियन, जॉबकॉन्फ़) प्रकार में चेनमैपर तर्क के लिए लागू नहीं है (नौकरी, कक्षा, कक्षा, कक्षा, कक्षा, कक्षा, बूलियन, कॉन्फ़िगरेशन) - डीबग वर्तमान निर्देश सूचक - विधि मैनेमपर (जॉबकॉन्फ, कक्षा>, कक्षा, कक्षा, कक्षा, कक्षा, बूलियन, जॉबकॉन्फ़) प्रकार में चेनमैपर (जॉबकॉन्फ़, कक्षा, क्लास, कक्षा, कक्षा, कक्षा, बूलियन, JobConf)

उत्तर

0

आप Configuration बजाय JobConf उपयोग करना होगा। JobConfConfiguration का उप-वर्ग है, इसलिए इसके लिए एक निर्माता बनना चाहिए।

0

आपके ChainMapper.addMapper() के पहले तर्क के लिए, आपने job ऑब्जेक्ट पास कर दिया है। जबकि फ़ंक्शन JobConf प्रकार की ऑब्जेक्ट की अपेक्षा कर रहा है। करने के लिए फिर से लिखने:

 
ChainMapper.addMapper(
      (JobConf)conf, 
      MapClass.class, 
      Text.class, 
      Text.class, 
      Text.class, 
      Text.class, 
      true, 
      map1 
      ); 

समस्या ..

+0

वह पहले से ही एक jobconf है, उसे एक विन्यास की जरूरत है। कास्टिंग यहां सही विकल्प नहीं होगा। यह map1 के बारे में है और conf के बारे में नहीं है। –

+1

आपकी नक्शा कक्षा को विस्तारित करना है: org.apache.hadoop.mapred.Mapper org.apache.hadoop.mapreduce.Mapper नहीं – user864846

7

का समाधान करना चाहिए के बाद "कुंग फू" का एक बहुत, मैं ChainMapper/ChainReducer उपयोग करने में सक्षम था। अंतिम टिप्पणी उपयोगकर्ता 864846 के लिए धन्यवाद।

/** 
* Licensed to the Apache Software Foundation (ASF) under one 
* or more contributor license agreements. See the NOTICE file 
* distributed with this work for additional information 
* regarding copyright ownership. The ASF licenses this file 
* to you under the Apache License, Version 2.0 (the 
* "License"); you may not use this file except in compliance 
* with the License. You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package myPKG; 

/* 
* Ajitsen: Sample program for ChainMapper/ChainReducer. This program is modified version of WordCount example available in Hadoop-0.18.0. Added ChainMapper/ChainReducer and made to works in Hadoop 1.0.2. 
*/ 

import java.io.IOException; 
import java.util.Iterator; 
import java.util.StringTokenizer; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapred.*; 
import org.apache.hadoop.mapred.lib.ChainMapper; 
import org.apache.hadoop.mapred.lib.ChainReducer; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 

public class ChainWordCount extends Configured implements Tool { 

    public static class Tokenizer extends MapReduceBase 
    implements Mapper<LongWritable, Text, Text, IntWritable> { 

     private final static IntWritable one = new IntWritable(1); 
     private Text word = new Text(); 

     public void map(LongWritable key, Text value, 
       OutputCollector<Text, IntWritable> output, 
       Reporter reporter) throws IOException { 
      String line = value.toString(); 
      System.out.println("Line:"+line); 
      StringTokenizer itr = new StringTokenizer(line); 
      while (itr.hasMoreTokens()) { 
       word.set(itr.nextToken()); 
       output.collect(word, one); 
      } 
     } 
    } 

    public static class UpperCaser extends MapReduceBase 
    implements Mapper<Text, IntWritable, Text, IntWritable> { 

     public void map(Text key, IntWritable value, 
       OutputCollector<Text, IntWritable> output, 
       Reporter reporter) throws IOException { 
      String word = key.toString().toUpperCase(); 
      System.out.println("Upper Case:"+word); 
      output.collect(new Text(word), value);  
     } 
    } 

    public static class Reduce extends MapReduceBase 
    implements Reducer<Text, IntWritable, Text, IntWritable> { 

     public void reduce(Text key, Iterator<IntWritable> values, 
       OutputCollector<Text, IntWritable> output, 
       Reporter reporter) throws IOException { 
      int sum = 0; 
      while (values.hasNext()) { 
       sum += values.next().get(); 
      } 
      System.out.println("Word:"+key.toString()+"\tCount:"+sum); 
      output.collect(key, new IntWritable(sum)); 
     } 
    } 

    static int printUsage() { 
     System.out.println("wordcount <input> <output>"); 
     ToolRunner.printGenericCommandUsage(System.out); 
     return -1; 
    } 

    public int run(String[] args) throws Exception { 
     JobConf conf = new JobConf(getConf(), ChainWordCount.class); 
     conf.setJobName("wordcount"); 

     if (args.length != 2) { 
      System.out.println("ERROR: Wrong number of parameters: " + 
        args.length + " instead of 2."); 
      return printUsage(); 
     } 
     FileInputFormat.setInputPaths(conf, args[0]); 
     FileOutputFormat.setOutputPath(conf, new Path(args[1])); 

     conf.setInputFormat(TextInputFormat.class); 
     conf.setOutputFormat(TextOutputFormat.class); 

     JobConf mapAConf = new JobConf(false); 
     ChainMapper.addMapper(conf, Tokenizer.class, LongWritable.class, Text.class, Text.class, IntWritable.class, true, mapAConf); 

     JobConf mapBConf = new JobConf(false); 
     ChainMapper.addMapper(conf, UpperCaser.class, Text.class, IntWritable.class, Text.class, IntWritable.class, true, mapBConf); 

     JobConf reduceConf = new JobConf(false); 
     ChainReducer.setReducer(conf, Reduce.class, Text.class, IntWritable.class, Text.class, IntWritable.class, true, reduceConf); 

     JobClient.runJob(conf); 
     return 0; 
    } 

    public static void main(String[] args) throws Exception { 
     int res = ToolRunner.run(new Configuration(), new ChainWordCount(), args); 
     System.exit(res); 
    } 
} 

नवीनतम संस्करण में संपादित (कम से कम Hadoop 2.6 से), addMapper में true झंडा जरूरत नहीं है। (वास्तव में हस्ताक्षर ने दमन को बदल दिया है ')।

तो यह सिर्फ

JobConf mapAConf = new JobConf(false); 
ChainMapper.addMapper(conf, Tokenizer.class, LongWritable.class, Text.class, 
         Text.class, IntWritable.class, mapAConf); 
0

असल नक्शाकार वर्ग करने के लिए को लागू किया गया है इंटरफ़ेस org.apache.hadoop.mapred.Mapper होगा। मुझे एक ही समस्या थी, लेकिन यह हल हो गया।

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