第二部分-MapReduce程序的编写

第二部分 MapReduce程序的编写

一、实验目的和要求

理解MapReduce的工作原理,学会在Eclipse中配置Hadoop插件,进行MapReduce的编程(数据排序)。

二、实验内容和原理

Mapreduce处理数据过程主要分为2个阶段,map阶段和reduce阶段。Map阶段进行取值,Reduce接收到的数据已经是有序的,Reduce需要计数。
在正式执行map函数前,需要对输入进行分片,以便于多个map同时工作,每一个map任务处理一个分片。分片完毕后,多台机器就可以同时进行map工作了。Map函数对每条记录的输出以<key,value>形式输出。在进入reduce阶段之前,要将各个map中相关的数据归结到一起,发出一个reducer。接下来进入reduce的阶段。相同的key的map输出会到达同一个reducer。Reducer对key相同的多个value进行reducer操作,最后一个key的一串value经过reduce函数的作用后,变成了一个value。
数据排序是按照key值进行排序的,使用封装int的IntWritable型数据结构,MapReduce按照数字大小对key排序。也就是在map中将读入的数据转化成 IntWritable型,然后作为key值输出(value任意)。reduce拿到<key,value-list>之后,将输入的 key作为value输出,并根据value-list中元素的个数决定输出的次数。输出的key(即代码中的linenum)是一个全局变量,它统计当前key的位次。

三、主要环境

CentOS 6.5、eclipse、虚拟机

四、实验数据记录和处理

4.1启动Eclipse

启动Eclipse,将完整软件包拖到HadoopMaster节点的桌面上,解压后
找到文件夹eclipse,然后双击eclipse
运行后,修改Workspace位置,点击确定,进入运行界面。

4.2 Eclipse中配置Hadoop插件

4.2.1安装插件

将hadoop安装包hadoop-eclipse-plugin-1.2.5.jar拷贝到eclipse的插件目录plugins下。
重启eclipse,打开windows->open perspective->other->map/reduce 可以看到map/reduce开发视图。
123
如上图所示,点击map/reduce,出现如下tab
4
点击Map/Reduce Locations,在下面窗口空白处点击右键,单击New Hadoop location快捷菜单
5

在弹出的对话框(General tab)进行参数的添加,参数说明如下:
6
然后是打开“Advanced parameters”设置面板,修改相应参数。上面的参数填写以后,也会反映到这里相应的参数:
7配置好后出现如下界面,左侧“Project Explorer”中出现配置好的HDFS,点击右键,可以进行新建文件夹、删除文件夹、上传文件、下载文件、删除文件等操作。
8

4.2.2创建MapReduce工程
  1. 配置Hadoop路径
    Window -> Preferences 选择 “Hadoop Map/Reduce”,点击“Browse…”选择Hadoop文件夹的路径。
    9
    这个步骤与运行环境无关,只是在新建工程的时候能将hadoop根目录和lib目录下的所有jar包自动导入。
  2. 创建工程
    File -> New -> Project 选择“Map/Reduce Project”,然后输入项目名称com.sort.zzf,创建项目。插件会自动把hadoop根目录和lib目录下的所有jar包导入。
  3. 创建Mapper或者Reducer
    File -> New -> Mapper 创建Mapper,自动继承mapred包里面的MapReduceBase并实现Mapper接口。
    Reducer同理。
4.2.3在eclipse中运行Sort程序

新建Sort.java,写入程序

4.3 MapReduce程序设计 (数据排序)

"数据排序"是许多实际任务执行时要完成的第一项工作,比如学生成绩评比、数据建立索引等。先对原始数据进行初步处理,为进一步的数据操作打好基础。

4.3.1实例描述

样例输入:
10
样例输出:
1 2
2 6
3 15
4 22
5 26
6 32
7 32
8 54
9 92
10 650
11 654
12 756
13 5956
14 65223

4.3.2 程序代码

程序代码如下所示:

package com.hebut.mr;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class Sort {
public static class Map extends Mapper<Object,Text,IntWritable,IntWritable>{
private static IntWritable data=new IntWritable();
public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
 String line=value.toString().trim();
 data.set(Integer.parseInt(line));
 context.write(data,new IntWritable(1));
}}
public static class Reduce extends Reducer<IntWritable,IntWritable,IntWritable,IntWritable>{
private static IntWritable linenum =new IntWritable(1);
public void reduce(IntWritable key,Iterable<IntWritable> values,Context context) throws IOException,InterruptedException
{
    for(IntWritable val:values){
    context.write(linenum, key);
    linenum = new IntWritable(linenum.get()+1);
}
}
}
public static void main(String[] args) throws Exception{
    Configuration conf =new Configuration();
    conf.set("mapred.job.tracker","master:9001");
    String[] ioArgs=new String[]{"hdfs://master:9000/user/zzf/sort_in","hdfs://master:9000/user/zzf/sort_out"};
    String[] otherArgs = new GenericOptionsParser(conf, ioArgs).getRemainingArgs();
    if(otherArgs.length!= 2){
     System.err.println("Usage: Data Sort <in> <out>");
     System.exit(2);
}
	Job job = new Job (conf ,"Data Sort");
    job.setJarByClass(Sort.class);
    job.setMapperClass(Map.class);
    job.setReducerClass(Reduce.class);
    job.setOutputKeyClass(IntWritable.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
4.3.3 配置运行参数

在新建的项目com.sort.zzf,点击Sort.java,右键–>Run As–>Run Configurations,在弹出的Run Configurations对话框中,点Java Application,右键–>New,这时会新建一个application名为Sort
配置运行参数,点Arguments,在Program arguments中输入“你要传给程序的输入文件夹和你要求程序将计算结果保存的文件夹”

VM arguments:-Xms128m -Xmx512m -XX:MaxPermSize=256m

11点击Run,运行程序,过段时间将运行完成,如下图
12

五、实验结果与分析

将三个文件file1.txt、file2.txt、file3.txt上传到sort_in目录下之后,运行程序,出现sort_out文件,结果中每行有两个数,第一个是序号,第二个是数值,且结果按照从小到大的顺序排列。
13

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值