实验目的

理解mapreduce的工作原理

理解Partitioner的书写方法

理解GroupingComparator的书写方法

实验原理

  我们已经学习了hadoop的大部分基础知识,剩下的就是利用hadoop解决实际的业务问题。首先我们回顾一下mapreduce的工作过程:
  数据通过InputFormat中定义的RecordReader读进来,然后以键值对的形式写出去,在map中进行处理,map处理完成后以键值对的形式写出,中途经过分区、分组、排序后,将key相同的value放进一个迭代器传给reduce,每个reduce任务处理的数据是key相同的一组value构成的的迭代器。

1.实现单词计数
  首先我们要实现单词计数的程序,首先map端将读入的数据分割成单词,然后以单词为key,1为value写出,reduce拿到的数据就是以单词为key,这个单词对应的所有的1组成的迭代器为value,我们将所有的value加起来就是这个单词的数量。
  单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World"。单词计数主要完成功能是:统计一系列文本文件中每个单词出现的次数,如下图所示:

2.实现自定义分区
  我们有时候希望能够按照自己的意愿合理分配每个reduce计算的单词,比如我想最后把所有的以字母A开头的单词单独输出,这时候就需要自定义分区,将key中以A开头的单词放进一个给定的reduce。自定义分区需要定义一个类,继承自Partitioner或者Partitioner的子类,实现getPartition方法,按照业务需求分配不同key分配到的reduce。

3.实现按照字母多少排序
  统计单词个数业务不难,但是我们希望对结果进行排序输出。当然我们可以在程序执行结束以后使用shell、Python等工具进行排序,但是我们也可以直接使用mapreduce自带的排序组件,使用mapreduce自带的GroupingComparator能利用mapreduce框架帮我们排序。

4.mapreduce的工作步骤
  数据通过InputFormat中定义的RecorderReader读进来,然后以键值对的形式<key,value style="box-sizing: border-box;">传进map程序,map处理完成后以<key,value style="box-sizing: border-box;">的形式写出,传入哪个reduce根据自定义的Partitioner决定,传入每一个reducer的数据,key一样的键值对的value会放进一个迭代器,在这个判断key是否一样的就是根据自定义的GroupingComparator。会根据key的compare方法进行排序。

5.Partitioner的书写方法
  我们自定义的Partitioner需要继承自一个Partitioner类,实现getPartition方法,getPartition的签名为:public abstract int getPartition(KEY key, VALUE value, int numPartitions),其中key和value是map程序写出的键值对,numPartitions是reduce的个数,通过程序代码设置,返回值就是reduce的index。

6.GroupingComparator的书写方法
  map输出的键值对中,key相同的value会被放进同一个迭代器,也就是按照key分组,而判断key是否相等的规则是我们通过GroupingComparator设置的,通过重写compare方法,就能修改判断逻辑。

实验环境

1.操作系统
  服务器:Linux_Centos
  操作机:Windows_7
  服务器默认用户名:root,密码:123456
  操作机默认用户名:hongya,密码:123456
2.实验工具
  IntelliJ IDEA

IDEA全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

  优点:
1)最突出的功能自然是调试(Debug),可以对Java代码,JavaScript,JQuery,Ajax等技术进行调试。其他编辑功能抛开不看,这点远胜Eclipse。
2)首先查看Map类型的对象,如果实现类采用的是哈希映射,则会自动过滤空的Entry实例。不像Eclipse,只能在默认的toString()方法中寻找你所要的key。
3)其次,需要动态Evaluate一个表达式的值,比如我得到了一个类的实例,但是并不知晓它的API,可以通过Code Completion点出它所支持的方法,这点Eclipse无法比拟。
4)最后,在多线程调试的情况下,Log on console的功能可以帮你检查多线程执行的情况。

  缺点:
1)插件开发匮乏,比起Eclipse,IDEA只能算是个插件的矮子,目前官方公布的插件不足400个,并且许多插件实质性的东西并没有,可能是IDEA本身就太强大了。
2)在同一页面中只支持单工程,这为开发带来一定的不便,特别是喜欢开发时建一个测试工程来测试部分方法的程序员带来心理上的不认同。
3)匮乏的技术文章,目前网络中能找到的技术支持基本没有,技术文章也少之又少。
4)资源消耗比较大,建个大中型的J2EE项目,启动后基本要200M以上的内存支持,包括安装软件在内,差不多要500M的硬盘空间支持。(由于很多智能功能是实时的,因此包括系统类在内的所有类都被IDEA存放到IDEA的工作路径中)。

  特色功能:
  智能选择
  丰富的导航模式
  历史记录功能
  JUnit的完美支持
  对重构的优越支持
  编码辅助
  灵活的排版功能
  XML的完美支持
  动态语法检测
  代码检查等等。

步骤1:自定义输出类

  本次实验的代码放在包hellohadoop项目的com.hongya.day025下。我们可以进入D:/hongya/ideaspace/hellohadoop/src/com/hongya/day025查看源代码。

  1.1我们需要排序,首先要定义自己的输出类,自定义输出类需要包含单词和计数,如下:

public class WordCount implements WritableComparable<WordCount> {

private String word;

private long count;

// getset方法、构造方法省略

@Override

public int compareTo(WordCount o) {

int i = - Long.compare(count,o.count);

if (i != 0){

return i;

}

return word.compareTo(o.word);

}

@Override

public void write(DataOutput out) throws IOException {

out.writeUTF(word);

out.writeLong(count);

}

@Override

public void readFields(DataInput in) throws IOException {

word = in.readUTF();

count = in.readLong();

}

  我们需要实现compareTo方法,作为Reduce内部的排序方法,还要定义读写的方法

  1.2自定义分区和分组,实现按照单词出现的次数排序。
  我们想要map完成后的数据能够按照计数排序,因为排序只能在每一个reduce内部进行,所以我们需要输入到每一个reduce的数据不能是乱的。设计partition应该合理考虑这点,根据单词的计数进行分区。

@Override

public int getPartition(WordCount key, NullWritable value, int numReduceTasks) {

if (numReduceTasks == 1){

return 0;

}

if (key.getCount() < numReduceTasks){

return (int) key.getCount();

}

return numReduceTasks - 1;

}

  首先判断reduce的数量,如果是1就不用计算,每个reduce只计算对应的count,当count比较大,全都给最后一个reduce计算,当然你可以自定义更好的分区方式。

  1.3自定义分组函数。
  显然我们分组就是为了让所有计数一样的都进同一个组,所以逻辑就是只比较计数,忽略单词.

@Override

public int compare(WritableComparable a, WritableComparable b) {

WordCount o1 = (WordCount) a;

WordCount o2 = (WordCount) b;

return Long.compare(o1.getCount(),(o2.getCount()));

}

吴裕雄--天生自然HADOOP操作实验学习笔记:Wor的Count程序的编写的更多相关文章

  1. 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介

    实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...

  2. 吴裕雄--天生自然HADOOP操作实验学习笔记:pig简介

    实验目的 了解pig的该概念和原理 了解pig的思想和用途 了解pig与hadoop的关系 实验原理 1.Pig 相比Java的MapReduce API,Pig为大型数据集的处理提供了更高层次的抽象 ...

  3. 吴裕雄--天生自然HADOOP操作实验学习笔记:使用hive操作hbase

    实验目的 熟悉hive和hbase的操作 熟悉hadoop.hbase.hive.zookeeper的关系 熟练大数据环境的搭建 学会分析日志排除问题 实验原理 1.hive整合hbase原理 前面大 ...

  4. 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce代码编程

    实验目的 深入了解mapreduce的底层 了解IDEA的使用 学会通过本地和集群环境提交程序 实验原理 1.回忆mapreduce模型 前面进行了很多基础工作,本次实验是使用mapreduce的AP ...

  5. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase学生选课案例

    实验目的 复习hbase的shell操作和javaAPI操作 了解javaWeb项目的MVC设计 学会dao(数据库访问对象)和service层的代码编写规范 学会设计hbase表格 实验原理 前面我 ...

  6. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的javaAPI应用

    实验目的 进一步了解hbase的操作 熟悉使用IDEA进行java开发 熟悉hbase的javaAPI 实验原理 前面已经了解通过hbase的shell操作hbase,确实比较难以使用,另外通过hiv ...

  7. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的shell应用v2.0

    HRegion 当表的大小超过设置值的时候,HBase会自动地将表划分为不同的区域,每个区域包含所有行的一个子集.对用户来说,每个表是一堆数据的集合,靠主键来区分.从物理上来说,一张表被拆分成了多块, ...

  8. 吴裕雄--天生自然HADOOP操作实验学习笔记:hive DDL

    实验目的 了解hive DDL的基本格式 了解hive和hdfs的关系 学习hive在hdfs中的保存方式 学习一些典型常用的hiveDDL 实验原理 有关hive的安装和原理我们已经了解,这次实验我 ...

  9. 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce和yarn命令

    实验目的 了解集群运行的原理 学习mapred和yarn脚本原理 学习使用Hadoop命令提交mapreduce程序 学习对mapred.yarn脚本进行基本操作 实验原理 1.hadoop的shel ...

  10. 吴裕雄--天生自然HADOOP操作实验学习笔记:hdfs简单的shell命令

    实验目的 了解bin/hadoop脚本的原理 学会使用fs shell脚本进行基本操作 学习使用hadoop shell进行简单的统计计算 实验原理 1.hadoop的shell脚本 当hadoop集 ...

随机推荐

  1. css——伪类选择器

    <body> <div class="box">   <p>0</p>         <div>1</div&g ...

  2. VS2017中遇到不存在从string到const char*的转换函数的解决方法

    使用c_str()函数 c_str函数的返回值是const char*. c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有stri ...

  3. Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战

    Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战 说明:Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战,优惠券是一种常见的促销方式,在规定的周期内购买对应商品类型和额度的商品 ...

  4. 解决IDEA快捷键 Alt+Insert 失效的问题

    现象 IDEA快捷键 Alt+Inser 失效,单击右键也不出现[Generate]. 这个问题经常出现在重新安装IDEA后. 原因 缺少2个插件 解决办法 在setting中启用这2个插件即可.这2 ...

  5. Python中令人迷惑的4个引用

    第一个:执行时机的差异 1. array = [1, 8, 15] g = (x for x in array if array.count(x) > 0) array = [2, 8, 22] ...

  6. 吴裕雄--天生自然Numpy库学习笔记:NumPy 字节交换

    大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放 小端模式:指数据的高字节保 ...

  7. JAVA面向对象解决实际问题实例(一)

    某次战役中,为便于信息交互,我军侦察部门将此次战役的关键高地坐标设定为(x=0,y=0)并规定,每向东增加100米,x加1,每向北增加100米,y加1.同时,我军情报部门也破译了敌军向坦克发送的指挥信 ...

  8. 【PAT甲级】1051 Pop Sequence (25 分)(栈的模拟)

    题意: 输入三个正整数M,N,K(<=1000),分别代表栈的容量,序列长度和输入序列的组数.接着输入K组出栈序列,输出是否可能以该序列的顺序出栈.数字1~N按照顺序随机入栈(入栈时机随机,未知 ...

  9. CentOS7 安装 OpenCV 的一些问题解决办法

    由于强迫症,实在受不了root权限的旧gcc才能使用boost而普通权限却是最新版gcc,经过一番折腾后,终于把配置全部弄好了,实际上就只需要把新版gcc的各个文件放到系统找到旧gcc的地方,并建立新 ...

  10. php学习函数如何执行的

    入口栈abc(4)--------abc(4)------abc(3)-----abc(2)再返回上一层栈,执行完后返回上一层.输出$n=2-------$n=2-------$n=3