通过一个例子了解MapReduce
写MapReduce程序的步骤:
- 把问题转化为MapReduce模型;
- 设置运行参数;
- 写map类;
- 写reduce类;
例子:统计单词个数
Map的任务是将内容用“ ”分开,然后每个都对应1,Reduce将相同的统计起来
1,Map端:一行行读文件,程序转化为中间Key/Value。每一个键值对调用一次map函数。
hello you hello me → hello 1,you 1,hello 1,me 1;
2,Reduce端:相同的Key肯定会在一起。经过Reduce方法处理后形成最终的Key/Value
hello 1,hello 1→hello 2;
写一个MapClass extends Mapper<keyin,valuein,keyout,valueout>类,实现map方法;
用java思想理解:
//word.txt 内容(两行) //"hello you hello world →hello 1, you 1,hello 1,world 1 //hello me"; →hello 1,me 1 String str = "hello you hello world"; //String[] strs=str.split(" ");//按空格划分 //strs[0]=hello →map(key,1) →map(hello,1)用MapReduce实现:
package mapreduce; import java.util.StringTokenizer; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class MapClass extends Mapper<Object, Text, Text, IntWritable> { //Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> //参数:Object,Text(和java的String一样),Text,IntWritable(和java int一样) //Map的输出是Reduce的输入; public Text keyText = new Text("key");//相当于String ketText="key" public IntWritable intValue = new IntWritable(1); protected void map(Object key, Text value, Context context) throws java.io.IOException, InterruptedException { //获取值 String str = value.toString(); //默认空格分割 StringTokenizer stringToKenizer = new StringTokenizer(str); while (stringToKenizer.hasMoreTokens()) { keyText.set(stringToKenizer.nextToken()); context.write(keyText, intValue);//context.write("My",1) //上下文 } }; }
一个ReduceClass extends Reducer< keyin,valuein,keyout,valueout >类;实现reduce方法:
package mapreduce;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.VLongWritable;
import org.apache.hadoop.mapreduce.Reducer;
public class ReduceClass extends Reducer<Text, IntWritable, Text, IntWritable> {
//Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
//Map的输出是Reduce的输入;
public IntWritable intValue = new IntWritable(1);
protected void reduce(Text key, java.lang.Iterable<IntWritable> values,//name [1,1]
org.apache.hadoop.mapreduce.Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws java.io.IOException, InterruptedException {
int sum = 0;
while (values.iterator().hasNext()) {
sum += values.iterator().next().get();
}
intValue.set(sum);
context.write(key, intValue);//上下文
};
}
接下来写main测试,新建一个类WordCounter(其中的main拷贝源码例子中的main如下:
hadoop-1.1.2\src\examples\org\apache\hadoop\examples\WordCount.java
public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 2) { System.err.println("Usage: wordcount <in> <out>"); System.exit(2); } Job job = new Job(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); }WordCounter类
package mapreduce; import java.io.IOException; 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.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner; import org.apache.hadoop.util.GenericOptionsParser; public class WordCounter { public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 2) { System.err.println("Usage: wordcount <in> <out>"); System.exit(2); } Job job = new Job(conf, "word count"); job.setJarByClass(WordCounter.class);//打包jar要写,执行的类:本类 job.setMapperClass(MapClass.class);//MapClass类 //job.setCombinerClass(IntSumReducer.class); job.setReducerClass(ReduceClass.class);//ReduceClass类 job.setOutputKeyClass(Text.class);//输出的key类型 job.setOutputValueClass(IntWritable.class);//输出的value类型 FileInputFormat.addInputPath(job, new Path(otherArgs[0]));//输入参数 FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));//输出参数 System.exit(job.waitForCompletion(true) ? 0 : 1); } }
完成后导出成jar包放到hadoop运行:
右击包名,Export,Java,JAR file 导出,拷贝到Linux桌面;
上传到hadoop: 记得打开java进程:start-all.sh
[root@hadoop Desktop]# hadoop fs -put mapreduceTest.jar /新建一个文件:
root@hadoop Desktop]# vi wordTest.txt内容:
hello you hello me hello world将文件上传到hadoop:
[root@hadoop Desktop]# hadoop fs -put wordTest.txt /运行:参数4:包名加类名;5上一步上传到的文件,6输出到哪里
[root@hadoop Desktop]# hadoop jar mapreduceTest.jar cn.mapreduce.WordCounter /wordTest.txt /outputTest查看日志:(/part-r-00000是固定的)
[root@hadoop Desktop]# hadoop fs -text /outputTest/part-r-00000 Warning: $HADOOP_HOME is deprecated. hello 3 me 1 world 1 you 1完成;
通过一个例子了解MapReduce的更多相关文章
- Hadoop学习历程(四、运行一个真正的MapReduce程序)
上次的程序只是操作文件系统,本次运行一个真正的MapReduce程序. 运行的是官方提供的例子程序wordcount,这个例子类似其他程序的hello world. 1. 首先确认启动的正常:运行 s ...
- spring笔记--使用springAPI以及自定义类 实现AOP的一个例子
Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...
- ReCap 360 photo照片建模技术的又一个例子
这是我做的又一个利用Autodesk ReCap 360 照片建模技术做的一个例子.你可以下载模型自己把玩,或者下载原始照片自己试一试. 拍摄工具: 小米手机 照片数量:约120张 后期处理工具: p ...
- 从一个例子中体会React的基本面
[起初的准备工作] npm init npm install --save react react-dom npm install --save-dev html-webpack-plugin web ...
- 用thinkphp写的一个例子:抓取网站的内容并且保存到本地
我需要写这么一个例子,到电子课本网下载一本电子书. 电子课本网的电子书,是把书的每一页当成一个图片,然后一本书就是有很多张图片,我需要批量的进行下载图片操作. 下面是代码部分: public func ...
- Erlang 程序引发共享内存 bug 的一个例子
虽然 Erlang 的广告说得非常好,functional.share-nothing.消息传递,blah blah 的,好像用 Erlang 写并发程序就高枕无忧了,但是由于 Erlang 信奉高度 ...
- 对Jena的简单理解和一个例子
本文简单介绍Jena(Jena 2.4),使用Protégé 3.1(不是最新版本)创建一个简单的生物(Creature)本体,然后参照Jena文档中的一个例子对本体进行简单的处理,输出本体中的Cla ...
- 使用flume的一个例子
新项目中需要使用到hadoop和vertica,使用flume把数据加载到hadoop中,我做了一个例子, 即监控一个sharefolder,如果里面有文件,则会文件load到hadoop. 开启Fl ...
- php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;
一.封装性: 目的:为了使类更加安全. 做法:1设置私有成员 2在类中建方法,访问私有成员 3在方法里边加控制(if) 私有成员访问的两种方法: 方法一:set(可写) get(可读)做方法(可读可写 ...
随机推荐
- 将 Net 项目升级 Core项目经验:(二)修复迁移后Net Standard项目中的错误
修复迁移后Net Standard项目中的错误 接上一章,项目编译结果如下: 解决依赖dll引用 在Net Framework项目的引用如下: 各引用和作用: log4net(1.10.0.0) 用于 ...
- PHPCMS v9.6.0 任意文件上传漏洞分析
引用源:http://paper.seebug.org/273/ 配置了php debug的环境,并且根据这篇文章把流程走了一遍,对phpstorm的debug熟练度+1(跟pycharm一样) 用户 ...
- [POI 2006]OKR-Periods of Words
Description 题库链接 定义 \(A\) 串为 \(B\) 串的循环串,当且仅当 \(A\) 是 \(B\) 的前缀(不包括 \(B\) 本身),且 \(B\) 为连续的 \(A\) 串拼接 ...
- 2015 多校联赛 ——HDU5363(快速幂)
Problem Description soda has a set S with n integers {1,2,…,n}. A set is called key set if the sum o ...
- FZU 2158
在密室逃脱游戏中,大家被困在一个密室中,为了逃出密室,需要找到正确的数字密码,于是大家分头行动,分别找到了密码的子序列,而后大家将得到的线索集中整理分析,大家想知道密码最少是多少位. Input 第 ...
- hdu 5428
题意:一个数是这n个数的乘,找出它一个不是素数的最小因子 求出所有数的所有质因子中最小的两个,相乘就是答案.如果所有数字的质因子个数不到两个,那么就是无解. #include<iostream& ...
- C语言程序设计第六次作业——循环结构(2)
C语言程序设计第六次作业--循环结构(2) 之前的博客园图片没处理好,对大家说一声抱歉.希望大家能够多多指出我的错误,我来认真修改 ^ - ^ !. (1)改错题 序列求和:输入一个正实数eps,计算 ...
- async/await,了解一下?
上一篇博客我们在现实使用和面试角度讲解了Promise(原文可参考<面向面试题和实际使用谈promise>),但是Promise 的方式虽然解决了 callback hell,但是这种方式 ...
- Spring之定时器(QuartzJobBean)的实现
需求:做个分配任务的功能模块,在任务截止前的十五分钟进行提醒(发送邮件.短信.系统提醒).每隔五分钟提醒一次,直到任务完成! 想法:刚开始是想着是不是可以做个监听器,监听截止时间.当时间到了开始进 ...
- 入口文件开始,分析Vue源码实现
Why? 网上现有的Vue源码解析文章一搜一大批,但是为什么我还要去做这样的事情呢?因为觉得纸上得来终觉浅,绝知此事要躬行. 然后平时的项目也主要是Vue,在使用Vue的过程中,也对其一些约定产生了一 ...