[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 }
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开发调试方式。 没问题了就打包导出、上传到真实服务器。