Windows 7平台基于Hadoop hdfs的中文分词统计和排序

来源:互联网 发布:ubuntu win7双系统安装 编辑:程序博客网 时间:2024/06/01 10:32

       以前的博客中,使用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.csdn.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界面上查阅更多相关内容。

整个工程的代码文件已经上传到CSDN:windows平台使用hadoop hdfs文件进行中文分词的示例代码。

本博文参考了以下网络资源,在此一并致谢!!

hadoop2.7.2 window win7 基础环境搭建
http://blog.csdn.net/fly_leopard/article/details/51250443

Hadoop2.7.0学习——hadoop-eclipse-plugin-2.7.0插件安装
http://blog.csdn.net/flygoa/article/details/52228595

Hadoop2.7.0学习——Windows下hadoop-eclipse-plugin-2.7.0插件使用
http://blog.csdn.net/flygoa/article/details/52230745


欢迎各位网友批评指正。








原创粉丝点击