HADOOP-MR初步实现
一,功能
概述:在简易的hadoop集群上,用MapReduce完成一个文件里面单词计数的统计工作。
二,代码实现
主要有三个类,导入依赖的jar包。
1.master
主要是各种配置,最后一定要提交job!
import org.apache.hadoop.conf.Configuration; 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; import com.sand.mr.mapper.WordCountMapper; import com.sand.mr.reducer.WordCountReducer; public class WordCountMaster { public static void main(String[] args) throws Exception { // 初始化配置 Configuration conf = new Configuration(); // 初始化job参数,指定job名称 Job job = Job.getInstance(conf, "wordCount"); // 设置运行job的类 job.setJarByClass(WordCountMaster.class); // 设置Mapper类 job.setMapperClass(WordCountMapper.class); // 设置Reducer类 job.setReducerClass(WordCountReducer.class); // 设置Map的输出数据类型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); // 设置Reducer的输出数据类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); // 设置输入的路径 -> 可以指定为某一路径或具体的文件 FileInputFormat.setInputPaths(job, new Path("hdfs://SZ01:8020/input/user1")); // 设置输出的路径 -> 最后一级路径自动生成,不会自动覆盖,需要手动修改 FileOutputFormat.setOutputPath(job, new Path("hdfs://SZ01:8020/output/wordCount2")); // 提交job boolean result = job.waitForCompletion(true); // 执行成功后进行后续操作 if (result) { System.out.println("Congratulations!"); } } }
2.map
对集合中每一个元素进行计算
- 注意传入4个参数的类型
- 偏移量默认读取的是一行
但是将一行拆分后,偏移量会发生变化,但并不会重复读(也没理解透)
- 处理的原始数据,结果生产的是单个键值对(同键的不会合并)
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; // 处理源数据,KEYIN -> 数据的偏移量;VALUEIN -> 每一行的数据;KEYOUT -> 每个拆分得到的单词;VALUEOUT -> 单词出现次数:1 public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { @Override protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException { String line = value.toString(); String[] words = line.split(" "); for (String word : words) { context.write(new Text(word), new IntWritable(1)); } } }
3.reduce
对集合中的每一个元素进行迭代计算
- 接收到的是一个键对应一个值的集合
- 通过功能对值的集合进行运算,处理完的数据直接输出到指定文件。
import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; // KEYIN/VALUEIN -> 对应Mapper的输出,处理的Mapper的结果;KEYOUT/VALUEOUT -> 期望的结果的数据类型 public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> value, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException { int count = 0; for (IntWritable intWritable : value) { count += intWritable.get(); } context.write(new Text(key), new IntWritable(count)); } }
4,依赖的jar包,
链接: https://pan.baidu.com/s/1w-5812zxkXyT4MnbkoRGhg 密码: 59t8