在之前我已经介绍过MapReduce程序运行时的过程,接下来我们自己编写一个wordcount程序,我会在代码中做详细的标注:
不多说直接上代码:(不继承也不实现)
package com.superyong.mapreduce;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
/**
* 词频统计 MapReduce 程序
* 还记得之前在虚拟机上运行的那个 wordcount 模板么
* bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /datas/mapreduce_test/input /datas/mapreduce_test/output/output01
* 这上面的参数 依次顺序是: 执行平台-》执行包的类型-》包所在的绝对目录-》执行的类-》被执行文件路径(hdfs路径)-》执行结果文件存放路径(hdfs路径)
* 这里说一下因为官方提供的类有默认的执行类名,我们没有设置,所以执行类的时候,要写类的全路径
*/
public class WordCountMapReduce {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//这里判断一下参数的个数,上面说过,
//运行这个程序需要指定 ‘被运行文件’ 和‘结果文件’的目录,
//这两个参数通过main函数中的args传递,可以在执行时打开配置来设置这两个参数!
if (args.length < 2){
System.out.println( "Usage:WordCountMapReduce <in> [<in>...] <out>" );
return;
}
//读取配置文件信息;注意别导错包!是hadoop的包
Configuration configuration = new Configuration();
//创建一个job任务
/*
import org.apache.hadoop.mapred.jobcontrol.Job; hadoop 1.x
import org.apache.hadoop.mapreduce.Job; hadoop 2.x
注意这两包:虽然都是job类,但是一个是1.0版本的hadoop包一个是2.0版本的hadoop包
*/
// public static Job getInstance( Configuration conf, String jobName )
// 这两个参数一个是配置文件,一个是application中的job任务名,运行程序之后就可以在8088上看到
Job job = Job.getInstance( configuration, "WordCount" );
//设置Job任务运行的主类
job.setJarByClass( WordCountMapReduce.class );
//设置job
//input
Path inputPath = new Path( args[0] );//获取被执行文件的目录
FileInputFormat.setInputPaths( job,inputPath );
//这两个可以等代码写完之后在进行设置,如果已经知道类型就直接设置:
//map
job.setMapperClass( WordCountMapper.class );
job.setMapOutputKeyClass