Hadoop之测试KMeans

香帅 2013-05-25

新学Hadoop,测试了hello word级别的程序WordCount,打算用hadoop做聚类分析,这次测试KMeans,二维的数据,这里详细的介绍一下我的测试过程(伪分布式),以供参考,源代码下载。

下载在安科网的1号FTP服务器里,下载地址:

密码:www.muu.cc

下载方法见 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); 
 }

}

相关推荐