MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,概念“Map(映射)”和“Reduce(归约)”,以及他们的主要思想,都是从函数式编程语言借来的,还有矢量编程语言,这种模型极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
开发环境准备
安装Java开发环境:JDK 1.8或更高版本
安装Hadoop环境:Hadoop 2.x或更高版本
配置Hadoop环境变量
安装并配置IDE(如Eclipse、IntelliJ IDEA等)
需求分析
假设我们需要统计大量文本中单词出现的次数。
设计思路
1. Map阶段
输入:文本文件
处理:按行读取文件内容,将每一行文本拆分成单词
输出:<单词,1>键值对
2. Shuffle阶段
输入:Map阶段的输出
处理:根据键值对的键(单词)进行排序和分组
输出:<单词,[1,1,…,1]>键值对
3. Reduce阶段
输入:Shuffle阶段的输出
处理:对每个键值对中的值列表进行累加
输出:<单词,出现次数>键值对
代码实现
1、Map类
public static class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } }
2、Reduce类
public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } }
3、主类
public class WordCount { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
编译与运行
1、使用javac
命令编译代码
2、使用hadoop jar
命令运行程序
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/864537.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复