洛阳室内设计公司排名/烟台seo关键词排名
MapReduce概述及其Wordcount案例
- 一、MapReduce简介
- 二、MapReduce核心思想
- 三、MapReduce实例进程
- 四、MapReduce程序组成
- 五、WordCount实现
一、MapReduce简介
- Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架;其思想来源于Google的MapReduce。Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。
二、MapReduce核心思想
- 简单而言,就是拆分的思想,即“分而治之”,大任务被拆分成小的任务并行计算,具体如下:
- 1)分布式的运算程序往往需要分成至少2个阶段。
- 2)第一个阶段的maptask并发实例,完全并行运行,互不相干。
- 3)第二个阶段的reduce task并发实例互不相干,但是他们的数据依赖于上一个阶段的所有maptask并发实例的输出。
- 4)MapReduce编程模型只能包含一个map阶段和一个reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个mapreduce程序,串行运行。
三、MapReduce实例进程
- 一个完整的mapreduce程序在分布式运行时有三类实例进程:
四、MapReduce程序组成
- 用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)
五、WordCount实现
-
分析MapReduce经典案例Wordcount的设计思路及数据处理过程
-
测试数据,如wordcount.txt文本,内容如下:
I love Guiyang I love Guizhou Guiyang is the capical of Guizhou
-
定义
WordCountMapper
,继承于Hadoop的Mapperimport org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// key 偏移量 value 每行文本:I love Guiyang// 按照空格对每行文本进行分词操作:[I,love,Guiyang]String line = value.toString(); // 数据类型的转换String[] words = line.split(" "); // 对字符串进行拆分 [I,love,Guiyang]for (int i = 0; i < words.length; i++) {// (I,1)Text word = new Text(words[i]);IntWritable value2 = new IntWritable(1);context.write(word,value2);}} }
-
定义
WordCountReducer
,继承于Hadoop的Reducerimport org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class WordCountReducer extends Reducer<Text, IntWritable,Text, IntWritable> {@Overrideprotected void reduce(Text k3, Iterable<IntWritable> v3, Context context) throws IOException, InterruptedException {// 进行求和操作,需要计算v3的长度// <I,[1,1]>int count = 0;for (IntWritable v: v3) {int value = v.get();count += value;}context.write(k3,new IntWritable(count));} }
-
定义
WordCountJob
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 java.io.IOException;public class WordCountJob {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {// 实列化JobJob job = Job.getInstance();job.setJarByClass(WordCountJob.class);// 设置Mapperjob.setMapperClass(WordCountMapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);// 设置Reducerjob.setReducerClass(WordCountReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);// 指明输入文件的路径FileInputFormat.setInputPaths(job,new Path("d:/wordcount.txt"));// 指明输出文件的路径FileOutputFormat.setOutputPath(job,new Path("d:/mr_result/wc01"));// 开始运行任务boolean completion = job.waitForCompletion(true);if (completion){System.out.println("程序运行成功~");}else {System.out.println("程序运行失败~");}} }
-
本地运行,测试其功能是否正常
打开结果文件part-r-00000,内容如下:
-
将程序打包,上传到服务器,利用hadoop命令执行程序(读者自行打包)