2015-04-14 53 views
0

我想將mapreduce作業的輸出存儲在兩個不同的目錄中。 儘管我的代碼被設計爲在不同的目錄中存儲相同的輸出。Mapreduce MultipleOutputs錯誤

下面

public class WordCountMain { 


public static void main(String[] args) throws Exception { 

Configuration conf = new Configuration(); 

Job myhadoopJob = new Job(conf); 

myhadoopJob.setJarByClass(WordCountMain.class); 
myhadoopJob.setJobName("WORD COUNT JOB"); 
FileInputFormat.addInputPath(myhadoopJob, new Path(args[0])); 

myhadoopJob.setMapperClass(WordCountMapper.class); 
myhadoopJob.setReducerClass(WordCountReducer.class);  
myhadoopJob.setInputFormatClass(TextInputFormat.class); 
myhadoopJob.setOutputFormatClass(TextOutputFormat.class); 

myhadoopJob.setMapOutputKeyClass(Text.class); 
myhadoopJob.setMapOutputValueClass(IntWritable.class); 

myhadoopJob.setOutputKeyClass(Text.class); 
myhadoopJob.setOutputValueClass(IntWritable.class); 

MultipleOutputs.addNamedOutput(myhadoopJob, "output1", TextOutputFormat.class, Text.class, IntWritable.class); 
MultipleOutputs.addNamedOutput(myhadoopJob, "output2", TextOutputFormat.class, Text.class, IntWritable.class); 
FileOutputFormat.setOutputPath(myhadoopJob, new Path(args[1])); 




System.exit(myhadoopJob.waitForCompletion(true) ? 0 : 1); 



} 

我Driver類代碼}

我的映射器代碼

public class WordCountMapper extends Mapper<LongWritable, Text, Text,  IntWritable> 

{ 





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

String line = value.toString(); 
String word =null; 

StringTokenizer st = new StringTokenizer(line,","); 


while(st.hasMoreTokens()) 
{ 
word= st.nextToken(); 



context.write(new Text(word), new IntWritable(1)); 




} 



} 

}

我減速器代號低於

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> 

{ 

MultipleOutputs mout =null; 

protected void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException { 


int count=0; 
int num =0; 



    Iterator<IntWritable> ie =values.iterator(); 

    while(ie.hasNext()) 
    { 
     num = ie.next().get();//1 
     count= count+num; 

    } 
mout.write("output1", key, new IntWritable(count)); 

mout.write("output2", key, new IntWritable(count)); 

@Override 
protected void setup(org.apache.hadoop.mapreduce.Reducer.Context context) 
     throws IOException, InterruptedException { 
    // TODO Auto-generated method stub 
    super.setup(context); 

    mout = new MultipleOutputs<Text, IntWritable>(context); 
} 




} 

@Override 
protected void setup(org.apache.hadoop.mapreduce.Reducer.Context context) 
     throws IOException, InterruptedException { 

    super.setup(context); 

    mout = new MultipleOutputs<Text, IntWritable>(context); 
} 

}

我只是給在輸出目錄減少方法本身

但是當我運行使用下面的命令,這MapReduce工作,它什麼都不做。甚至Mapreduce也沒有開始。只是一個空白,並保持閒置。

hadoop jar WordCountMain.jar /user/cloudera/inputfiles/words.txt /user/cloudera/outputfiles/mapreduce/multipleoutputs 

有人能解釋我出了什麼問題?如何解決這個我的代碼

實際上發生的事情是有不同的名稱,兩個輸出文件都存儲在/用戶/ Cloudera公司/ outputfiles/MapReduce的/ multipleoutputs 。

但我需要的是將輸出文件存儲在不同的目錄中。

在豬,我們可以通過給不同的目錄

兩個STORE語句中使用怎樣實現的MapReduce

回答

0

你可以嘗試關閉多個輸出對象在減速清理方法相同。

+0

好的。我也嘗試過。由於「輸出目錄未設置」,我得到異常。這是什麼意思。我也想知道上面的mapreduce程序是否可以工作 –

+0

您必須設置作業的輸出路徑。您可以設置惰性輸出格式,因爲您不希望創建空文件。你可以像下面那樣設置。 FileOutputFormat.setOutputPath(job,outputPath); \t \t LazyOutputFormat.setOutputFormatClass(job,TextOutputFormat.class); – InfamousCoconut

+0

我再次更新了我的代碼。請參閱上文。我也嘗試過你說的,但是它在同一個目錄下產生兩個不同的輸出文件。我需要兩個不同名稱的輸出目錄 –