初始化中心点CenterInitial.java
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class CenterInitial {
public void run(String[] args) throws IOException
{
String[] clist;//用于保存中心点
int k = 2;//中心点选取个数
String string = "";//保存各个中心点在同一个字符串string中
String inpath = args[0]+"/4.txt"; //cluster数据集放在2.txt中
String outpath = args[1]+"/input2/3.txt"; //center新选取的中心点放进3.txt中保存
Configuration conf1 = new Configuration(); //读取hadoop文件系统的配置
conf1.set("hadoop.job.ugi", "hadoop,hadoop"); //配置信息设置
FileSystem fs = FileSystem.get(URI.create(inpath),conf1); //FileSystem是用户操作HDFS的核心类,它获得URI对应的HDFS文件系统
FSDataInputStream in = null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
try{
in = fs.open( new Path(inpath) );
IOUtils.copyBytes(in,out,50,false); //用Hadoop的IOUtils工具方法来让这个文件的指定字节复制到标准输出流上
//把in读到的数据 复制到out上
clist = out.toString().split(" ");//将out以空格为分割符转换成数组在clist中保存
} finally {
IOUtils.closeStream(in);
}
FileSystem filesystem = FileSystem.get(URI.create(outpath), conf1); //获得URI对应的HDFS文件系统
for(int i=0;i<k;i++)
{
int j=(int) (Math.random()*100) % clist.length;//选取0到clist.lenth-1的随机数
if(string.contains(clist[j])) // 如果选取的是同一个随机数
{
k++;
continue;
}
string = string + clist[j].replace(" ", "") + " ";//将得到的k个随机点的坐标用一个字符串保存
}
OutputStream out2 = filesystem.create(new Path(outpath) );
IOUtils.copyBytes(new ByteArrayInputStream(string.getBytes()), out2, 4096,true); //把随机点坐标字符串out2中
System.out.println("初始化过程:"+string);
}
}