`
wbj0110
  • 浏览: 1549588 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Hadoop实现AbstractJob简化Job设置

阅读更多

在hadoop中编写一个job一般都是采用下面的方式:

 

[java] view plaincopy
 
  1. Job job=new Job();  
  2. job.setXxx();  
  3. ...  

这样感觉代码很多,而且参数还不好控制。比如,我想对输入的参数进行控制,还要自己写一些控制解析之类的代码,如下:

 

 

[java] view plaincopy
 
  1. if(args.length!=2){  
  2.     System.err.out("Usage<input> <output>")  
  3. }  

而且上面只是大概的判断下,没有很精确的判断。有没有比较好的方法可以不用设置,而且减少代码量呢?

 

其实可以实现Mahout中的AbstractJob类即可,如下:

 

[java] view plaincopy
 
  1. package mahout.fansy.bayes.transform;  
  2.   
  3. import org.apache.hadoop.conf.Configuration;  
  4. import org.apache.hadoop.fs.Path;  
  5. import org.apache.hadoop.io.LongWritable;  
  6. import org.apache.hadoop.io.Text;  
  7. import org.apache.hadoop.mapreduce.Job;  
  8. import org.apache.hadoop.mapreduce.Mapper;  
  9. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  10. import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;  
  11. import org.apache.hadoop.util.ToolRunner;  
  12. import org.apache.mahout.common.AbstractJob;  
  13. import org.apache.mahout.math.VectorWritable;  
  14.   
  15. public class TFText2VectorWritable extends AbstractJob {  
  16.   
  17.     @Override  
  18.     public int run(String[] args) throws Exception {  
  19.         addInputOption();  
  20.         addOutputOption();  
  21.         addOption("splitCharacter","sc""vector split character,default is ','"",");  
  22.         if (parseArguments(args) == null) {  
  23.               return -1;  
  24.             }  
  25.   
  26.         Path input = getInputPath();  
  27.         Path output = getOutputPath();  
  28.         String sc=getOption("splitCharacter");  
  29.         Job job=prepareJob(input,output,FileInputFormat.class,Mapper.class,LongWritable.class,Text.class,  
  30.                 null, Text.class,VectorWritable.class,SequenceFileOutputFormat.class);  
  31.         job.getConfiguration().set("sc", sc);  
  32.         if(job.waitForCompletion(true)){  
  33.             return 0;  
  34.         }  
  35.         return -1;  
  36.     }  
  37.   
  38.     /** 
  39.      *实现AbstractJob 
  40.      * @param args 
  41.      * @throws Exception  
  42.      */  
  43.     public static void main(String[] args) throws Exception {  
  44.         String[] arg=new String[]{"-i","safdf","-sc","scccccccc","-o","sdf"};  
  45.         ToolRunner.run(new Configuration(), new TFText2VectorWritable(),arg);  
  46.     }  
  47.   
  48. }  

如果你要添加自己的参数,可以直接在run方法中添加即可,比如上面笔者添加的splitCharacter参数,如果不输入参数,打印的信息如下:

 


红色方框里面的内容,即是设置的参数;

同时调用prepareJob方法可以简化Job的参数设置。比如设置Mapper、MapperOutPutKey等等都要一行代码,现在全部只需一行即可;如果要设置参数以供Mapper和Reducer中使用,可以使用job.getConfiguration().set("sc", sc)来进行设置。

http://blog.csdn.net/fansy1990

 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics