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.txt
hadoop 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;
} //从数据流中反序列化出对象的数据
//从数据流中读出对象字段时,必须与序列化时的顺序一致
@Override
public void readFields(DataInput in) throws IOException { word = in.readUTF();
} //将对象数据序列化到流中
@Override
public void write(DataOutput out) throws IOException { out.writeUTF(word);
} @Override
public String toString() { return word;
} //实现倒序排序
@Override
public 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框架每读一行数据就调用一次该方法
@Override
protected 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为1
for(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....}>
@Override
protected 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{ @Override
public 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

结果如图所示

MaperReduce实验的更多相关文章

  1. [原] 利用 OVS 建立 VxLAN 虚拟网络实验

    OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...

  2. Android中Activity的四大启动模式实验简述

    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...

  3. SEED实验系列文章目录

    美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...

  4. 物联网实验4 alljoyn物联网实验之手机局域网控制设备

    AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...

  5. (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)

    一.  HTTP请求的数据流总结#上传数据, yeelink的数据流如下POST /v1.0/device/4420/sensor/9089/datapoints HTTP/1.1Host: api. ...

  6. (原创) alljoyn物联网实验之手机局域网控制设备

    AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...

  7. 实验:Oracle直接拷贝物理存储文件迁移

    实验目的:Oracle直接拷贝物理文件迁移,生产库有类似施工需求,故在实验环境简单验证一下. 实验环境: A主机:192.168.1.200 Solaris10 + Oracle 11.2.0.1 B ...

  8. Oracle RAC 更换存储实验

    实验环境准备: RHEL 6.5 + Oracle 11.2.0.4 RAC (2nodes) OCR和Voting Disk使用的是OCR1磁盘组,底层对应3个1G大小的共享LUN,一般冗余: DA ...

  9. Vertica集群扩容实验过程记录

    需求: 将3个节点的Vertica集群扩容,额外增加3个节点,即扩展到6个节点的Vertica集群. 实验环境: RHEL 6.5 + Vertica 7.2.2-2 步骤: 1.三节点Vertica ...

随机推荐

  1. BZOJ4128 Matrix 【BSGS】

    BZOJ4128 Matrix Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * ...

  2. 解决遇到Linux网络配置,从熟悉网络配置文件入手

    如果接触过Linux,网络配置是一个比较棘手的问题.但是Linux是文件为基础来构建的系统,包括我们windows中设备,Linux也视为文件.所以只要我们明白文件的作用.就能对Linux更加的熟悉, ...

  3. Mac OS上搭建LNMP开发环境

    1. 概述 LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构.Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统.代表版本有:debian.c ...

  4. {Notes}{Latex}{multirow}

    这个文章写的真的太牛比了! ============================================================ 在latex文件最前面用这个包\usepackag ...

  5. UVA11538 Chess Queen

    题意 给一个\(n \times m\)的棋盘,输出有多少种方法放置两个互相攻击的皇后. \(n,m \leq 10^6\) 分析 参照刘汝佳的题解. 横.竖.斜三种情况互不相干,加法原理统计. 横竖 ...

  6. pymongo和mongodbengine之间的区别

    pymongo是一个mongo driver,可以用来连接数据库以及对数据库进行操作,但是是用mongo自己的用来操作数据库的语句进行操作数据库,而mongodbengine就像是sqlalchemy ...

  7. Java API 操作Zookeeper

    一.依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookee ...

  8. 16.Python使用lxml爬虫

    1.lxml是解析库,使用时需要导入该包,直接在命令行输入:pip3 install lxml,基本上会报错.正确应该去对应的网址:https://pypi.org/project/lxml/#fil ...

  9. 揭晓UX(用户体验)最大的秘密

    我是佩恩和特勒的粉丝已经多年了.我第一次在现实中看到他们是在上个月,被他们的表演完全迷住了. 我真的很喜欢佩恩和特勒,他们经常“回拉窗帘”,并揭示他们是怎么完成他们的魔法.其他魔术师营造神秘主义和虚假 ...

  10. GOF23设计模式之策略模式(strategy)

    一.策略模式概述 策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一种算法解决一个问题,同时可以方便的更换算法或者增加新的算法.并且由客户端决定调用哪个算法. 策略模式的本质: 分离 ...