欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hadoop实现AbstractJob简化Job设置 博客分类: Hadoop Hadoop 

程序员文章站 2024-03-18 08:02:27
...

在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参数,如果不输入参数,打印的信息如下:

 

Hadoop实现AbstractJob简化Job设置
            
    
    博客分类: Hadoop Hadoop 
红色方框里面的内容,即是设置的参数;

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

http://blog.csdn.net/fansy1990

 
相关标签: Hadoop