1.把文本文件变为sequence file:
mahout seqdirectory -i file://$(pwd)/news/
-o file://$(pwd)/news-seq/ -c UTF-8 -chunk 64 -xm sequential
mahout seqdirectory -i file://$(pwd)/1/
-o file://$(pwd)/1-seq/ -c UTF-8 -chunk 64 -xm sequential
2.把本地的seqence file传到hadoop上去:
[[email protected] data]# hadoop fs -mkdir /news/news
[[email protected] 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
推荐:::::
http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/
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 -i /user/news/news-seq -o /user/news/news-sparse -ow --weight tfidf--maxDFPercent 85 --namedVector
-a org.wltea.analyzer.lucene.IKAnalyzer
向量化:
mahout seq2sparse -i /user/coder4/reuters-seq -o /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 -o /user/news/news-kmeans -k 100 -dm org.apache.mahout.common.distance.CosineDistanceMeasure -x
10 -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,这样终端下,就会列出详细的参数选项及说明
最重要的是读读这几个命令的源代码,看看是如何实现的,这样才可以灵活运用到自己的应用中去
版权声明:本文为博主原创文章,未经博主允许不得转载。