MapReduce--程式設計模板
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處理的邏輯
*/
}
}
相關文章
- 【socket程式設計基礎模板】程式設計
- C++程式設計模板2C++程式設計
- 程式設計師簡歷模板程式設計師
- C++模板超程式設計C++程式設計
- 深入實踐c++模板程式設計C++程式設計
- C++模板超程式設計[metaprogram] (轉)C++程式設計
- 模板設計模式設計模式
- 現代c++與模板超程式設計C++程式設計
- Java設計模式——模板設計模式Java設計模式
- 微信模板介面設計
- 模板方法設計模式設計模式
- java模板設計模式Java設計模式
- 設計模式-模板模式設計模式
- 設計模式——模板模式設計模式
- 【設計模式】--模板方法設計模式
- 程式設計實踐考試的入門模板程式設計
- C++ primer 模板與泛型程式設計C++泛型程式設計
- 【C++ 泛型程式設計01:模板】函式模板與類别範本C++泛型程式設計函式
- 好程式設計師web前端教程分享js模板模式程式設計師Web前端JS模式
- 使用函數語言程式設計重構模板模式函數程式設計模式
- 現代c++模板超程式設計:遍歷tupleC++程式設計
- C++ 泛型程式設計基礎:模板通識C++泛型程式設計
- C++模板超程式設計(C++ template metaprogramming)C++程式設計
- c++ 模板超程式設計的一點體會C++程式設計
- 設計模式之模板方法設計模式
- 設計模式-模板方法模式設計模式
- php網頁模板設計PHP網頁
- 設計模式 ——— 模板方法模式設計模式
- android UI設計模板AndroidUI
- 23種設計模式(四)- 模板方法設計模式設計模式
- 6款程式設計師不得不愛的bootstrap模板程式設計師boot
- Java設計模式-模板方法模式Java設計模式
- 設計模式之【模板方法模式】設計模式
- JAVA設計模式之模板方法Java設計模式
- js設計模式--模板方法模式JS設計模式
- 詳解模板方法設計模式設計模式
- 設計模式之模板方法模式設計模式
- 設計模式之----Java模板模式設計模式Java