码迷,mamicode.com
首页 > 其他好文 > 详细

mahout k-means聚类的入门操作步骤重点:

时间:2015-07-10 22:19:24      阅读:372      评论:0      收藏:0      [点我收藏+]

标签:

1.把文本文件变为sequence file:
  mahout seqdirectory -file://$(pwd)/news/ -o file://$(pwd)/news-seq/ -c UTF-8 -chunk 64 -xm sequential
  mahout seqdirectory -file://$(pwd)/1/ -o file://$(pwd)/1-seq/ -c UTF-8 -chunk 64 -xm sequential
2.把本地的seqence file传到hadoop上去:
   [root@master data]# hadoop fs -mkdir /news/news
   [root@master data]# hadoop fs -put news-seq /news/news
hadoop fs -put 1-seq /news/1
3.把sequence file向量化:

mahout seq2sparse -i /news/news/news-seq -o /news/news/news-sparse -lnorm -nv -wt tfidf -a org.apache.lucene.analysis.core.WhitespaceAnalyzer

mahout seq2sparse -i /news/1/1-seq -o /news/1/news-sparse -lnorm -nv -wt tfidf -a org.apache.lucene.analysis.core.WhitespaceAnalyzer
   

df-count 目录:保存着文本的频率信息 
tf-vectors 目录:保存着以 TF 作为权值的文本向量 
tfidf-vectors 目录:保存着以 TFIDF 作为权值的文本向量 
tokenized-documents 目录:保存着分词过后的文本信息 
wordcount 目录:保存着全局的词汇出现的次数 
dictionary.file-0 目录:保存着这些文本的词汇表 
frequcency-file-0 目录 : 保存着词汇表对应的频率信息。
4.把向量化的数据用k-means算法聚类
mahout kmeans -i /news/news/news-sparse/tfidf-vectors -c /news/news/news-kmeans-clusters -o /news/news/news-kmeans -k 10 -dm org.apache.mahout.common.distance.CosineDistanceMeasure -x 10 -ow --clustering
bjYTWD1021

   mahout kmeans -i /news/1/news-sparse/tfidf-vectors -c /news/1/news-kmeans-clusters -o /news/1/news-kmeans -k 1000 -dm org.apache.mahout.common.distance.CosineDistanceMeasure -x 10 -ow --clustering

5.聚类结束,查看结果:
   1)打到屏幕上
   mahout seqdumper -i /news/news/news-kmeans/clusteredPoints 
    2)下载到本地
   mahout seqdumper -i /news/news/news-kmeans/clusteredPoints -o ./files


mahout seqdumper -i /news/1/news-kmeans/clusteredPoints -o ./1
推荐:::::



ik分词用来分词的类:
org.wltea.analyzer.lucene.IKAnalyzer

看聚类的结果:

mahout seqdumper -i /user/news3/news3-kmeans/clusteredPoints/


 mahout seq2sparse -i /news/news11/news11-seq -o /news/news11/news-sparse -lnorm -nv -wt tfidf -a org.apache.lucene.analysis.core.WhitespaceAnalyzer




mahout seq2sparse -i ~/mahout-dirs/seq -o ~/mahout-dirs/vectors 
-lnorm -nv -wt tfidf -a org.wltea.analyzer.lucene.IKAnalyzer

mahout seq2sparse -i ~/mahout-dirs/seq -o ~/mahout-dirs/vectors 
-lnorm -nv -wt tfidf -a org.apache.lucene.analysis.core.WhitespaceAnalyzer


mahout seq2sparse -i ~/mahout-dirs/seq -o ~/mahout-dirs/vectors 
-lnorm -nv -wt tfidf -a org.apache.lucene.analysis.standard.StandardAnalyzer
mahout seq2sparse -/user/news/news-seq -/user/news/news-sparse -ow --weight tfidf--maxDFPercent 85 --namedVector -a org.wltea.analyzer.lucene.IKAnalyzer

向量化:
mahout seq2sparse -/user/coder4/reuters-seq -/user/coder4/reuters-sparse -ow --weight tfidf --maxDFPercent 85 --namedVector -a org.apache.lucene.analysis.core.WhitespaceAnalyzer


org.wltea.analyzer.lucene.IKAnalyzer


k-means:
mahout kmeans -i /user/news/news-sparse/tfidf-vectors -c /user/news/news-kmeans-clusters -/user/news/news-kmeans -100 -dm org.apache.mahout.common.distance.CosineDistanceMeasure -x 1-ow --clustering



1. 修改hadoop文件
JAVA=$JAVA_HOME/bin/java
JAVA_HEAP_MAX=-Xmx1024m

2 修改hadoop-env.sh文件
# The maximum amount of heap to use, in MB. Default is 1000.
export HADOOP_HEAPSIZE=2000

3, 环境变量 JAVA_OPTS



JAVA_OPTS="-Xms3350 -Xmx3350m"  
-Xms64m -Xmx1024m



在mapred-site.xml中设置:

<property>
  <name>mapred.child.java.opts</name>
  <value>-Xmx2048m</value>
</property>

值改大一些  1024m。










我们经常遇到这样的问题,内存溢出,内存溢出的原因是很简单,不够用了,不够用该怎么设置,通过水设置。可以参考下面案例

一、hadoop的mapreduce作业中经常出现Java heap space解决方案

常常被一些用户问到,说“为什么我的mapreduce作业总是运行到某个阶段就报出如下错误,然后失败呢?以前同一个作业没出现过的呀?” 
10/01/10 12:48:01 INFO mapred.JobClient: Task Id : attempt_201001061331_0002_m_000027_0, Status : FAILED 
java.lang.OutOfMemoryError: Java heap space 
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:498) 
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305) 
        at org.apache.hadoop.mapred.Child.main(Child.java:158)

这个实际上是 Out Of Memory OOM问题。

其实这样的错误有时候并不是程序逻辑的问题(当然有可能是由于程序写的不够高效,产生的内存消耗不合理而导致),而是由于同样的作业,在数据量和数据本身发生不同时就会占据不同数量的内存空间。由于hadoop的mapreduce作业的运行机制是:在jobtracker接到客户端来的job提交后,将许多的task分配到集群中各个tasktracker上进行分块的计算,而根据代码中的逻辑可以看出,其实是在tasktracker上启了一个java进程进行运算,进程中有特定的端口和网络机制来保持map 和reduce之间的数据传输,所以,这些OOM的错误,其实就是这些java进程中报出了OOM的错误。 
     知道了原因以后就好办了,hadoop的mapreduce作业启动的时候,都会读取jobConf中的配置(hadoop-site.xml),只要在该配置文件中将每个task的jvm进程中的-Xmx所配置的java进程的max heap size加大,就能解决这样的问题: 
<property> 
  <name>mapred.child.java.opts</name> 
  <value>-Xmx1024m</value> 
</property> 

PS:该选项默认是200M 

新版本应该是在conf/hadoop-env.sh文件中修改。默认为1000M



输入分析:

mahout下处理的文件必须是SequenceFile格式的,所以需要把txtfile转换成sequenceFile,而聚类必须是向量格式的,mahout提供下面两个命令来将文本转成向量形式
1.mahout seqdirectory:将文本文件转成SequenceFile文件,SequenceFile文件是一种二制制存储的key-value键值对,对应的源文件是org.apache.mahout.text.SequenceFilesFromDirectory.java

2.mahout seq2sparse:将SequenceFile转成向量文件,对应的源文件是org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles.java

输出分析:即查看结果
mahout seqdumper:将SequenceFile文件转成可读的文本形式,对应的源文件是org.apache.mahout.utils.SequenceFileDumper.java
mahout vectordump:将向量文件转成可读的文本形式,对应的源文件是org.apache.mahout.utils.vectors.VectorDumper.java
mahout clusterdump:分析最后聚类的输出结果,对应的源文件是org.apache.mahout.utils.clustering.ClusterDumper.java

具体每种命令如何用及参数选择,可以在命令行后面加-h或-help,例如,查看mahout seqdumper -h,这样终端下,就会列出详细的参数选项及说明

最重要的是读读这几个命令的源代码,看看是如何实现的,这样才可以灵活运用到自己的应用中去


版权声明:本文为博主原创文章,未经博主允许不得转载。

mahout k-means聚类的入门操作步骤重点:

标签:

原文地址:http://blog.csdn.net/sean417/article/details/46834909

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!