大数据入门:WordCount程序解析
大数据入门:WordCount程序解析
为一个顽固的家伙写的,都要考试了还不让我给详细讲一下,我就想白眼死你!!!
一、输入
输入源可以是一个文件,也可以是包含多个文件的文件夹。
具体的只需要在程序的文件输入路径中指定就可以。这里以一个txt文件为例:
二、程序解析
(1)我们需要了解MapReduce(MR)的过程
(2) 程序代码
import org.apache.hadoop.fs.Path;
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.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;
public class WordCount {
//Map阶段 参数是map的输入key、value,输出的key、value
public static class WcMapper extends Mapper<LongWritable,Text,Text,IntWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//读取每一行,所以类型是LongWritable
String line = value.toString();
//将每一行的单词按空格切分(注意这里要看文件单词的间隔符是空格还是\t。。。)
String[] strs = line.split(" ");
//Map的输出key、value
for (String s:strs){
Text outkey = new Text(s);
IntWritable outvalue = new IntWritable(1);
context.write(outkey,outvalue);
}
}
}
//Reduce阶段,Map的输出是Reduce的输入 ,输入的key、value, 输出的key、value
public static class WcReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int count = 0;
//将相同的key进行合并,value累加
for (IntWritable n:values){
count += n.get();
}
context.write(key,new IntWritable(count));
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Job job = Job.getInstance();
//简记 4 2 2 1
//Map的输出key、value映射
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//可以省略
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//Mapper类、Reduce类的映射
job.setMapperClass(WcMapper.class);
job.setReducerClass(WcReduce.class);
//输入文件和输出文件的路径
FileInputFormat.setInputPaths(job,new Path("E:\\input.txt"));
FileOutputFormat.setOutputPath(job,new Path("E:\\output"));
job.waitForCompletion(true);
}
}
三、输出
(1)控制台输出:
(2)具体的输出是一个文件夹
四、需要注意的地方
- Map和Reduce类不要忘了static关键字,否则会出错
- 各个阶段的输入输出格式类型不要弄混
- 下执行一次之前务必要改输出文件夹名称
- Job提交过程的4221