开发MapReduce程序 实验1

来源:互联网 发布:软件项目管理 pdf下载 编辑:程序博客网 时间:2024/04/30 07:29

一、实验题目

开发MapReduce程序

二、实验要求

对于各种形式的文本分析而言,LineCount应用程序是一个不可或缺的统计工具。
想分析文本,我们必须知道文本中的行数、字数和单词数。
此外,这些参数的出现频率也有助于我们对数(值)进行分类。
本次实验练习中,我们将借助Eclipse集成开发环境(IDE)编写MapReduce程序,以统计给定文本文件的行数。

三、操作步骤

1.在Ubuntu上安装Eclipse、Hadoop和JDK(虚拟机里已经安装了这些环境);
2.打开Eclipse,创建一个新的Java Project;
3.选择“Configure Build Path”,选择Library标签,Add External JARs;
4.选择Apache/Hadoop 1.0.4文件夹,选择下列jar文件:
commons-collections-3.2.1.jar
commons-confi guration-1.6.jar
commons-httpclient-3.0.1.jar
commons-lang-2.4.jar
commons-logging-1.1.1.jar
commons-logging-api-1.0.4.jar
jackson-core-asl-1.8.8.jar
jackson-mapper-asl-1.8.8.jar
log4j-1.2.15.jar
Hadoop-core-1.0.4.jar
5.创建“com.trendwise.java”包,并在包中创建“LineCount”类(可使用附件文件);
6.将LineCount项目导出为Jar文件;
7.启动Hadoop,复制loaddata1文件到“/home/wcbdd/Desktop/loaddata1”;
8.访问localhost:50070,利用文件选择器选择选择loaddata1;
9.运行MapReduce程序,“bin/hadoop jar /home/wcbdd/linecount.jar com.trendwise.java.linecount /LOAD /home/wcbdd/workspace/BIGmb”;
10.打开浏览器查看LineCount结果;
11.复制结果到本地文件output.txt;

四、实验结果

首先,建立一个Java Project。在建立时,要将默认的Java1.7改为Java1.6.


新建Java Class,并且添加jar。需要将Hadoop文件夹下的以及lib文件夹下的所有jar均添加进去。

输入代码:
//This wraps the modules into a single programpackage com.trendwise.java; //Package nameimport java.io.IOException;import java.util.Iterator;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapred.FileInputFormat;import org.apache.hadoop.mapred.FileOutputFormat;import org.apache.hadoop.mapred.JobClient;import org.apache.hadoop.mapred.JobConf;import org.apache.hadoop.mapred.MapReduceBase;import org.apache.hadoop.mapred.Mapper;import org.apache.hadoop.mapred.OutputCollector;import org.apache.hadoop.mapred.Reducer;import org.apache.hadoop.mapred.Reporter;import org.apache.hadoop.mapred.TextInputFormat;import org.apache.hadoop.mapred.TextOutputFormat;public class LineCount {public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {private final static IntWritable obj = new IntWritable(1);private Text words = new Text("Total Lines");public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output,Reporter reporter) throws IOException {output.collect(words, obj);}}public static class Reduce extends MapReduceBase implementsReducer<Text, IntWritable, Text, IntWritable> {public void reduce(Text key, Iterator<IntWritable> values,OutputCollector<Text, IntWritable> output, Reporter reporter)throws IOException {int sum1 = 0;while (values.hasNext()) {sum1 += values.next().get();}output.collect(key, new IntWritable(sum1));}}public static void main(String[] args) throws Exception {JobConf config = new JobConf(LineCount.class);config.setJobName("LineCount");config.setOutputKeyClass(Text.class);config.setOutputValueClass(IntWritable.class);config.setMapperClass(Map.class);config.setCombinerClass(Reduce.class);config.setReducerClass(Reduce.class);config.setInputFormat(TextInputFormat.class);config.setOutputFormat(TextOutputFormat.class);FileInputFormat.setInputPaths(config, new Path(args[0]));FileOutputFormat.setOutputPath(config, new Path(args[1]));JobClient.runJob(config);}}
上述代码,map部分负责从原始数据中提取感兴趣的内容,在本例中,也就是行数。
reduce部分不择将map获取的数据进行整合,也就是求出中行数,并且输出。
main部分起到drive的作用。
编写完代码后,将其导出为jar文件,方便运行使用。

将文件从本地拷贝到HDFS中:

由于hadoop在安全模式下是不能创建文件夹的,因此需要将安全模式关闭。
可以看到关闭后,文件成功拷贝到HDFS中了。
接下来就是启动hadoop,运行MapReduce程序了。




打开浏览器,查看LineCount的运行结果

将文件从hdfs中导出

查看output1.text


可以看到结果和浏览器中查看的结果是一致的。

需要注意的是,文档中给的很多路径是错误的,包括LineCount小写了,以及导出文件时,路径给的是源文件的路径,而不是处理之后的路径等。
总结下就是,文档可以帮助我们快速入门,但是过于依靠文档,会频繁出错,还是需要加深自己对这个实验过程的理解。



0 0