對於canopy的輸入資料需要的形式為序列檔,同時保證key:Text、HTTP://www.aliyun.com/zixun/aggregation/9541.html"> value:VectorWritable。 昨晚準備打算使用單純的java程式搞定輸入資料的準備,無奈老是會出點問題,昨晚的問題「找不到檔」暫時還沒找到原因。
其實如果只是要獲得輸入資料那麼,可以使用mahout官網提供的方法在得到了序列的*.txt檔後直接把mahout-distribution-0.7.zip解壓拷貝到虛擬機器,(在/etc/ profile裡面配置下hadoop_home變數)然後找到mahout_home/bin目錄,執行 chmod +x mahout ,然後分別執行
[python] view plaincopy ./mahout seqdirectory -i <input> -o <output> [python] view plaincopy ./mahout se q2sparse -i <output>/chunk-0 -o <output-in>
上面的<input>、<output>對應于自己的輸入和輸出;我所使用的資料並不是 Reuters dataset的全部資料,而只是前三個:reut2-000.sgm、reut2-001.sgm、 reut2-002.sgm,這樣的資料在經過ExtractReuters 後生成了3000個檔,然後經過seqdirectory合併成了一個2.41M的資料檔案。 seq2sparse有7個job,每個job負責自己的內容,這個暫時不加分析;最終的結果在<output-in>/tfidf-vectors裡面,即為輸入資料;
有了輸入資料就可以直接跑程式了,首先不管程式是什麼樣子的,先跑出結果再說:
[java] view plaincopy package mahout.test.canopy; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.mahout.clustering.canopy.CanopyDriver; import org.apache.mahout.common.distance.DistanceMeasure; import org.apache.mahout.common.distance.EuclideanDistanceMeasure; public class CanopyTest { public static void main(String[] args) throws ClassNotFoundException, IOException, InterruptedException { Configuration conf =new Configuration(); conf.set(" mapred.job.tracker", "192.168.128.138:9001"); Path input=new Path( "hdfs://hadoop:9000/user/hadoop/output/canopyvec/tfidf-vectors"); Path output=new Path("hdfs://hadoop:9000/user/hadoop/output/canopy-output"); DistanceMeasure measure=new EuclideanDistanceMeasure(); CanopyDriver.buildClusters(conf, input, output, measure, 33.1, 22.1, 3, false); System.out.println("job is done."); } }
最開始的時候我的t1、t2設置為3.1、2.1結果map出來的結果數是為零(這個暫時也不知道是代表什麼意思),後來改為上面的結果可以看到map輸出了509條記錄, reduece輸出3條記錄(符合參數clusterFileter的設定值:3),最後的輸出為:canopy-output/clusters-0-final/part-r-00000。
為了便於後面的觀察,所以不使用上面的資料,而使用自己造的資料,造資料之前首先要知道輸入資料的格式,那麼使用下面的代碼看下輸入資料是什麼:
[java] view plaincopy package mahout.test.utils; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.ToolRunner; import org.apache.mahout.common.AbstractJob;