Windows 7平台基于Hadoop hdfs的中文分词统计和排序
以前的博客中,使用Spark对本地文件进行了中文分词的统计和排序,但是只能对本地文件进行处理。如果能使用基于Hadoop hdfs文件系统的文件,无疑会增加分布式处理的强大功能。本文参考Hadoop WordCount的example,在Windows 7平台上,对中文文本进行分词及词频统计及排序。
首先要在Windows 7上部署Hadoop。Hadoop是基于java的系统,所以JDK安装必不可少。本文使用的Hadoop版本是2.7.0,使用JDK版本是1.7.0_07。
先从Oracle官网下载64位JDK jdk-7u7-windows-x64.exe安装,设置Java_Home环境变量,并且把%Java_Home%/bin加入Path变量。在命令行输入java -version 如下正确显示JDK版本表示JDK安装成功:
然后从Hadoop官网下载hadoop-2.7.0.tar.gz,解压到E:\hadoop-2.7.0目录,设置Hadoop_Home环境变量,并且把%Hadoop_Home%/bin加入Path变量。在命令行输入hadoop version 如下正确显示Hadoop版本表示Hadoop部署成功:
接下来要设定Hadoop在Windows 7上启动的设定。
在E:\hadoop-2.7.0\etc\hadoop目录下,首先修改core-site.xml,加入:
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
设定Hadoop的hdfs文件系统使用本地9000端口
然后修改hdfs-site.xml,加入:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/hadoop/hadoop270/data/dfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/hadoop/hadoop270/data/dfs/datanode</value>
</property>
分别设定Hadoop的NameNode和DataNode的本地文件目录。
接下来修改mapred-site.xml,加入:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
使用yarn来进行资源管理。
最后修改yarn-site.xml,加入:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
对yarn进行配置。
Hadoop要在Windows 7上跑起来,还需要winutils支持和hadoop.dll等文件,下载地址:http://download.****.net/detail/fly_leopard/9503059
把hadoop.dll和winutils.exe放到%Hadoop_Home%\bin目录下:
注意hadoop.dll等文件不要与hadoop冲突。为了不出现依赖性错误可以将hadoop.dll放到c:/windows/System32下一份。
以上准备工作都做好之后,命令行转到%Hadoop_Home%\bin目录下,执行 hdfs namenode -format格式化系统文件:
格式化完成后转到%Hadoop_Home%\sbin下执行 start-dfs启动hadoop。启动成功后会新出现两个命令行窗口,一个是NameNode,一个是DataNode:
然后可以访问:http://localhost:50070 在Web界面查看本地Hadoop系统的相关信息,以及浏览HDFS省的文件:
前面以及配置了yarn资源管理,所以也可以从命令行启动yarn,在%Hadoop_Home%\sbin下执行 start-yarn,启动成功后又会新出现两个命令行窗口,一个ResourceManager,一个NodeManager:
yarn的访问端口是8088:http://localhost:8088,界面如下:
Hadoop成功启动之后,就要开始往HDFS上创建目录,上传用于分词统计的文件了。命令行下,转到%Hadoop_Home%\bin目录下,以此执行下列命令:
hdfs dfs -mkdir user
hdfs dfs -mkdir user/dumbbell
hdfs dfs -mkdir user/dumbbell/input
hdfs dfs -mkdir user/dumbbell/output
hdfs dfs -mkdir user/dumbbell/sort
在HDFS上创建用于保存用户输入输出及排序后数据的文件夹。最后,输入
hdfs dfs -ls user/dumbbell 可以看到当前用户的目录下创建有三个目录:
创建的目录结构也可以在Hadoop的web界面上查看到:
继续在%Hadoop_Home%\bin下,执行HDFS命令,从本地上传三个文件到HDFS 文件系统:df
hdfs dfs -put E:\text\唐诗三百首.txt /user/dumbbell/input
hdfs dfs -put E:\text\宋诗三百首.txt /user/dumbbell/input
hdfs dfs -put E:\text\全唐诗.txt /user/dumbbell/input
然后,输入 hdfs dfs -ls /user/dumbbell/input可以看到,三个文件已经被上传到input目录中:
同样可以到Hadoop的web界面去确认文件成功上传到HDFS目录:
以上成功在Windows 7上启动了Hadoop,并且把相应的文件放到了HDFS中,下面就来来对这些文件进行处理了。
开发工具选用的是Eclipse Kepler EE版,当然也可以选择更新的Eclipse版本,但是对于Hadoop-2.7.0来说,这个版本足够了。要用Eclipse进行Hadoop开发,Hadoop的Eclipse插件必不可少,对于不同的Hadoop版本,插件也有不同版本。点击下载hadoop-eclipse-plugin-2.7.0 ,然后放到Eclipse的plugins目录中,重启Eclipse之后,就会发现,Preferences中多了一个Hadoop Map/Reduce的项目:
选中Hadoop项目之后,会要设置Hadoop的安装目录。
然后,在Window菜单的ShowView中,继续选中MapReduce Tools下的Map Reduce Locations:
编辑或新增Map Reduce Locations:
设定Hadoop系统的各项参数(Windows 7环境下,其实也就一项参数DFS Master要设定):
设定完成之后,在Project Explorer的顶部,会多出一个DFS Locations文件夹,展开后在Hadoop部署的机器名(这里是localhost)上右击选Reconnect,就可以浏览到Hadoop HDFS上的文件了:
这里看到的内容和命令行及Web界面浏览到的都是一致的内容。
Hadoop和Eclipse都设定好了,下来就要创建工程,进行分词统计了。在New Project Wizard中选择Map/Reduce Project:
单击Next,输入Project Name,也可以重新改变Hadoop的安装位置:
单击Finish后,创建的Project结构如下:
这个Wizard的最大作用,就是把散落在Hadoop安装路径下好几个目录中的上百个Jar档都给自动引进来了,免得一个一个添加的繁琐。
因为要进行中文分词,所以还要引入中文分词的library及相关配置文件。这里使用的是IKAnalyzer2012_u6(当然也可以使用其他的分词工具进行分词),配置文件有
IKAnalyzer.cfg.xml和stopword.dic,需放在src目录下;jar档IKAnalyzer2012_u6.jar需在工程中引入。
工程的具体代码是在Hadoop的WordCount example的基础上修改而成,结构如下::
其中SorttableMap是一个可排序的HashMap,WordComparator扩展了IntWritable.Comparator,实现了排序时需要的比较功能。
WordMapper是从example的程序代码中抽取独立出来的,加入了中文分词的功能:
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString().toLowerCase(); // 全部转为小写字母
/*
* line = line.replaceAll(pattern, " "); // 将非0-9, a-z, A-Z的字符替换为空格
* StringTokenizer itr = new StringTokenizer(line); while
* (itr.hasMoreTokens()) { word.set(itr.nextToken());
* context.write(word, one); }
*/
try {//中文分词
InputStream is = new ByteArrayInputStream(line.getBytes("UTF-8"));
IKSegmenter seg = new IKSegmenter(new InputStreamReader(is),false);
Lexeme lex = seg.next();
while (lex != null) {
String text = lex.getLexemeText();
word.set(text);
context.write(word, one);
// output.collect(word, one);
lex = seg.next();
}
WordReducer也是从example代码中抽取独立出来的,reduce的方法唯一增加了对Reduce结果保存到SortableMap中的操作:
public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
//保存结果
totalWords.put(key.toString(), Integer.valueOf(sum));
}
WordCount是整个工程的核心,启动了两个Hadoop job,一个是分词统计,一个是排序,首先定义了三个文件path,指向Hadoop HDFS:
String fileName = getCurrentDateTime();
Path inputFile = new Path("hdfs://localhost:9000/user/dumbbell/input/唐诗三百首.txt");
Path outputFolder = new Path("hdfs://localhost:9000/user/dumbbell/output/"+fileName);//word count job output,sort job input
Path sortOutput = new Path("hdfs://localhost:9000/user/dumbbell/sort/"+fileName);//sort job output
其中第二个目录,作为第一个分词统计job的输出,同时也作为分词排序job的输入。第二和第三个目录都采用日期字符串的方式命名,以来避免重复,二来方便追踪。
当第一个Job执行完成后,就会执行第二个job:
if (job.waitForCompletion(true)) {
Job sortJob = new Job(conf, "sort");
sortJob.setJarByClass(WordCount.class);
在WordCount上单击右键,Run Config中,配置运行Hadoop的环境变量:
配置好后直接Run,或者保存后在WordCount上右键选择RunOnHadoop:
Console出现以上内容说明运行成功了。可以在Project Explorer顶部的DFS Location中,Reconnect Hadoop,查看分词统计及排序的输出内容:
可以到Hadoop的Web界面去查看输出的文件内容(可能需要调整下编码格式),最终的排序输出如下:
可以看到,唐诗三百首中,最常用的词和最多出现的诗人。
也可以从Hadoop和yarn的Web界面上查阅更多相关内容。
整个工程的代码文件已经上传到****:windows平台使用hadoop hdfs文件进行中文分词的示例代码。
本博文参考了以下网络资源,在此一并致谢!!
hadoop2.7.2 window win7 基础环境搭建
http://blog.****.net/fly_leopard/article/details/51250443
Hadoop2.7.0学习——hadoop-eclipse-plugin-2.7.0插件安装
http://blog.****.net/flygoa/article/details/52228595
Hadoop2.7.0学习——Windows下hadoop-eclipse-plugin-2.7.0插件使用
http://blog.****.net/flygoa/article/details/52230745
欢迎各位网友批评指正。