[b0012] Hadoop 版hello word mapreduce wordcount 运行(二)

目的:

学习Hadoop mapreduce 开发环境eclipse windows下的搭建

环境:

Winows 7 64 eclipse 直接连接hadoop运行的环境已经搭建好,结果输出到eclipse

Hadoop2.6.4环境

 

相关:

[0004] Hadoop 版hello word mapreduce wordcount 运行

[0011] windows 下 eclipse 开发 hdfs程序样例 (三)

[0008] Windows 7 下 hadoop 2.6.4 eclipse 本地开发调试配置

 

说明:

这种方式的mapreduce不是在集群上跑。8080web查询不到。 

程序是把hdfs上的数据下载到windows本地,执行程序,再将输出结果上传到hdfs。

[遗留:待解决]

 

1.新建项目

1.1 新建项目、导入hadoop开发包

详细参考

[0007] windows 下 eclipse 开发 hdfs程序样例  1 新建项目

 

1.2 可选,如果后续执行报错,回头执行这一步

将hadoop下的一个源码包导入,参考 [0008]  Y.2.1.b步骤    ,如果还有其他问题 参考[0008]整个搭建过程涉及的设置。

 

2 新建wordcount类

代码如下

 1 package hdfs;
 2 
 3 import java.io.IOException;
 4 import java.util.*;
 5 
 6 import org.apache.hadoop.fs.Path;
 7 import org.apache.hadoop.conf.*;
 8 import org.apache.hadoop.io.*;
 9 import org.apache.hadoop.mapreduce.*;
10 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
11 import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
12 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
13 import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
14 
15 /**
16  * 描述:WordCount explains by xxm
17  * @author xxm
18  */
19 public class WordCount {
20 
21  /**
22  * Map类:自己定义map方法
23  */
24  public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
25     /**
26     * LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类
27     * 都能够被串行化从而便于在分布式环境中进行数据交换,可以将它们分别视为long,int,String 的替代品。
28     */
29     private final static IntWritable one = new IntWritable(1);
30     private Text word = new Text();
31     /**
32     * Mapper类中的map方法:
33     * protected void map(KEYIN key, VALUEIN value, Context context)
34     * 映射一个单个的输入k/v对到一个中间的k/v对
35     * Context类:收集Mapper输出的<k,v>对。
36     */
37     public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
38         String line = value.toString();
39         StringTokenizer tokenizer = new StringTokenizer(line);
40         while (tokenizer.hasMoreTokens()) {
41             word.set(tokenizer.nextToken());
42             context.write(word, one);
43         }
44     }
45  } 
46 
47  /**
48  * Reduce类:自己定义reduce方法
49  */       
50  public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
51 
52     /**
53     * Reducer类中的reduce方法:
54     * protected void reduce(KEYIN key, Interable<VALUEIN> value, Context context)
55     * 映射一个单个的输入k/v对到一个中间的k/v对
56     * Context类:收集Reducer输出的<k,v>对。
57     */
58     public void reduce(Text key, Iterable<IntWritable> values, Context context) 
59       throws IOException, InterruptedException {
60         int sum = 0;
61         for (IntWritable val : values) {
62             sum += val.get();
63         }
64         context.write(key, new IntWritable(sum));
65     }
66  }
67 
68  /**
69  * main主函数
70  */       
71  public static void main(String[] args) throws Exception {
72 
73     Configuration conf = new Configuration();//创建一个配置对象,用来实现所有配置
74 //    conf.set("fs.defaultFS", "hdfs://ssmaster:9000/");
75     
76     Job job = new Job(conf, "wordcount");//新建一个job,并定义名称
77 
78     job.setOutputKeyClass(Text.class);//为job的输出数据设置Key类
79     job.setOutputValueClass(IntWritable.class);//为job输出设置value类
80     
81     job.setMapperClass(Map.class); //为job设置Mapper类
82     job.setReducerClass(Reduce.class);//为job设置Reduce类
83     job.setJarByClass(WordCount.class);
84 
85     job.setInputFormatClass(TextInputFormat.class);//为map-reduce任务设置InputFormat实现类
86     job.setOutputFormatClass(TextOutputFormat.class);//为map-reduce任务设置OutputFormat实现类
87 
88     FileInputFormat.addInputPath(job, new Path(args[0]));//为map-reduce job设置输入路径
89     FileOutputFormat.setOutputPath(job, new Path(args[1]));//为map-reduce job设置输出路径
90     job.waitForCompletion(true); //运行一个job,并等待其结束
91  }
92 
93 }
View Code

 

3 执行

eclipse指定 输入输出,执行 ,可以参考[0008] 4.3,4.4执行过程

 

hdfs://ssmaster:9000/input
hdfs://ssmaster:9000/output

 

正常控制台的输出结果,和在linux上 hadoop jar执行的输出结果一致。

 

 

其他:

可以在eclipse中直接导出成jar,指定main入口, 上传到hadoop linux服务器上,执行hadoop jar xxxx.jar   /input /output

 

总结:

 最好的eclipse开发调试方式。  没问题了就打包导出、上传到真实服务器。

 

posted @ 2016-10-25 11:41  sunzebo  阅读(302)  评论(0编辑  收藏  举报