如何快速地编写和运行一个属于自己的MapReduce例子程序

 我来答
可以叫我表哥
推荐于2016-04-12 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
采纳数:25897 获赞数:1464980
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。

向TA提问 私信TA
展开全部
  大数据的时代, 到处张嘴闭嘴都是Hadoop, MapReduce, 不跟上时代怎么行? 可是对一个hadoop的新手, 写一个属于自己的MapReduce程序还是小有点难度的, 需要建立一个maven项目, 还要搞清楚各种库的依赖, 再加上编译运行, 基本上头大两圈了吧。 这也使得很多只是想简单了解一下MapReduce的人望而却步。
  本文会教你如何用最快最简单的方法编写和运行一个属于自己的MapReduce程序, let's go!
  首先有两个前提:
  1. 有一个已经可以运行的hadoop 集群(也可以是伪分布系统), 上面的hdfs和mapreduce工作正常 (这个真的是最基本的了, 不再累述, 不会的请参考 http://hadoop.apache.org/docs/current/)
  2. 集群上安装了JDK (编译运行时会用到)
  正式开始
  1. 首先登入hadoop 集群里面的一个节点, 创建一个java源文件, 偷懒起见, 基本盗用官方的word count (因为本文的目的是教会你如何快编写和运行一个MapReduce程序, 而不是如何写好一个功能齐全的MapReduce程序)
  内容如下:
  view sourceprint?
  01.import java.io.IOException;
  02.import java.util.StringTokenizer;
  03.
  04.import org.apache.hadoop.conf.Configuration;
  05.import org.apache.hadoop.fs.Path;
  06.import org.apache.hadoop.io.IntWritable;
  07.import org.apache.hadoop.io.Text;
  08.import org.apache.hadoop.mapreduce.Job;
  09.import org.apache.hadoop.mapreduce.Mapper;
  10.import org.apache.hadoop.mapreduce.Reducer;
  11.import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12.import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  13.import org.apache.hadoop.util.GenericOptionsParser;
  14.
  15.public class my<a href="http://www.it165.net/edu/ebg/" target="_blank" class="keylink">word</a> {
  16.
  17.public static class TokenizerMapper
  18.extends Mapper<Object, Text, Text, IntWritable>{
  19.
  20.private final static IntWritable one = new IntWritable(1);
  21.private Text word = new Text();
  22.
  23.public void map(Object key, Text value, Context context
  24.) throws IOException, InterruptedException {
  25.StringTokenizer itr = new StringTokenizer(value.toString());
  26.while (itr.hasMoreTokens()) {
  27.word.set(itr.nextToken());
  28.context.write(word, one);
  29.}
  30.}
  31.}
  32.
  33.public static class IntSumReducer
  34.extends Reducer<Text,IntWritable,Text,IntWritable> {
  35.private IntWritable result = new IntWritable();
  36.
  37.public void reduce(Text key, Iterable<IntWritable> values,
  38.Context context
  39.) throws IOException, InterruptedException {
  40.int sum = 0;
  41.for (IntWritable val : values) {
  42.sum += val.get();
  43.}
  44.result.set(sum);
  45.context.write(key, result);
  46.}
  47.}
  48.
  49.public static void main(String[] args) throws Exception {
  50.Configuration conf = new Configuration();
  51.String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
  52.if (otherArgs.length != 2) {
  53.System.err.println('Usage: wordcount <in> <out>');
  54.System.exit(2);
  55.}
  56.Job job = new Job(conf, 'word count');
  57.job.setJarByClass(myword.class);
  58.job.setMapperClass(TokenizerMapper.class);
  59.job.setCombinerClass(IntSumReducer.class);
  60.job.setReducerClass(IntSumReducer.class);
  61.job.setOutputKeyClass(Text.class);
  62.job.setOutputValueClass(IntWritable.class);
  63.FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
  64.FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
  65.System.exit(job.waitForCompletion(true) ? 0 : 1);
  66.}
  67.}
  与官方版本相比, 主要做了两处修改
  1) 为了简单起见,去掉了开头的 package org.apache.hadoop.examples;
  2) 将类名从 WordCount 改为 myword, 以体现是我们自己的工作成果 :)
  2. 拿到hadoop 运行的class path, 主要为编译所用
  运行命令
  view sourceprint?
  1.hadoop classpath
  保存打出的结果,本文用的hadoop 版本是Pivotal 公司的Pivotal hadoop, 例子:
  view sourceprint?
  1./etc/gphd/hadoop/conf:/usr/lib/gphd/hadoop/lib/*:/usr/lib/gphd/hadoop/.//*:/usr/lib/gphd/hadoop-hdfs/./:/usr/lib/gphd/hadoop-hdfs/lib/*:/usr/lib/gphd/hadoop-hdfs/.//*:/usr/lib/gphd/hadoop-yarn/lib/*:/usr/lib/gphd/hadoop-yarn/.//*:/usr/lib/gphd/hadoop-mapreduce/lib/*:/usr/lib/gphd/hadoop-mapreduce/.//*::/etc/gphd/pxf/conf::/usr/lib/gphd/pxf/pxf-core.jar:/usr/lib/gphd/pxf/pxf-api.jar:/usr/lib/gphd/publicstage:/usr/lib/gphd/gfxd/lib/gemfirexd.jar::/usr/lib/gphd/zookeeper/zookeeper.jar:/usr/lib/gphd/hbase/lib/hbase-common.jar:/usr/lib/gphd/hbase/lib/hbase-protocol.jar:/usr/lib/gphd/hbase/lib/hbase-client.jar:/usr/lib/gphd/hbase/lib/hbase-thrift.jar:/usr/lib/gphd/hbase/lib/htrace-core-2.01.jar:/etc/gphd/hbase/conf::/usr/lib/gphd/hive/lib/hive-service.jar:/usr/lib/gphd/hive/lib/libthrift-0.9.0.jar:/usr/lib/gphd/hive/lib/hive-metastore.jar:/usr/lib/gphd/hive/lib/libfb303-0.9.0.jar:/usr/lib/gphd/hive/lib/hive-common.jar:/usr/lib/gphd/hive/lib/hive-exec.jar:/usr/lib/gphd/hive/lib/postgresql-jdbc.jar:/etc/gphd/hive/conf::/usr/lib/gphd/sm-plugins/*:
  3. 编译
  运行命令
  view sourceprint?
  1.javac -classpath xxx ./myword.java
  xxx部分就是上一步里面取到的class path
  运行完此命令后, 当前目录下会生成一些.class 文件, 例如:
  myword.class myword$IntSumReducer.class myword$TokenizerMapper.class
  4. 将class文件打包成.jar文件
  运行命令
  view sourceprint?
  1.jar -cvf myword.jar ./*.class
  至此, 目标jar 文件成功生成
  5. 准备一些文本文件, 上传到hdfs, 以做word count的input
  例子:
  随意创建一些文本文件, 保存到mapred_test 文件夹
  运行命令
  view sourceprint?
  1.hadoop fs -put ./mapred_test/
  确保此文件夹成功上传到hdfs 当前用户根目录下
  6. 运行我们的程序
  运行命令
  view sourceprint?
  1.hadoop jar ./myword.jar myword mapred_test output
  顺利的话, 此命令会正常进行, 一个MapReduce job 会开始工作, 输出的结果会保存在 hdfs 当前用户根目录下的output 文件夹里面。
  至此大功告成!
  如果还需要更多的功能, 我们可以修改前面的源文件以达到一个真正有用的MapReduce job。
  但是原理大同小异, 练手的话, 基本够了。
  一个抛砖引玉的简单例子, 欢迎板砖。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式