在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)来进行设置。
分享,成长,快乐
转载请注明blog地址:http://blog.csdn.net/fansy1990