MapReduce--程式設計模板

韓家小志發表於2020-12-02

1、Driver

package bigdata.hanjiaxiaozhi.cn.mapreduce.model;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;import java.io.IOException;/**
 * @ClassName MRDriver
 * @Description TODO 這是MapReduce程式的Driver類的模板
 *      為什麼要繼承這個類,實現這個介面?
 *          Tool:工具類,為你封裝了run方法,專門用於構建、配置、提交job
 *          Configured:得到getconf和setconf方法
 *      不這麼做行不行?
 *          可以的
 *          如果不這麼做,你就會將所有的程式碼寫入main方法,這樣非常不利用程式碼的規範性
 *          一個方法的程式碼不建議超過一屏
 * @Date 2020/5/30 10:34
 * @Create By     hanjiaxiaozhi
 */
public class MRDriver extends Configured implements Tool {/**
     * 用於將Job的程式碼封裝
     * @param args
     * @return
     * @throws Exception
     */
    @Override
    public int run(String[] args) throws Exception {
        //todo:1-構建一個Job
        Job job = Job.getInstance(this.getConf(),"model");//構建Job物件,呼叫父類的getconf獲取屬性的配置
        job.setJarByClass(MRDriver.class);//指定可以執行的型別
        //todo:2-配置這個Job
        //input
//        job.setInputFormatClass(TextInputFormat.class);//設定輸入的類的型別,預設就是TextInputFormat
        Path inputPath1 = new Path(args[0]);//用程式的第一個引數做為第一個輸入路徑
        Path inputPath2 = new Path(args[1]);//用程式的第二個引數作為第二個輸入路徑
        //設定的路徑可以給目錄,也可以給定檔案,如果給定目錄,會將目錄中所有檔案作為輸入,但是目錄中不能包含子目錄
        TextInputFormat.setInputPaths(job,inputPath1,inputPath2);//為當前job設定輸入的路徑//map
        job.setMapperClass(MRMapper.class);//設定Mapper的類,需要呼叫對應的map方法
        job.setMapOutputKeyClass(NullWritable.class);//設定Mapper輸出的key型別
        job.setMapOutputValueClass(NullWritable.class);//設定Mapper輸出的value型別//shuffle
//        job.setPartitionerClass(null);//自定義分割槽
//        job.setGroupingComparatorClass(null);//自定義分組的方式
//        job.setSortComparatorClass(null);//自定義排序的方式//reduce
        job.setReducerClass(MRReducer.class);//設定Reduce的類,需要呼叫對應的reduce方法
        job.setOutputKeyClass(NullWritable.class);//設定Reduce輸出的Key型別
        job.setOutputValueClass(NullWritable.class);//設定Reduce輸出的Value型別
        job.setNumReduceTasks(1);//設定ReduceTask的個數,預設為1//output:輸出目錄預設不能提前存在
//        job.setOutputFormatClass(TextOutputFormat.class);//設定輸出的類,預設為TextOutputFormat
        Path outputPath = new Path(args[2]);//用程式的第三個引數作為輸出
        //解決輸出目錄提前存在,不能執行的問題,提前將目前刪掉
        //構建一個HDFS的檔案系統
        FileSystem hdfs = FileSystem.get(this.getConf());
        //判斷輸出目錄是否存在,如果存在就刪除
        if(hdfs.exists(outputPath)){
            hdfs.delete(outputPath,true);
        }
        TextOutputFormat.setOutputPath(job,outputPath);//為當前Job設定輸出的路徑//todo:3-提交執行Job
        return job.waitForCompletion(true) ? 0:-1;
    }/**
     * 程式的入口,呼叫run方法
     * @param args
     */
    public static void main(String[] args) throws Exception {
        //構建一個Configuration物件,用於管理這個程式所有配置,工作會定義很多自己的配置
        Configuration conf = new Configuration();
        //t通過Toolruner的run方法呼叫當前類的run方法
        int status = ToolRunner.run(conf, new MRDriver(), args);
        //退出程式
        System.exit(status);
    }
 }

2、Mapper

package bigdata.hanjiaxiaozhi.cn.mapreduce.model;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/**
 * @ClassName MRMapper
 * @Description TODO 這是MapReduce模板的Map類
 *      輸入的KV型別:由inputformat決定,預設是TextInputFormat
 *      輸出的KV型別:由map方法中誰作為key,誰作為Value決定
 * @Date 2020/5/30 11:22
 * @Create By     hanjiaxiaozhi
 */
public class MRMapper extends Mapper<LongWritable, Text, NullWritable,NullWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        /**
         * 這裡實現Map處理的邏輯
         */
    }
}

3、Reducer

package bigdata.hanjiaxiaozhi.cn.mapreduce.model;import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/**
 * @ClassName MRReducer
 * @Description TODO MapReduce模板的Reducer的類
 *      輸入的KV型別:由Map的輸出決定,保持一致
 *      輸出的KV型別:由reduce方法中誰作為key,誰作為Value決定
 * @Date 2020/5/30 11:25
 * @Create By     hanjiaxiaozhi
 */
public class MRReducer extends Reducer<NullWritable,NullWritable,NullWritable,NullWritable> {
    @Override
    protected void reduce(NullWritable key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {/**
         * 實現reduce處理的邏輯
         */
    }
}

相關文章