分享

Hadoop实现AbstractJob简化Job设置

问题导读
1、输入的参数要进行控制,怎么做?
2、如何添加自己的参数?
3、如何实现Mahout中的AbstractJob类?









在hadoop中编写一个job一般都是采用下面的方式:
  1. Job job=new Job();  
  2. job.setXxx();  
  3. ...  
复制代码



这样感觉代码很多,而且参数还不好控制。比如,我想对输入的参数进行控制,还要自己写一些控制解析之类的代码,如下:
  1. if(args.length!=2){  
  2.     System.err.out("Usage<input> <output>")  
  3. }  
复制代码



而且上面只是大概的判断下,没有很精确的判断。有没有比较好的方法可以不用设置,而且减少代码量呢?
其实可以实现Mahout中的AbstractJob类即可,如下:
  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参数,如果不输入参数,打印的信息如下:
1.png

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

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

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条