-
大数据的时代, 到处张嘴闭嘴都是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程序)
内容如下:
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, 主要为编译所用
运行命令
1.
hadoop classpath
保存打出的结果,本文用的hadoop 版本是Pivotal 公司的Pivotal hadoop, 例子:
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. 编译
运行命令
1.
javac -classpath xxx ./myword.java
xxx部分就是上一步里面取到的class path
运行完此命令后, 当前目录下会生成一些.class 文件, 例如:
myword.class myword$IntSumReducer.class myword$TokenizerMapper.class
4. 将class文件打包成.jar文件
运行命令
1.
jar -cvf myword.jar ./*.
class
至此, 目标jar 文件成功生成
5. 准备一些文本文件, 上传到hdfs, 以做word count的input
例子:
随意创建一些文本文件, 保存到mapred_test 文件夹
运行命令
1.
hadoop fs -put ./mapred_test/
确保此文件夹成功上传到hdfs 当前用户根目录下
6. 运行我们的程序
运行命令
1.
hadoop jar ./myword.jar myword mapred_test output
顺利的话, 此命令会正常进行, 一个MapReduce job 会开始工作, 输出的结果会保存在 hdfs 当前用户根目录下的output 文件夹里面。
至此大功告成!
如果还需要更多的功能, 我们可以修改前面的源文件以达到一个真正有用的MapReduce job。
但是原理大同小异, 练手的话, 基本够了。
一个抛砖引玉的简单例子, 欢迎板砖。
版权声明:
出处http://www.cnblogs.com/npumenglei/
如何快速地编写和运行一个属于自己的MapReduce例子程序
最新推荐文章于 2022-10-01 10:19:49 发布