新學Hadoop,測試了hello word級別的程序WordCount,打算用hadoop做聚類分析,這次測試KMeans,二維的數據,這裡詳細的介紹一下我的測試過程(偽分布式),以供參考,源代碼下載。
下載在Linux公社的1號FTP服務器裡,下載地址:
FTP地址:ftp://www.linuxidc.com
用戶名:www.linuxidc.com
密碼:www.muu.cc
在 2013年LinuxIDC.com\5月\Hadoop之測試KMeans
下載方法見 http://www.linuxidc.net/thread-1187-1-1.html
--------------------------------------------------------------------
Step1: 配置好eclipse和hadoop,具體可以參考網上一些操作。
Step2: 新建一個Project --> Map/Reduce Project工程,命名為KMeans,這裡記得要選擇Map/Reduce Project工程,否則把代碼加進來會出現import錯誤
Step3: 用tinycui提供的網址下載KMeans的源代碼,把src和bin文件覆蓋到自己新建的工程中,並在eclipse中刷新KMeans工程
Step4: 在DFS中新建兩個文件夾center, cluster, 並在center文件夾中上傳一個空的文件center以存放每次迭代的center值,在cluter文件夾中上傳cluster的文件,這個文件中是輸入數據,數據格式為:(20,30) (50,61) (20,32) (50,64) (59,67) (24,34) (19,39) (20,32) (50,65) (50,77) (20,30) (20,31) (20,32) (50,64) (50,67)
Step5: 配置main的輸入參數,Run --> Run Configurations中的Arguments中配置main的三個參數:輸入路徑,存放KMeans的中心的路徑,輸出路徑,中間空格隔開。
分別為
hdfs://192.168.56.171:9000/cluster
hdfs://192.168.56.171:9000/center
hdfs://192.168.56.171:9000/ouput
這裡的IP可以填寫自己的IP地址或者localhost
Step6: 修改部分配置代碼,具體代碼可以參考如下:
主程序KMeans.java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class KMeans {
public static void main(String[] args) throws Exception
{
CenterInitial centerInitial = new CenterInitial();
centerInitial.run(args);
int times=0;
double s = 0,shold = 0.0001;
do {
Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://192.168.56.171:9000");
Job job = new Job(conf,"KMeans");
job.setJarByClass(KMeans.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setMapperClass(KMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setReducerClass(KReducer.class);
FileSystem fs = FileSystem.get(conf);
fs.delete(new Path(args[2]),true);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[2]));
job.waitForCompletion(true);
if(job.waitForCompletion(true))
{
NewCenter newCenter = new NewCenter();
s = newCenter.run(args);
times++;
}
} while(s > shold);
System.out.println("Iterator: " + times);
}
}