统计文件中的各个词出现的次数
jar包直接上传服务器上运行直接打src下的代码:
hadoop jar MapReduce.jar com.test.mapreduce.RunJob 直接在服务器上执行jar包相对于的类
项目中的org.apache.*包和core-site.xml和hdfs-site.xml是方便本地eclipse上运行测试
项目结构:
CountMapper:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;/**
* 定义Map任务和输出类型
* LongWritable 按下标输出
* Text 读取数据类型
* Text key值类型
* IntWritable value值类型
* @author root
*
*/
public class CountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
/** map方法是一行数据调用一次。每一次调用传入一行数据。该行数据的下标位为key。内容为value
* LongWritable 输出下标
* value 读取的数据
* context 内容组合
*/
protected void map(LongWritable key, Text value,Context context)
throws IOException, InterruptedException {
String[] str = value.toString().split(" ");//字符按空格切割
for (int i = 0; i < str.length; i++) {
String string = str[i];//获取当前字符
Text outkey = new Text(string);//字符变成Text类型
IntWritable outvalue = new IntWritable(1);//定义出现次数value
context.write(outkey, outvalue);//key ,value组合
}
}
}
————————————————————————————————————————————————————————————————————————————
CountReducer:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;/**
* Text 对应Mapper的key输出类型
* IntWritable 对应Mapper的value输入类型
* Text 对应自己定义的输出key类型
* IntWritable 对应自己定义的输出value类型
* @author oot
*
*/
public class CountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
/**
* 该方法每一组调用一次。
* key 改组的key数据
* arg1 value数组
*/
protected void reduce(Text key, Iterable<IntWritable> arg1,Context arg2)
throws IOException, InterruptedException {
int num=0;
for (IntWritable intWritable : arg1) {
num = num+intWritable.get();//计算该key出现的次数累加
}
arg2.write(key, new IntWritable(num));//计算之后重新组合key value
}
}
————————————————————————————————————————————————————————————————————————
RunJob:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class RunJob {
public static void main(String[] args) {
Configuration conf = new Configuration();//连接HDFS
conf.set("fs.defaultFS", "hdfs://node1:9000"); //该处直接指定HDFS服务器,要是jar到服务器上运行,注释掉该行
try {
FileSystem fs = FileSystem.get(conf); //定义HDFS
Job job = Job.getInstance(conf); //定义MapReduce
job.setJobName("testMapReduce");//定义这个任务的名称
job.setJarByClass(RunJob.class);//job的入口类
job.setMapperClass(CountMapper.class);//输入Mapper类
job.setReducerClass(CountReducer.class);//输入Reducer类
job.setOutputKeyClass(Text.class);//设置输出的key类型
job.setOutputValueClass(IntWritable.class);//设置输出的value类型
//定义job任务输入数据目录和输出结果目录
//把wc.txt上传到hdfs目录中/usr/intput/wc.txt
//输出结果数据放到/usr/output/wc
FileInputFormat.addInputPath(job, new Path("/usr/input/wc.txt")); //HDFS上的目录,不是服务器上的目录
Path outpath = new Path("/usr/output/wc");
//输出结果数据目录不能存在,job执行时自动创建的。如果在执行时目录已经存在,则job执行失败
if(fs.exists(outpath)){//验证是否有该文件夹,有就删除 true是递归删除
fs.delete(outpath,true);
}
FileOutputFormat.setOutputPath(job, outpath);//按规则输出到相应路径
boolean f = job.waitForCompletion(true);
if(f){
System.out.println("Job执行成功");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}