经过几天的学习,学好了理论,搭建好了环境,终于可以开始动手写代码了,这里为写的就是被誉为hadoop的hello world的WordCount。
在这里我使用了eclipse的hadoop插件来创建hadoop项目,个人比较推荐这种方式,不仅运行测试起来简单,管理HDFS也是非常方便。这里附上一篇hadoop插件的安装教程:https://blog.csdn.net/xummgg/article/details/51173159
一.项目整体框架
在本项目中,共编写了四个类及一个主函数:
myMapper:继承Mapper类,在里面重写了Map方法,主要任务是将输入的每行数据通过split方法以空格分割出每个word,并生成新的k,v对<word,1>输出
myReduer:继承Reducer类,在里面重写Reduce方法,主要任务作是对Map的结果进行排序、合并等操作最后得出词频
myCombiner:继承Combineer类,重写Combine方法,这个相当于Reducer的本地实现,对同一个节点下map输出的结果进行排序合并,可以直接使用myReducer,也可以没有。
myPartitioner:继承Partitioner类,重写getPartition方法,根据不同的key值将mapper后的结果分配到不同的reduce 节点上。
主函数:实例化Job,将上面四个类组合起来并启动Job
二.代码实现
1.myMapper类
public static class myMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String [] words = line.split(" ");
LongWritable one = new LongWritable(1);
for(String word:words) {
context.write(new Text(word),one);
}
}
}
要点:
- hadoop的MR中的m和r阶段的kv键值对都需要实现序列化,代码中的LongWriable和Text就是hadoop中实现序列化的数据类型,可以看成是java中的long和string
- Mapper旁的<>中四个不同数据类型的意思是:前两个代表输入k,v对的类型,因为是&