目录

  • MaperReduce实现WordCount程序二次排序

    • 前期准备
    • 1. 工程结构
    • 2. 编写自定义NewKey类
    • 3. 编写WCMapper类
    • 4. 编写WCReduer类
    • 5. 编写作业描述类
    • 6. 将工程打包
    • 8. 查看输出结果

MaperReduce实现WordCount程序二次排序

前期准备

  • 启动Zookeeper

./zkServer.sh start
  • 启动HDFS

start-dfs.sh 
  • 启动Yarn

start-yarn.sh
  • 将要处理的数据文件上传到HDFS

  ##这里数据文件名为wordcount.txt,目标存放路径为hdfs:/wc/srcdata/##在HDFS根目录下创建wc目录hadoop fs -mkdir /wc ##创建srcdata目录hadoop fs -mkdir /wc/srcdata##上传wordcount.txthadoop fs -put wordcount.txt /wc/srcdata##不需要创建输出目录,否则会报错

1. 工程结构

  • 导入common核心包及其依赖包
  • 导入mapreduce包及其依赖包
  • 导入tools包及其依赖

2. 编写自定义NewKey类

package cn.hadoop.mr.wordcount;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;import org.apache.hadoop.io.WritableComparable;/** newKey是自定义的数据类型,要在hadoop的各个节点之间传输,应该遵循hadoop的序列化机制* 就必须实现hadoop相应的序列化接口*/public class NewKey implements WritableComparable<NewKey>{private String word;//反序列化时,反射机制需要调用空参构造函数,所以显示定义了一个空参构造函数public NewKey() {}//初始化对象public NewKey(String word) {this.word = word;}public String getWord() {return word;}public void setWord(String word) {this.word = word;}//从数据流中反序列化出对象的数据//从数据流中读出对象字段时,必须与序列化时的顺序一致@Overridepublic void readFields(DataInput in) throws IOException {word = in.readUTF();}//将对象数据序列化到流中@Overridepublic void write(DataOutput out) throws IOException {out.writeUTF(word);     }@Overridepublic String toString() {return word;}//实现倒序排序@Overridepublic int compareTo(NewKey o) {return o.getWord().compareToIgnoreCase(word);}}

3. 编写WCMapper类

package cn.hadoop.mr.wordcount;import java.io.IOException;import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;//四个泛型中,前两个时指定mapper输入数据的类型,KEYIN是输入的key的类型,VALUE是输入的value的类型
//map和reduce的数据输入输出都是以key-value对的形式封装的
//默认情况下,框架传递给我们的mapper的输入数据中,key是要处理的文本中一行的起始偏移量,这一行的内容作为value
//mapreduce框架将Long类型封装为可序列化的LongWriteble类型,String封装为Text
public class WCMapper extends Mapper<LongWritable, Text, NewKey, LongWritable>{//mapreduce框架每读一行数据就调用一次该方法@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {//具体的业务处理逻辑在该方法中编写,业务处理所需的数据由框架进行传递,在方法的参数中体现key-value//key是这一行数据的起始偏移量,value是这一行的文本内容//将这一行内容转化为string类型String line=value.toString();//调用Hadoop工具类对这一行文本按特定分隔符切分String[] words = StringUtils.split(line," ");//遍历单词数组输出到context中,输出为key-value形式,key为单词,value为1for(String word:words) {context.write(new NewKey(word), new LongWritable(1));}}
}

4. 编写WCReduer类

package cn.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapreduce.Reducer;public class WCReucer extends Reducer<NewKey, LongWritable, NewKey, LongWritable>{//框架在map处理完成之后,缓存所有k-v对,根据k进行分组(相同k为同一组)后传递<key,value{}>,对每一组k调用一次reduce方法//<hello,{1,1,1,1....}>@Overrideprotected void reduce(NewKey key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {long count =0;//遍历values进行累加求和for(LongWritable value : values) {count += value.get();}//输出这一个单词的统计结果context.write(key, new LongWritable(count));}}

5. 编写作业描述类

package cn.hadoop.mr.wordcount;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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.util.Tool;
import org.apache.hadoop.util.ToolRunner;/*** 用来描述一个特定的作业* 例如:* 指定该作业所使用的map类和reduce类;* 指定作业所需输入数据的存放路径;* 指定作业输出结果存放路径* @author Administrator**/
public class WCRunner extends Configured implements Tool{@Overridepublic int run(String[] arg0) throws Exception {//配置文件Configuration conf = new Configuration();Job job = Job.getInstance(conf);//设置整个job所调用类的jar包路径job.setJarByClass(WCRunner.class);//设置该作业所使用的mapper和reducer类job.setMapperClass(WCMapper.class);job.setReducerClass(WCReucer.class);//指定mapper输出数据的k-v类型,和reduce输出类型一样,可缺省job.setMapOutputKeyClass(NewKey.class);job.setOutputValueClass(LongWritable.class);//指定reduce输出数据的k-v类型job.setOutputKeyClass(NewKey.class);job.setOutputValueClass(LongWritable.class);//指定输入数据存放路径FileInputFormat.setInputPaths(job, new Path(arg0[0]));//指定输出数据存放路径FileOutputFormat.setOutputPath(job, new Path(arg0[1]));//将job提交给集群运行,参数为true表示提示运行进度return job.waitForCompletion(true)?0:1;}public static void main(String[] args) throws Exception {int res = ToolRunner.run(new Configuration(), new WCRunner(), args);System.exit(res);}}

6. 将工程打包

注:工程所使用的JDK版本必须和Hadoop所使用的JDK版本一致

``

8. 查看输出结果

##查看指定的输出路径是否生成文件
hadoop fs -ls /wc/output##查看运行结果hadoop fs -cat /wc/output/part-r-00000

结果如图所示

转载于:https://www.cnblogs.com/liminghuang/p/9075208.html

MaperReduce实验相关推荐

  1. 合肥工业大学—SQL Server数据库实验四:数据库的分离和附加

    数据库的分离和附加 1. 数据库分离 2. 数据库附加 1. 数据库分离 当SQL Server服务器运行时,该服务器上所有的数据库自动处于运行状态,而运行中的数据库文件是无法进行数据库文件的拷贝的. ...

  2. 解读模拟摇杆原理及实验

    解读模拟摇杆原理及实验 Interpreting Analog Sticks 当游戏支持控制器时,玩家可能会一直使用模拟摇杆.在整个体验过程中,钉住输入处理可能会对质量产生重大影响.让来看一些核心概念 ...

  3. legend位置 pyecharts_实验|pyecharts数据可视化分析-1

    1. 实验介绍 本实验主要介绍pyecharts基本特点与属性. 1.1. 实验目的 了解pyecharts功能.特点.与安装方式. 1.2. 知识点 pyecharts特点 pyecharts图表 ...

  4. 2019春第二次课程设计实验报告

    2019春第二次课程设计实验报告 一.实验项目名称: 贪吃蛇游戏编写: 二.实验项目功能描述: 这个实验主要是实现游戏的正常运行,实现的目标是对小蛇移动的控制, 同时对小蛇数据的保存,如何实现转弯的效 ...

  5. 汇编语言程序设计 实验九

    实验内容 实验一: 补全程序t1.asm,完成在屏幕上输出内存单元中的十进制两位数 ; 在屏幕上输出内存单元中的十进制两位数 assume cs:code, ds:data data segmentd ...

  6. 20172324 2018-2019-1《程序设计与数据结构》实验2报告

    20172324 2018-2019-1<程序设计与数据结构>实验2报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 曾程 学号:20172324 实验教师:王志强 ...

  7. JAVA第二次验证设计性实验报告

    [实验任务一]:素数输出 (3)实验报告中要求包括程序设计思想.程序流程图.源代码.运行结果截图.编译错误分析等内容. 1.   实验内容 (1)计算并输出3~100之间的素数. (2)编程满足下列要 ...

  8. 20172329 2017-2018-2 《程序设计与数据结构》实验五报告

    这是这学期最后一次实验了,也是学到了很多东西,希望自己可以可以善始善终,加油! 让我们开始这一篇博客吧! 20172329 2017-2018-2 <程序设计与数据结构>实验五报告 课程: ...

  9. 计算机网络实验报告建立校园网,计算机网络实验报告

    设计性实验报告 一.实验目的 通过对网络设备的连通和对拓扑的分析,加深对常见典型局域网拓扑的理解:通过路由建立起网络之间的连接,熟悉交换机.路由器的基本操作命令,了解网络路由的设计与配置. 二.背景描 ...

最新文章

  1. Ubuntu下安装ulipad
  2. DM8168心得之SD卡快速分区制作
  3. SAP S/4HANA的扩展字段的渲染逻辑
  4. 怎么用树莓派制作web服务器,用树莓派做web服务器,靠谱吗?
  5. omv检查硬盘坏道_坏道检测与修复
  6. 【FPGA教程案例33】通信案例3——基于FPGA的BPSK调制信号产生,通过matlab测试其星座图
  7. 2019年04月02日清明上海迪士尼游
  8. C++程序设计语言学习笔记:异常处理
  9. [No000030]程序员节发点别的:中国教育整个把人脑子搞坏了-易中天
  10. 推荐收藏 | 掌握这些步骤,机器学习模型问题药到病除
  11. 命令模式,升级版的灭霸响指
  12. 使用长角牛演示:防止ARP协议被攻击原理和配置
  13. Web前端开发之网站制作流程详细讲解
  14. LeetCode 176 第二高的薪水
  15. 华为海康大华摄像头编译RTSP转RTMP和HTTPFLV
  16. 学java被“劝退”的第八天
  17. java poi row cell,使用POI进行Excel操作的总结一——创建Workbook,Sheet,Row以及Cell
  18. java解析网页全过程_Web页面的解析过程
  19. 【Ruby on Rails全栈课程】4.1 点赞功能
  20. python基础入门级别的宝库。

热门文章

  1. excel调用python编程-用Python如何开发Excel宏脚本?新手必学
  2. python表白-情人节来了,教你个用 Python 表白的技巧
  3. python爬虫案例-python爬虫详细解析附案例
  4. python编程语法-Python编程入门——基础语法详解(经典)
  5. python是一门什么课程-为什么一定要让孩子学会一门编程语言?
  6. python手机版安卓-用Python实现自动化操作Android手机
  7. python爬取贴吧所有帖子-Python爬虫爬取百度贴吧的帖子
  8. python手机版下载372-Mac下python环境的安装
  9. python使用教程pandas-Python 数据处理库 pandas 入门教程基本操作
  10. arcgis下的python编程-基于ArcGIS的Python编程秘笈(第2版)