本篇文章只讲可用的hadoop实现算法的源码,可直接拷贝用于工程中!
算法实现主要包括了四个类
ParticleModel类:质点特征类,任何业务都必须提取出事务的数字特征才可用程序来处理,例如,一个苹果的质点特征可以是:颜色、重量、口感
在定义质点特征类时可以这样来做,double x,y,z分别代表颜色、重量、口感,例如0代表青色,1代表红色,这样就把具体的事务抽像成了程序可以识别与处理的普通bean
ClusterCenter类:对熟悉k-means算法的人来说,这个类非常容易理解,就是最终要聚类成几个簇
KmeanMRStep1类:这是一个map-reduce类,随机生成k个聚类中心,其中Map函数就是读取需要聚类的原始数据,Reduce过程根据随机原则从原始数据中抽取K个数据作为原始簇中心
KmeanMRStep2类:迭代计算聚类结果,map计算相似度,reduce更新簇中心
KmeansDriver类:这是Map-reduce的驱动函数,所有的工程都是类似的固定的编程风格和方法
/**
* 质点特征模型,可根据自己的业务需求进行修改
*
* @author jianting.zhao
*/
public class ParticleModel {
//特征x
public double x;
//特征y
public double y;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
/**
* 定义簇中心
*
* @author jianting.zhao
*/
public class ClusterCenter {
//簇的编号
public int K;
public ParticleModel particleModel;
public ParticleModel getParticleModel() {
return particleModel;
}
public void setParticleModel(ParticleModel particleModel) {
this.particleModel = particleModel;
}
public int getK() {
return K;
}
public void setK(int K) {
this.K = K;
}
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
/*
* kmeans聚类第一步:随机生成k个聚类中心
*/
public class KmeanMRStep1 {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 3) {
System.err.println("Usage: Data Deduplication <in> <out> <cluster num>");
System.exit(2);
}
conf.set("ClusterNum", otherArgs[2]);
FileSystem fs = FileSystem.get(conf);
Path centerPath = new Path(otherArgs[1]);
fs.deleteOnExit(cente