- MapReduce编程入门实例之WordCount:分别在Eclipse和Hadoop集群上运行
- 首先看一下我的项目结构和WordCount程序:
- 其中word.txt将作为我们测试的输入文件,内容如下:
hello hadoop
hello wordcount
程序代码:
1 package com.hadoop.WordCount;
2 import java.io.IOException;
3 import java.util.StringTokenizer;
4 import org.apache.hadoop.conf.Configuration;
5 import org.apache.hadoop.fs.FileSystem;
6 import org.apache.hadoop.fs.Path;
7 import org.apache.hadoop.io.IntWritable;
8 import org.apache.hadoop.io.Text;
9 import org.apache.hadoop.mapreduce.Job;
10 import org.apache.hadoop.mapreduce.Mapper;
11 import org.apache.hadoop.mapreduce.Reducer;
12 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
13 import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
14 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
15 import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
16@SuppressWarnings("unused")
17 public class WordCount {
19 public static class TokenizerMapper extends
20 Mapper<Object, Text, Text, IntWritable>
21 // 为什么这里k1要用Object、Text、IntWritable等,而不是java的string啊、int啊类型,当然,你可以用其他的,这样用的好处是,因为它里面实现了序列化和反序列化。
22 // 可以让在节点间传输和通信效率更高。这就为什么hadoop本身的机制类型的诞生。
23 //这个Mapper类是一个泛型类型,它有四个形参类型,分别指定map函数的输入键、输入值、输出键、输出值的类型。hadoop没有直接使用Java内嵌的类型,而是自己开发了一套可以优化网络序列化传输的基本类型。
24 //这些类型都在org.apache.hadoop.io包中。
25 //比如这个例子中的Object类型,适用于字段需要使用多种类型的时候,Text类型相当于Java中的String类型,IntWritable类型相当于Java中的Integer类型
2