歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Hadoop實現AbstractJob簡化Job設置

在Hadoop中編寫一個job一般都是采用下面的方式:

Job job=new Job();
job.setXxx();
...

這樣感覺代碼很多,而且參數還不好控制。比如,我想對輸入的參數進行控制,還要自己寫一些控制解析之類的代碼,如下:

if(args.length!=2){
    System.err.out("Usage<input> <output>")
}

而且上面只是大概的判斷下,沒有很精確的判斷。有沒有比較好的方法可以不用設置,而且減少代碼量呢?

其實可以實現Mahout中的AbstractJob類即可,如下:

package mahout.fansy.bayes.transform;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
import org.apache.hadoop.util.ToolRunner;
import org.apache.mahout.common.AbstractJob;
import org.apache.mahout.math.VectorWritable;

public class TFText2VectorWritable extends AbstractJob {

 @Override
 public int run(String[] args) throws Exception {
  addInputOption();
    addOutputOption();
    addOption("splitCharacter","sc", "vector split character,default is ','", ",");
    if (parseArguments(args) == null) {
        return -1;
      }

    Path input = getInputPath();
    Path output = getOutputPath();
    String sc=getOption("splitCharacter");
    Job job=prepareJob(input,output,FileInputFormat.class,Mapper.class,LongWritable.class,Text.class,
      null, Text.class,VectorWritable.class,SequenceFileOutputFormat.class);
    job.getConfiguration().set("sc", sc);
    if(job.waitForCompletion(true)){
     return 0;
    }
  return -1;
 }

 /**
  *實現AbstractJob
  * @param args
  * @throws Exception
  */
 public static void main(String[] args) throws Exception {
  String[] arg=new String[]{"-i","safdf","-sc","scccccccc","-o","sdf"};
  ToolRunner.run(new Configuration(), new TFText2VectorWritable(),arg);
 }

}

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

紅色方框裡面的內容,即是設置的參數;

同時調用prepareJob方法可以簡化Job的參數設置。比如設置Mapper、MapperOutPutKey等等都要一行代碼,現在全部只需一行即可;如果要設置參數以供Mapper和Reducer中使用,可以使用job.getConfiguration().set("sc", sc)來進行設置。

Copyright © Linux教程網 All Rights Reserved