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

10 篇文章 0 订阅
  
  • 大数据的时代, 到处张嘴闭嘴都是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/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值