一、实验题目
编写MapReduce程序Dictionary。 二、实验目的
Dictionary遍历dictionary.txt文件,读取数据,并把其中的英文词汇转化为法语或意大利语。 文档格式:每行空格前为英语,空格后为法语或意大利语,中括号中为词性。 三、任务分解
首先,先观察待处理文档,由于windows下与linux中回车符的表示不同(一个为\r\n,一个为\n)。 所以同一个文档在不同系统中是不同的,linux如下图。
windows如下图:
所以要在linux中查看待处理文档,这一步很关键。
从文档中可以看出,该文档实际上是一个字典,每一行对应一个词条 即每一行都是一个英文单词对应一个或是多个翻译,通过逗号分隔开。 因此负责提取感兴趣信息的mapper函数就可以写出了: 在mapreduce中,数据的获取是按行获取的。获取之后转为String格式,再通过逗号来分离,最终将获得的值按照(key,word)的方式打包。 以linux第三行为例,aardvark orycte/rope[Noun]经过处理之后的结果应当为(aardvark,orycte)及(aardvark ,rope[Noun])
reduce部分则是要把这样相同的值整合,并且输出。因此reduce部分的代码为: package net.pascalalma.hadoop;
import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException;
public class AllTranslationsReducer extends Reducer<Text, Text, Text, Text> { private Text result = new Text();
@Override protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { String translations = ""; for (Text val : values) { translations += "|" + val.toString(); } result.set(translations); context.write(key, result); }} 其中for(Text val:values)的意思为,map中相同key值的不同values,然后将这些value以|为分割连接起来,传给translations值。 最后将值打包。 接着写一下driver部分,整个程序就可以运行了。 *四、实验步骤
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;
6.查看运行结果。
五、总结 尝试着分析了一下mapper,reducer函数究竟是怎样写成的。 由于对java以及hadoop内的类不够熟悉,虽然搜索了相关资料,但错误难以避免,希望各位看官能指出不足。 我接下来的实验也将采用这种方式,下周的实验要多查官方文档,希望能够写出更加详细的实验报告。