1、佛山科学技术学院云计算实验报告了解MapReduce编程云计算概论实验三:了解MapReduce编程学时:2(一)实验类型:创新型(二)实验目的1.学习MapReduce编程模型,理解MapReduce编程思想,会用MapReduce框架编写简单的并行程序;2. 熟练使用Eclipse编写、调试和运行MapReduce并行程序。(三)实验内容1启动Hadoop,启动Eclipse;2增加/删除用户根据要求,编写MapReduce并行程序,并且运行和调试成功。(四)要求:选开(五)每组人数:1(六)主要实验设备及配套数:微机80台,数据中心服务器集群(七)所在实验室:计算机技术实验室 佛山科学技
2、术学院实 验 报 告课程名称 云计算概论 实验项目 实验三 了解MapReduce编程 一、 实验环境1. Ubuntu 14.04.3 LTS 32位2. Hadoop 2.6.03. JDK 1.7.0_181二、 实验内容与完成情况学习MapReduce编程模型,理解MapReduce编程思想,会用MapReduce框架编写简单的并行程序;熟练使用Eclipse编写、调试和运行MapReduce并行程序。1) 编程实现文件合并和去重操作对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文
3、件的一个样例供参考。 输入文件A的样例如下: 20150101 x 20150102 y 20150103 x 20150104 y 20150105 z20150106 x输入文件B的样例如下:20150101 y20150102 y20150103 x20150104 z20150105 y根据输入文件A和B合并得到的输出文件C的样例如下:20150101 x20150101 y20150102 y20150103 x20150104 y20150104 z20150105 y 20150105 z20150106 x答案:代码如下:package com.Merge;import jav
4、a.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 o
5、rg.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.util.GenericOptionsParser;public class Merge /* * param args * 对A,B两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C */ /重载map函数,直接将输入中的value复制到输出数据的key上 public static class Map
6、 extends Mapper private static Text text = new Text(); public void map(Object key, Text value, Context context) throws IOException,InterruptedException text = value; context.write(text, new Text(); /重载reduce函数,直接将输入中的key复制到输出数据的key上 public static class Reduce extends Reducer public void reduce(Text
7、key, Iterable values, Context context ) throws IOException,InterruptedException context.write(key, new Text(); public static void main(String args) throws Exception / TODO Auto-generated method stub Configuration conf = new Configuration(); conf.set(fs.default.name,hdfs:/localhost:9000); String othe
8、rArgs = new Stringinput,output; /* 直接设置输入参数 */ if (otherArgs.length != 2) System.err.println(Usage: wordcount ); System.exit(2); Job job = Job.getInstance(conf,Merge and duplicate removal); job.setJarByClass(Merge.class); job.setMapperClass(Map.class); job.setCombinerClass(Reduce.class); job.setRedu
9、cerClass(Reduce.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); FileInputFormat.addInputPath(job, new Path(otherArgs0); FileOutputFormat.setOutputPath(job, new Path(otherArgs1); System.exit(job.waitForCompletion(true) ? 0 : 1); 2) 编写程序实现对输入文件的排序现在有多个输入文件,每个文件中的每行内容均为一
10、个整数。要求读取所有文件中的整数,进行升序排序后,输出到一个新的文件中,输出的数据格式为每行两个整数,第一个数字为第二个整数的排序位次,第二个整数为原待排列的整数。下面是输入文件和输出文件的一个样例供参考。输入文件1的样例如下:33371240输入文件2的样例如下:416395输入文件3的样例如下:14525根据输入文件1、2和3得到的输出文件如下:1 12 43 54 125 166 257 338 379 3910 4011 45答案:代码如下:package com.MergeSort;import java.io.IOException;import org.apache.hadoop
11、.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.Partitioner;import org.apache.hadoop.mapreduce.Reducer;imp
12、ort org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.util.GenericOptionsParser;public class MergeSort /* * param args * 输入多个文件,每个文件中的每行内容均为一个整数 * 输出到一个新的文件中,输出的数据格式为每行两个整数,第一个数字为第二个整数的排序位次,第二个整数为原待排列的整数 */ /
13、map函数读取输入中的value,将其转化成IntWritable类型,最后作为输出key public static class Map extends Mapper private static IntWritable data = new IntWritable(); public void map(Object key, Text value, Context context) throws IOException,InterruptedException String text = value.toString(); data.set(Integer.parseInt(text);
14、context.write(data, new IntWritable(1); /reduce函数将map输入的key复制到输出的value上,然后根据输入的value-list中元素的个数决定key的输出次数,定义一个全局变量line_num来代表key的位次 public static class Reduce extends Reducer private static IntWritable line_num = new IntWritable(1); public void reduce(IntWritable key, Iterable values, Context contex
15、t) throws IOException,InterruptedException for(IntWritable val : values) context.write(line_num, key); line_num = new IntWritable(line_num.get() + 1); /自定义Partition函数,此函数根据输入数据的最大值和MapReduce框架中Partition的数量获取将输入数据按照大小分块的边界,然后根据输入数值和边界的关系返回对应的Partiton ID public static class Partition extends Partition
16、er public int getPartition(IntWritable key, IntWritable value, int num_Partition) int Maxnumber = 65223;/int型的最大数值 int bound = Maxnumber/num_Partition+1; int keynumber = key.get(); for (int i = 0; inum_Partition; i+) if(keynumber=bound * i) return i; return -1; public static void main(String args) t
17、hrows Exception / TODO Auto-generated method stub Configuration conf = new Configuration(); conf.set(fs.default.name,hdfs:/localhost:9000); String otherArgs = new Stringinput,output; /* 直接设置输入参数 */ if (otherArgs.length != 2) System.err.println(Usage: wordcount ); System.exit(2); Job job = Job.getIns
18、tance(conf,Merge and sort); job.setJarByClass(MergeSort.class); job.setMapperClass(Map.class); job.setReducerClass(Reduce.class); job.setPartitionerClass(Partition.class); job.setOutputKeyClass(IntWritable.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path
19、(otherArgs0); FileOutputFormat.setOutputPath(job, new Path(otherArgs1); System.exit(job.waitForCompletion(true) ? 0 : 1); 1) 对给定的表格进行信息挖掘下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。输入文件内容如下:child parentSteven LucySteven JackJone LucyJone JackLucy MaryLucy FrankJack AliceJack JesseDavid AliceDavid
20、JessePhilip DavidPhilip AlmaMark DavidMark Alma输出文件内容如下:grandchild grandparentMark JesseMark AlicePhilip JessePhilip AliceJone JesseJone AliceSteven JesseSteven AliceSteven FrankSteven MaryJone FrankJone Mary答案:代码如下:package com.simple_data_mining;import java.io.IOException;import java.util.*;import
21、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.mapreduc
22、e.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.util.GenericOptionsParser;public class simple_data_mining public static int time = 0; /* * param args * 输入一个child-parent的表格 * 输出一个体现grandchild-grandparent关系的表格 */ /Map将输入文件按照空格分割成child
23、和parent,然后正序输出一次作为右表,反序输出一次作为左表,需要注意的是在输出的value中必须加上左右表区别标志 public static class Map extends Mapper public void map(Object key, Text value, Context context) throws IOException,InterruptedException String child_name = new String(); String parent_name = new String(); String relation_type = new String()
24、; String line = value.toString(); int i = 0; while(line.charAt(i) != ) i+; String values = line.substring(0,i),line.substring(i+1); if(pareTo(child) != 0) child_name = values0; parent_name = values1; relation_type = 1;/左右表区分标志 context.write(new Text(values1), new Text(relation_type+child_name+parent
25、_name); /左表 relation_type = 2; context.write(new Text(values0), new Text(relation_type+child_name+parent_name); /右表 public static class Reduce extends Reducer public void reduce(Text key, Iterable values,Context context) throws IOException,InterruptedException if(time = 0) /输出表头 context.write(new Te
26、xt(grand_child), new Text(grand_parent); time+; int grand_child_num = 0; String grand_child = new String10; int grand_parent_num = 0; String grand_parent= new String10; Iterator ite = values.iterator(); while(ite.hasNext() String record = ite.next().toString(); int len = record.length(); int i = 2;
27、if(len = 0) continue; char relation_type = record.charAt(0); String child_name = new String(); String parent_name = new String(); /获取value-list中value的child while(record.charAt(i) != +) child_name = child_name + record.charAt(i); i+; i=i+1; /获取value-list中value的parent while(ilen) parent_name = parent_
28、name+record.charAt(i); i+; /左表,取出child放入grand_child if(relation_type = 1) grand_childgrand_child_num = child_name; grand_child_num+; else/右表,取出parent放入grand_parent grand_parentgrand_parent_num = parent_name; grand_parent_num+; if(grand_parent_num != 0 & grand_child_num != 0 ) for(int m = 0;mgrand_child_num;m+) for(int n=0;ngran
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1