大数据的时代, 到处张嘴闭嘴都是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程序)

内容如下:

import java.io.IOException;
import java.util.StringTokenizer; 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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser; public class myword { public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1);
private Text word = new Text(); public void map(Object 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);
}
}
} public static class IntSumReducer
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);
}
} 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(myword.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);
}
}

与官方版本相比, 主要做了两处修改

1) 为了简单起见,去掉了开头的 package org.apache.hadoop.examples;

2) 将类名从 WordCount 改为 myword, 以体现是我们自己的工作成果 :)

2.  拿到hadoop 运行的class path, 主要为编译所用

运行命令

hadoop classpath

保存打出的结果,本文用的hadoop 版本是Pivotal 公司的Pivotal hadoop, 例子:

/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. 编译

运行命令

javac -classpath xxx ./myword.java 

xxx部分就是上一步里面取到的class path

运行完此命令后, 当前目录下会生成一些.class 文件, 例如:

myword.class  myword$IntSumReducer.class  myword$TokenizerMapper.class

4. 将class文件打包成.jar文件

运行命令

jar -cvf myword.jar ./*.class

至此, 目标jar 文件成功生成

5. 准备一些文本文件, 上传到hdfs, 以做word count的input

例子:

随意创建一些文本文件, 保存到mapred_test 文件夹

运行命令

hadoop fs -put ./mapred_test/

确保此文件夹成功上传到hdfs 当前用户根目录下

6. 运行我们的程序

运行命令

hadoop jar ./myword.jar myword mapred_test output

顺利的话, 此命令会正常进行, 一个MapReduce job 会开始工作, 输出的结果会保存在 hdfs 当前用户根目录下的output 文件夹里面。

至此大功告成!

如果还需要更多的功能, 我们可以修改前面的源文件以达到一个真正有用的MapReduce job。

但是原理大同小异, 练手的话, 基本够了。

一个抛砖引玉的简单例子, 欢迎板砖。

版权声明:

本文由 雷子-晓飞爸 所有,发布于http://www.cnblogs.com/npumenglei/ 如果转载,请注明出处,在未经作者同意下将本文用于商业用途,将追究其法律责任。

最新文章

  1. Css样式表【边界边框】【列表方块】
  2. PHP define()的用法
  3. PLSQL_闪回操作3_Fashback Transaction Query
  4. Upgrading to Java 8——第四章 The Stream API
  5. C语言预处理程序[转]
  6. Codeforces Round #363 (Div. 2)-&gt;B. One Bomb
  7. 录制屏幕(gif)便于在博客中嵌入软件licecap
  8. mysql 5.7安装脚本
  9. 双向链表JAVA代码
  10. Hibernate - cascade-and -session_state
  11. localStorage与sessionStorage区别
  12. kafka---broker 保存消息
  13. jquery中的 deferred之 deferred对象 (一)
  14. top-adx-apps
  15. JavaScript压缩代码解压缩还原具体办法
  16. ICCV2013、CVPR2013、ECCV2013目标检测相关论文
  17. Error at offset之反序列化
  18. java进程的守护进程脚本
  19. UNITY_委托和事件
  20. Shell获取文件的文件名和扩展名的例子

热门文章

  1. 【BZOJ1054】[HAOI2008]移动玩具
  2. java单元测试的用法及原因
  3. 使用CNN做数字识别和人脸识别
  4. 1.0 JAVA基础核心概念
  5. 控制台报错: SCRIPT1006: Expected &#39;)&#39;
  6. python多线程与GIL(转)
  7. JS如何设置元素样式的方法示例
  8. docker server gave HTTP response to HTTPS client 问题处理办法
  9. Java字符串分割
  10. Netty源码分析第3章(客户端接入流程)----&gt;第3节: NioSocketChannel的创建