WordCount代码编写

承接上文,基本工作就准备完毕,接下来可以开始编写Mapper、Reducer和Driver的代码了。

Mapper

Mapper文件的代码如下,不要直接复制,很多内容是由IDEA自己完成的,直接复制容易出错,建议新建好文件后手敲。编写时尤其要注意导包的问题,在使用IDEA的时候拼写某个词的时候,因为很多包都会有某个词,所以在选择的时候一定要选择hadoop相关的包,IDEA会帮你添加上面这几行import,自己先把这几个import添加了也可以。然后还有一点要注意的是,再导入mapreduce相关的包的时候,会发现有两种,一种是mapred这种,另一种时mapreduce这种,前者对应的hadoop2.x版本,后者对应hadoop3.x,我们这里用的时hadoop3.x所以选择后者。切记不要导错包了。

部分内容,会在代码的注释中解释,至于mapreduce的原理这篇文章就不说了。

该类继承Mapper这个类,使该类具有Mapper的功能,后面括号中的 LongWritable, Text, Text, IntWritable,这四个模板参数,见下面的PARA(参数的意义)这个注释。

父类Mapper类中主要有几个方法要说一下,在IDEA中按住ctrl点击代码中的Mapper可以进去看一下,分别为setip、run、map、cleanup。

setup在run前执行,cleanup在run后执行,run方法中会循环执行map方法,map方法是我们需要在现在这个类中重写的,这个方法中主要执行业务相关的内容。

在map方法中,因为我们是要读取文本中的文字,而且要一行行读取,所以要准备一个对象接收。为什么不能直接用参数中的Text类型呢,因为Text类型没有实现像java中的String类型这么多的方法,尤其我们需要用java自带的String.split方法分割单词,所以把参数先转化为一个String对象。然后用“空格”切割得到String数组,每个项存储一个单词。

之后我们遍历整个数组,把每个单词变成<key,value>这种键值对的形式。如果我们直接在map方法中去创建对象,那么for对每个word都会生成新的对象,每个word都会生成一个对象,另外,在run方法中会循环调用map,所以我们在类中建两个private变量来帮助处理word。我们要把单词整理成kv形式,例如遇见abc单词,我们把它变成<"abc", 1>这种,因为遇见一次,所以是1,也固定是1,不会是2,这个1会在后面的reduce阶段进行统计。然后这里对每个单词用hadoop自带的Text和IntWritable两个类自带的方法去将输出布置好。

context是用来管理mapper与reducer的连接的问题,调用context方法,把输出结果交上去。那么Mapper文件就准备ok了。

package com.xunn.mapreduce.wordcount;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** PARA:* KEYIN map阶段输入的key的类型:LongWritable* VALUEIN map阶段输入value的类型:Text* KEYOUT map阶段的输出的Key类型:Text* VALUEOUT map阶段输出的value类型:IntWritable*/
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{private Text outK = new Text();private IntWritable outV = new IntWritable(1);@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {// 获取一行String line = value.toString();// 切割行String[] words = line.split(" ");// 循环写出for (String word : words) {//封装outK.set(word);//写出context.write(outK, outV);}}
}

Reducer

同样的,在Reducer中也创建一个private的IntWritable作为输出的类型。

reduce方法中的Iterable<IntWritable> values这个参数是一个集合,不是迭代器,这个类是collection类的祖先。这个reduce方法的前两个参数的意思是这样的<"abc", {1,1,1,1,1}>。Text乐星为key,value是个集合。我们用for循环遍历这个values,这个values是个value的集合。用get获取v,并用sum累加。这样就处理好了这个key。然后因为继承了Reducer类,所有该类中继承自父类的run方法会循环调用reduce,从而依次处理不同的key。

最后转化成IntWritable类型并交给context对象处理输出。

package com.xunn.mapreduce.wordcount;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** PARA:* KEYIN reduce阶段输入的key的类型:Text* VALUEIN reduce阶段输入value的类型:IntWritable* KEYOUT reduce阶段的输出的Key类型:Text* VALUEOUT reduce阶段输出的value类型:IntWritable*/
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable outV = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {int sum = 0;// 累加// (abc, (1,1)) vulues对应的是(1,1)这个部分for (IntWritable value : values) {sum += value.get();}outV.set(sum);// 写出context.write(key, outV);}
}

Driver

WordCountDriver这个类集成Driver类,这个WordCountDriver的写法比较固定。

主要就是利用job对象完成各种映射操作。

将所编写的这三个类作为参数,告诉job谁是Driver,谁是Mapper,谁是Reducer。然后设置map的输出类型。再设置整个job的输出类型。注意,都是键值对。

然后设置好输入输出路径,即把job和输入文件所在的文件夹的路径绑定在一起,把job和输出文件所在的文件夹的路径绑定在一起,其中确保输出的指定路径不存在这个名字的文件夹,否则会抛异常。

最后用 job.waitForCompletion(true); 这种写法提交job。模仿官方的example的形式写一个system.exit。

package com.xunn.mapreduce.wordcount;// driver套路比较固定import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.io.nativeio.NativeIO;
import java.io.IOException;public class WordCountDriver {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {// 获取jobConfiguration conf = new Configuration();Job job = Job.getInstance(conf);// 设置jar包路径// 通过WordCountDriver这个全类名 反射 获取jar包路径信息job.setJarByClass(WordCountDriver.class);// 关联mapper与reducerjob.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);// 设置map输出的kv类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);// 设置最终输出的kv类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);// 设置输入路径和输出路径FileInputFormat.setInputPaths(job, new Path("D:\\DARoom\\Hadoop\\somefiles\\inputD"));FileOutputFormat.setOutputPath(job, new Path("D:\\DARoom\\Hadoop\\somefiles\\output1"));// 提交jobboolean result = job.waitForCompletion(true);// 模仿官方的wordcount案例加一个syste.exitSystem.exit(result ? 0 : 1);}
}

下篇文章可能会写,导包的问题,也可能会写一些遇到的问题。

MapReduce学习笔记(二)——Mapper、Reducer和Driver相关推荐

  1. MapReduce学习笔记(1)

    MapReduce学习笔记 1. MapReduce编程模型- Hadoop架构 1.1 Map阶段 1.2 Reduce阶段 1.3 MapReduce模型图 2. MapReduce编程示例 2. ...

  2. [MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍

    [MyBatis学习笔记] 二.Mybatis基本操作及相关标签介绍 一.Mybatis简介 二.简单的CRUD操作 1.构建SqlSessionFactory (1)编辑mybatis-config ...

  3. css中怎么加入立体模型,CSS学习笔记二:css 画立体图形

    继上一次学了如何去运用css画平面图形,这一次学如何去画正方体,从2D向着3D学习,虽然有点满,但总是一个过程,一点一点积累,然后记录起来. Transfrom3D 在这一次中运用到了一下几种属性: ...

  4. 码匠社区学习笔记(二)

    所需资料 教程视频地址 Bootstrap spring模板 elasticsearch中文社区(想模仿的效果) 码云aAuth 获取授权用户的资料 github第三方授权文档 码匠社区学习笔记(二) ...

  5. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  6. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  7. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  8. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  9. Scapy学习笔记二

    Scapy学习笔记二 Scapy Sniffer的用法: http://blog.csdn.net/qwertyupoiuytr/article/details/54670489 Scapy Snif ...

  10. Ethernet/IP 学习笔记二

    Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...

最新文章

  1. Java配置多数据源access,java联接MS ACCESS,无需配置数据源
  2. 嵌入式设备串口命名的地方
  3. SAP Fiori Elements 本地项目的 annotations.xml 文件
  4. AYUSH的完整形式是什么?
  5. dataframe 如何增加新的索引_带你领略pandas中多表之间如何处理
  6. java 485通讯_JAVA开发工程师 | 广州市三地信息技术有限公司
  7. otdr测试波形修改软件,AQ7932(OTDR仿真分析软件)
  8. ccf csp 201612-2 工资计算
  9. ARM 开发板修改MAC地址
  10. ValueError: 2 columns passed, passed data had 5 columns
  11. linux公社_又一个Linux发行版宣告死亡!曾经是最好的桌面版BSD操作系统
  12. java获取微信公众号二维码
  13. 基础内网信息探针思路
  14. Auto CAD中“旋转”命令怎么使用?
  15. BZOJ4200 洛谷2304 UOJ132:[NOI2015]小园丁与老司机——题解
  16. NVIDIA Jetson Xavier性能首测:AI性能碾压苹果A12,自研CPU架构看齐骁龙84
  17. java操作excel_每天一个小技术之Java操作Excel
  18. SAP CO01(创建生产订单)/MIGO(发货投料)前台操作
  19. 什么是乐观锁和悲观锁
  20. [光源频闪] Basler相机光源频闪设置操作说明

热门文章

  1. Duplicate entry ‘‘ for key ‘Primary‘
  2. 音视频数据处理入门:AAC音频码流解析
  3. Scrum敏捷开发 —实现多维度碎片化迭代
  4. 如何用VB语言实现四连环游戏(重力四子棋)?
  5. wps excel 表格给一列数据添加相同的内容的方法
  6. 汇编语言 程序设计 顺序结构
  7. 想要成为数据分析师,这些Excel必备知识点你得掌握
  8. QT入门之布局 水平布局、垂直布局、表单布局、网格布局
  9. linux rescue 硬盘,linux rescue
  10. 操作系统镜像资源(迅雷、天翼云、百度云)