MapReduce 并行编程

一、实验目的及要求

1、掌握MapReduce并行编程方法

2、掌握自定义数据类型

3、掌握自定义分区类和自定义排序类的使用

4、掌握最值求解并行化方法

二、实验原理与内容

假设有一个服务器每天都记录同一个网站的访问量数据,主要是该网站下所有页面中的最大访问量和最小访问量,数据存储在下面三个文件中。
在这里插入图片描述

数据格式如下(记录时不具体到天):
在这里插入图片描述

说明:第一列为某年某月的时间信息,第二列为该月内某天观测到的最大访问量,第三列为该月内同一天观测到的最小访问量。

程序设计要求如下:

最后输出网站每个月内的最大值、最小值,一个月一行数据。

如图中2017-07最大值为900,最小值为100;2017-08最大值为560,最小值为200

输出格式如下

2017-08 560 200

2017-07 900 100

必须自定义一个数据类型,包含某天观测到的最大最小访问量。

要求自定义分区函数,2017年的数据全部规约到一个reducer处理,2018年的数据全部规约到另一个reducer处理。

要求同一年的数据按月份降序排序。如

2017-08 560 200

2017-07 900 100

完成本次实验需要有一定的设计代码思维,因为有两个年份,先按照年月份进行降序排序,然后引用Partitioner函数把年份分成两份文件输出。最后排序出每个月份的最大销量和最小销量进行输出。

三、代码实现:

1、 创建一个类MyWritable,定义一个最大值和最小值



public class MyWritable implements Writable{
   
 private int maxAccess;
 private int minAccess;
 @Override
 public void readFields(DataInput in) throws IOException {
   
  // TODO Auto-generated method stub
  maxAccess=in.readInt();
  minAccess=in.readInt();
 }

 @Override
 public void write(DataOutput out) throws IOException {
   
  // TODO Auto-generated method stub
  out.writeInt(maxAccess);
  out.writeInt(minAccess);
 }

 @Override
 public String toString() {
   
  return maxAccess + " " + minAccess;
 }
 
 public int getMaxAccess() {
   
  return maxAccess;
 }

 public int getMinAccess() {
   
  return minAccess;
 }

 public void setMaxAccess(int maxAccess) {
   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mapreduce实验报告 前言和简介 MapReduce是Google提出的一种编程模型,在这个模型的支持下可以实现大规模并行化计 算。在Mapreduce框架下一个计算机群通过统一的任务调度将一个巨型任务分成许多部分 ,分别解决然后合并得到最终结果。Mapreduce可以让程序员以简单的程序来解决实际问 题,而隐藏了诸如分布、工作调度、容错、机器间通信,使得大规模任务简单而迅速地 完成。 1. Mapreduce的基本原理 1. 核心思想。 "Divide and Conquer"是Mapreduce的核心思想。面对一个规模庞大的问题,要 处理是以TB计的数据,Mapreduce采用"输入"------"分解"------"解决"----- -"聚合"------"输出结果"的基本过程。 2. 基本原理 Map和Reduce是两个核心操作,用户定义的map函数接收被切割过的原始的key/ value对集并且计算出一个中间key/value对集。Mapreduce库函数将所有的具有 相同key值的value聚合在一起交给用户定义的reduce函数处理。reduce函数将 同一key值的所有value合并成得到输出文件。在整个过程中,Mapreduce库函数 负责原始数据的切割,中间key/value对集的聚合,以及任务的调度,容错、通 信控制等基础工作。而用户定义的map和reduce函数则根据实际问题确定具体操 作。 2. 框架的基本结构和执行流程 基本结构 Mapreduce框架的主要程序分为三种即Master,Map和Reduce。 1. Master:主要功能有两个,任务的分割和任务的调度。Master把输入文件切成许 多个split,每个split文件一般为几十M。Master同时还要调度任务监视各个 map worker和reduce worker的工作状态,以做出相应的安排。Master还要监视各个子任务的完成进 展情况。 Master用到的数据结构 Struct Split[] //文件切割后的信息 struct MapSTATE[] //记录各个map任务的情况。 struct ReduceSTATE[R] //各个reduce任务的情况。 Type Map=0,Reduce=0 //记录map任务和reduce任务的完成个数。 MapWorkerSTATE[] ReduceWorkerSTATE[] //各个工作机器的忙闲状态 FileSplit(string inputfilename) //输入文件切割 JobAssign() //工作任务分配 2. Map:主要功能是读取经过切割split文件形成一个map任务,分析map任务,得到 中间结构并且将同一类型的中间文件存放在同一个区域内等待特定的reduce程 序读取。 3. Reduce:不同的Reduce读取各个Map得到的特定的中间文件,将所有相同的中间 文件整合成最后的输出文件。 任务执行基本流程 基本流程图见下一页 首先输入收据文件被Mapreduce库函数分割成M个split集。用户定义的程序被 拷贝到机群中,其中一个是master,其它的都是worker。M个map任务和R个reduc e任务将被分配。Master负责调度任务和过程监视。随时检测worker的工作状况, 任务的完成进度。Map worker每完成一个子任务向master报告。 一个被分配了map任务的worker读取一个split集,该worker从这个split集中 分析出key/value对,然后有map函数来处理这些key/value对并得到中间key/val ue对,这些key/value对将最终存放在map worker的本地硬盘上。每完成一个任务报告master。 中间key/value对被存在本地硬盘的R个不同的区域中,由于可能的key值很可 能不止R个,故必须利用一个分割函数来划分中间文件,常用的是散列的方法(如 hash(key) mod R)。保证key值相同的key/value对被存放同一区域中,并且将位置报告给maste r。如果同一个key的中间文件多而小可以考虑用cmobine函数在本地进行合并。 当所有的split都被分析完成之后,reduce worker开始工作,每个reduce根据master的安排和信息指示利用机群的内部文件 系统读取map worker本地磁盘中特定位置的中间文件。 Reduce开始聚合中间文件,得到自己的输出文件。在聚合的过程中由于有很 多key值,一般将用到排序。Reduce worker完成自己的工作后向master报告。 控制 分析key/value对 分区写入磁盘 读取 *单向箭头表示控制,双向箭头表示控制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值