Mapper
/***
* hadoop 分佈式運算的編程框架
* wordCount使用
*
* KEYIN : 默認情況下,是mr框架所讀到的一行文本內容的起始偏移量,Long
* 但是在hadoop中有自己的更精簡的序列化接口,所以不直接用Long,而用LongWritable
* VALUEIN : 默認情況下,是mr框架所讀到的一行文本的內容,String.同上用Text
*
* KEYOUT : 用戶自定義邏輯處理完成之後輸出數據中的key,在此處是單詞,String.同上用Text
* VALUEOUT : 用戶自定義邏輯處理完成之後輸出數據中的value,再次是單詞次數:Integer. 同上用IntWritable
*/
public class WordcountMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
/***
* map階段的業務邏輯就寫在自定義的map方法中
* maptask會對每一行輸入數據調用一次我們自定義的map()方法
*
* @param key
* @param value
* @param context
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//將maptask傳給我們的文本內容先轉換成String
String line = value.toString();
//根據空格將內容分成單詞
String[] words = line.split(" ");
//將單詞輸出爲<單詞,1>
for (String word:words){
//將單詞作爲key,將次數1作爲value. 以便後續的數據分發,可以根據單詞分發,以便於相同單詞會到相同的reduce task
context.write(new Text(word),new IntWritable(1));
}
}
}
Reduce
/***
* KEYIN,VALUEIN : 對應Mapper輸出的KEYIN,VALUEIN類型對應
*
* KEYOUT,VALUEOUT : 是自定義Reduce邏輯處理結果的輸出數據類型
* KEYOUT : 單詞
* VALUEOUT : 總次數
*/
public class WordcountReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
/***
*
* @param key 一組相同單詞kv對的key
* @param values
* @param context
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int count=0;
for (IntWritable value:values){
count+=value.get();
}
context.write(key,new IntWritable(count));
}
}
Driver
/***
* 相當於yarn的客戶端
* 需要再此封裝我們的mr程序相關運行參數,指定jar包
* 最後提交yarn
*/
public class WordcountDriver {
//把業務邏輯相關的信息 描述成job對象
public static void main(String [] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf=new Configuration();
/* conf.set("mapreduce.framework.name","yarn");
conf.set("yarn.resoucemanager.hostname","SilverMoom");*/
Job job=Job.getInstance(conf);
//job.setJarByClass指定
//指定本程序的jar包所在的本地路徑
job.setJarByClass(WordcountDriver.class);
//指定本業務job要使用的Mapper/Reducer業務類
job.setMapperClass(WordcountMapper.class);
job.setReducerClass(WordcountReducer.class);
//指定mapper輸出數據kv類型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//指定最終輸出的數據的kv類型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//指定job源文件所在目錄
FileInputFormat.setInputPaths(job,new Path(args[0]));
//指定job的輸出結果目錄
FileOutputFormat.setOutputPath(job,new Path(args[1]));
//將job中配置的相關參數,以及job所用的java類所在的jar包,提交給yarn去運行
/*job.submit();*/
/*boolean result = job.waitForCompletion(true);
System.exit(result?0:1);
*/ job.waitForCompletion(true);
}
}