实验报告
当前位置:首页 > 工作报告 > 实验报告 > 列表页

mapreduce实验报告

小草范文网  发布于:2016-10-10  分类: 实验报告 手机版

篇一:Mapreduce实验报告

Mapreduce实验报告

前言和简介

MapReduce是Google提出的一种编程模型,在这个模型的支持下可以实现大规模并行化计算。在Mapreduce框架下一个计算机群通过统一的任务调度将一个巨型任务分成许多部分,分别解决然后合并得到最终结果。Mapreduce可以让程序员以简单的程序来解决实际问题,而隐藏了诸如分布、工作调度、容错、机器间通信,使得大规模任务简单而迅速地完成。

一. 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函数则根据实际问题确定具体操作。

二. 框架的基本结构和执行流程

基本结构

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个reduce任务将被分配。Master负责调度任务和过程监视。随时检测worker的工作状况,任务的完成进度。Map worker每完成一个子任务向master报告。

一个被分配了map任务的worker读取一个split集,该worker从这个split集中分析出key/value对,然后有map函数来处理这些key/value对并得到中间key/value对,这些key/value对将最终存放在map worker的本地硬盘上。每完成一个任务报告master。

中间key/value对被存在本地硬盘的R个不同的区域中,由于可能的key值很可能不止R个,故必须利用一个分割函数来划分中间文件,

常用的是散列的方法(如hash(key) mod R)。保证key值相同的key/value对被存放同一区域中,并且将位置报告给master。如果同一个key的中间文件多而小可以考虑用cmobine函数在本地进行合并。

当所有的split都被分析完成之后,reduce worker开始工作,每个reduce根据master的安排和信息指示利用机群的内部文件系统读取map worker本地磁盘中特定位置的中间文件。

Reduce开始聚合中间文件,得到自己的输出文件。在聚合的过程中由于有很多key值,一般将用到排序。Reduce worker完成自己的工作后向master报告。

*单向箭头表示控制,双向箭头表示控制和反馈

*某些操作中Mapworker硬盘上的key/value在被Reducerworker读取之前可以有combine操作,将相同key的value合并以减少读取次数

*分散的输出文件也可以合并成一个输出文件而对于有些操作如求最大值则必须合并输出文件才能得到最终结果

三. 一些操作的伪码

1. 查找

查找文件存在机群的存储机器上,可以查找其中若干个单词的出现位置。Master 根据文件的大小将文件切成合适的分数,切割信息(如起始位置,终止位置,切片长度等)存储在master上。 Map根据master 的切割信息读取各小规模文件,分析文件内容,每遇到一个要查找的单词形成一个key/value,这里的key是待查找的单词,value是单词的位置,周期性地更新中间文件。Reduce读取每一个map worker同一个区域中的所有中间文件将所有具有相同key值也就是同一个单词的文件合并,将所有的位置汇总成一个输出文件。

Map(String key,String value)

{

//key:文档的名字

//value:文档的内容

String word;

Struct position;

While(!FileEnd) //读取整个文件

{

word=WordRead(key); //读取文件中的单词

position=PositionRead(key);//单词位置读取

EmitIntermediateFile(word,position)//形成中间文件

}

}

Reduce(String key,String value)

{

//key:中间文件名即待查单词

//value:单词位置列表

For every key(本文来自:WwW.xiaOCaofAnweN.Com 小草范文 网:mapreduce实验报告) readed

Emit(value ,position(key));//每读到一个单词将其位置写

入其位置列表}

2. 词频统计

被统计的的文件被切割后,map读取切割文件,统计该文件中的单词数目,形成中间文件,reduce读取相同单词的中间文件,合并得到单词总数。由于单词很多,而reduce worker有限,故应在map中用散列的方法将不同单词的中间文件映射到不同的区域,同一单词的中间文件必须保证存放在同一区域。

Map(string key,string value)

{

//Key:文件名

//value:文件内容

String Word;

While(!FileEnd)

{

Word = WordRead(key);

EmitIntermediateFile(word,1);形成中间文件

篇二:MapReduce实验报告

硕 士 研 究 生 实 践 报 告

题目

作者姓名

作者学号

指导教师

学科专业

所在学院

提交日期

一 题目要求

我们的项目背景是,可穿戴设备的实时数据分析。1.txt记录的是某一个用户的心跳周期数据,每一个数值表示一次心跳的周期,单位是秒。例如,0.8表示用户当时的心跳间隙是0.8秒。心跳间期按照顺序存储。

1. 利用Hadoop的MapReduce框架编写程序,计算出总测量时间和平均心跳间期,即求和与求平均。请写出程序,并在实验报告中简单描述你的思路。

2. 探索Spark的Transformation中的mapPartition,写出示例程序,并思考何时会用到mapPartition,为什么要用它?

3. 探索Spark的Transformation中的flatMap,写出示例程序,并思考何时会用到它,为什么要用到它。

4. (选做)SD1和SD2是表征心率变异性的一种指标。结合发给你们的论文,用Java或者Scala实现SD1和SD2的计算(不用考虑并行化,普通的Java或Scala程序即可)。 5.

(选做)假设我们同时监控100个用户的心率,是否能够利用Spark的RDD的特性,并行地计算SD1和SD2?(提示:把每一个用户的心率数据作为RDD里面的一个元素,RDD中不同的元素表示不同用户的心率数据,利用map对每一个用户的心率数据进行并行分析)。请描述设计思路,并尽可能实现一个多用户心率监控的计算程序。

二 题目实现

第一题:

本题就是利用Hadoop的MapReduce框架编写程序,计算出总测量时间和平均心跳间期,即求和与求平均,程序代码如下:

package cn.ideas.item1;

import java.io.DataInput;

import java.io.DataOutput;

import java.io.IOException;

import org.apache.hadoop.io.Writable;

public class InfoBean implements Writable{

private double sumHeartRate;

private double avgHeartRate;

public double getSumHeartRate() {

return sumHeartRate;

}

@Override

public String toString() {

return

"sumHeartRate\t"+this.sumHeartRate+"\tavgHeartRate\t"+this.avgHeartRate;

}

public void setSumHeartRate(double sumHeartRate) {

this.sumHeartRate = sumHeartRate;

}

public double getAvgHeartRate() {

return avgHeartRate;

}

public void setAvgHeartRate(double avgHeartRate) {

this.avgHeartRate = avgHeartRate;

}

public void set(double sumHeartRate, double avgHeartRate) {this.sumHeartRate = sumHeartRate;

this.avgHeartRate = avgHeartRate;

}

public void readFields(DataInput in) throws IOException {this.sumHeartRate = in.readDouble();

this.avgHeartRate = in.readDouble();

}

public void write(DataOutput out) throws IOException { out.writeDouble(this.sumHeartRate);

out.writeDouble(this.avgHeartRate);

}

}

package cn.ideas.item1;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.Reducer;

importimport org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class SumStep {

public static class SumMapper extends

Mapper<LongWritable,Text,Text,InfoBean>{

private Text K = new Text();

private InfoBean V = new InfoBean();

@Override

protected void map(LongWritable key, Text value, context)

throws IOException, InterruptedException { String line = value.toString();

double sum = Double.parseDouble(line);

K.set("sum");

V.set(sum,0.0);

}

}

public static class SumReducer extends

Reducer<Text,InfoBean,Text,InfoBean>{

private InfoBean v = new InfoBean();

@Override

protected void reduce(Text key, Iterable<InfoBean> values, Context context)

throws IOException, InterruptedException { double in_sum = 0;

int count = 0;

for(InfoBean bean : values){

in_sum += bean.getSumHeartRate();

count++;

}

v.set(in_sum,in_sum/count);

context.write(key, v);

}

}

public static void main(String[] args) throws Exception {Configuration conf = new Configuration();

Job job = Job.getInstance(conf);

job.setJarByClass(SumStep.class);

job.setMapperClass(SumMapper.class);

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(InfoBean.class);

FileInputFormat.setInputPaths(job, new Path(args[0]));

job.setReducerClass(SumReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(InfoBean.class);

FileOutputFormat.setOutputPath(job,new Path(args[1]));

job.waitForCompletion(true);

}

}

本题设计思路相当简单,InfoBean中封装了两个属性sumHeartRate 和avgHeartRate,分别表示了总的心率和平均心率,因为在传输过程中要保证对象是可序列化的,所以实现了Writable接口。在map中的处理,只是将读取的文本中的值进行了转型,我这里处理的是double类型,然后,将所有的键同一位”sum” 以便在reduce的时候将所有的对象放在一个集合中。Reduce中实现的就是对map传过来合并后的集合进行一个遍历,累加求和,顺便用count计数,最后实现平均值的计算

将程序打包后上传到linux系统,把数据上传到hdfs下,然后执行,结果如图所示:

篇三:实验三 hdfs和mapreduce编程

电子信息学院

实验报告书

课程名:《云计算技术》

题目: 实验三、hdfs和mapreduce编程 实验类别

班级: bx1002 学号: 姓名: 杨汉标

【实验环境】

计算机、Java、Hadoop

【实验目的】

1.理解云计算的基本理论知识;

2.理解HDFS与MapReduce的基本作用

3.掌握HDFS与MapReduce的关系;

【实验要求】

1. 下载Hadoop和JDK;

2. 安装SSH;

3. 对Linux进行相应配置。

基础知识

HDFS与MapReduce的关系:1.HDFS在集群生实现了分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理; 2.HDFS在MapReduce任务处理过程中提供了对文件操作和存储的支持;3.MapReduce在HDFS的基础上实现任务的分发、跟踪、执行等工作,并收集结果,实验步骤如下:

1. 安装Hadoop

1) 从 下载Hadoop二进制安装包

hadoop-0.20.0.tar.gz

2) 将hadoop-0.20.0.tar.gz上传到/usr/local目录

3) 在/usr/local目录,将hadoop-0.20.0.tar.gz解压

4) 为hadoop-0.20.0建一个软链接:ln -s hadoop-0.20.0 hadoop

5) 在/etc/profile文件中,增加如下两行:

export HADOOP_HOME=/usr/local/hadoop

export PATH=$HADOOP_HOME/bin:$PATH

完成以上步骤后,Hadoop就安装好了。

2. 配置HDFS

2.1. 修改hadoop-env.sh

所有机器做同样操作。

hadoop-env.sh位于/usr/local/hadoop/conf目录下,需要在这个文件中设置环境变量JAVA_HOME,增加如下一行即可:

export JAVA_HOME=/usr/local/jre

2.2. 修改core-site.xml

所有机器做同样操作。

在hadoop-0.20.0.tar.gz安装包中,conf目录下的core-site.xml默认是空的,但src/core目录下有一个缺省的配置文件core-default.xml,所以只需要将它复制到conf目录下,并重命名成core-site.xml即可,下述操作都是基于此操作的。

core-site.xml文件位于/usr/local/hadoop/conf目录下。

2.2.1. hadoop.tmp.dir

设置临时文件目录参数hadoop.tmp.dir,默认情况下master会将元数据等存在这个目录下,而slave会将所有上传的文件放在这个目录下,在这里数据目录统一为/usr/local/hadoop/data:

<property>

<name>hadoop.tmp.dir</name>

<value>/usr/local/hadoop/data</value>

<description>A base for other temporary directories.</description>

</property>

注意事项:由于上传到Hadoop的所有文件都会被存放在hadoop.tmp.dir所指定的目录,所以要确保这个目录是足够大的。

2.2.2. fs.default.name

master用这个参数,提供基于http协议的状态上报界面,而slave通过这个地址连接master,设置如下:

<property>

<name>fs.default.name</name>

<value>hdfs://Hadoop-A:54310</value>

<description>The name of the default file system. A URI whose

scheme and authority determine the FileSystem implementation. The

uri's scheme determines the config property (fs.SCHEME.impl) naming

the FileSystem implementation class. The uri's authority is used to

determine the host, port, etc. for a filesystem.</description>

</property>

2.3. 修改masters

这个文件存储备master节点的IP或机器名,建议使用机器名,每行一个机器名。主master会将元数据等备份到备master节点,文件位于conf目录下。

这里,我们为masters文件增加如下一行即可:

Hadoop-A

2.4. 修改slaves

这个文件存储slave节点的IP或机器名,建议使用机器名,每行一个机器名。这里我们增加如下两行:

Hadoop-B

Hadoop-C

2.5. 修改hdfs-site.xml

所有机器做同样操作。

从src/hdfs目录下,将hdfs-default.xml复制到conf目录,并重命名成hdfs-site.xml,这里不需要修改此文件。

3. 配置MapReduce

3.1. 修改mapred-default.xml

所有机器做同样操作。

从src/mapred目录下,将mapred-default.xml复制到conf目录,并重命名成mapred-site.xml。

<property>

<name>mapred.job.tracker</name>

<value>Hadoop-A:54311</value>

<description>The host and port that the MapReduce job tracker runs

at. If "local", then jobs are run in-process as a single map

and reduce task.

</description>

</property>

4. 安装Hive

hadoop-0.20.0中并没有集成二进制的Hive,所以需要通过源代码编译一个,但是2009-8-19日提交的Hive并不能在hadoop-0.20.0上编译,而应当使用2009-8-4之后和2009-8-19之间的版本。

4.1. 安装ant

1)

2)

3)

4)

5) 从 下载ant二进制安装包,选择1.7.1版本 下载后,将包apache-ant-1.7.1-bin.zip上传到/usr/local目录 进入/usr/local目录,将apache-ant-1.7.1-bin.zip解压:unzip apache-ant-1.7.1-bin.zip 进入/usr/local目录,为ant建一个软连接:ln -s apache-ant-1.7.1 ant 修改/etc/profile,增加如下行:

export PATH=/usr/local/ant/bin:$PATH

至此,ant算是安装好了 。

4.2. 安装ivy

1) 从 下载ivy二进制安装包,选择2.1.0-rc2版本

2) 下载后,将包apache-ivy-2.1.0-rc2-bin.tar.gz上传到/usr/local目录

3) 进入/usr/local目录,将apache-ivy-2.1.0-rc2-bin.tar.gz解压:tar xzf

apache-ivy-2.1.0-rc2-bin.tar.gz

4) 进入/usr/local目录,为ivy建一个软连接:ln -s apache-ivy-2.1.0-rc2 ivy

6) 修改/etc/profile,增加如下行:

export IVY_HOME=/usr/local/ivy

至此,ivy算是安装好了。

4.3. 编译Hive

在编译Hive之前,请确保HADOOP_HOME和IVY_HOME两个环境变量已经生效。

1) 使用svn从http://svn.apache.org/repos/asf/hadoop/hive/trunk下载2009-8-19之前的

Hive源代码

2) 将下载来的Hive源代码打包,然后上传到Hadoop-A机器

3) 解压Hive源代码包

4) 运行ant开始编译:

ant -Dtarget.dir=/usr/local/hadoop/hive -Dhadoop.version=0.20.0 package

这步完成之后,Hive会被安装到/usr/local/hadoop/hive目录下

5) 添加Hive环境变量,在/etc/profile文件中增加如下两行:

export HIVE_HOME=/usr/local/hadoop/hive

export PATH=$HIVE_HOME/bin:$PATH

本文已影响