请..来个身体救救我!!!!
这是main.class
import java.io.IOException;
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 Main{
/**
* @param args
* @throws IOException
* @throws ClassNotFoundException
* @throws InterruptedException
*/
static enum Counter{
CONVERGED
}
public static final String CENTROIDS = "centroids";
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
int iteration = 1;
long changes = 0;
Path dataPath = new Path(args[0]);
//read in the initial cluster centroids.
Configuration centroidConf = new Configuration();
Job centroidInputJob = new Job(centroidConf);
centroidInputJob.setJobName("KMeans Centroid Input");
centroidInputJob.setJarByClass(Main.class);
Path centroidsPath = new Path("centroids_0");
centroidInputJob.setMapperClass(KmeansCentroidInputMapper.class);
// No Combiner, no Reducer.
centroidInputJob.setMapOutputKeyClass(Text.class);
centroidInputJob.setMapOutputValueClass(Text.class);
centroidInputJob.setOutputKeyClass(Text.class);
centroidInputJob.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(centroidInputJob,new Path(args[1]) );
FileOutputFormat.setOutputPath(centroidInputJob, centroidsPath);
centroidInputJob.setNumReduceTasks(0);
if (!centroidInputJob.waitForCompletion(true)) {
System.err.println("Centroid input job failed!");
System.exit(1);
}
while(true){
Configuration conf = new Configuration();
Path nextIter = new Path(String.format("centroids_%s", iteration));
Path prevIter = new Path(String.format("centroids_%s", iteration - 1));
conf.set(Main.CENTROIDS, prevIter.toString());
Job job = new Job(conf);
job.setJobName("Kmeans " + iteration);
job.setJarByClass(Main.class);
job.setJobName("KMeans "+ iteration);
//Set Mapper, Combiner, and Reducer
job.setMapperClass(MapClass.class);
job.setReducerClass(ReduceClass.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setNumReduceTasks(1);
job.setCombinerClass(CombineClass.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
//Set input/output paths
FileInputFormat.addInputPath(job, dataPath);
FileOutputFormat.setOutputPath(job, nextIter);
job.setNumReduceTasks(1);
job.waitForCompletion(true);
iteration++;
changes = job.getCounters().findCounter(Main.Counter.CONVERGED).getValue();
job.getCounters().findCounter(Main.Counter.CONVERGED).setValue(0);
if(changes<=0){
break;
}
}
}
}
源代码:https://github.com/yezhang1989/k-means-clustering-on-MapReduce
请命令
job.setNumReduceTasks(1);
并检查它是否工作。
MapReduce作业的默认Reducer为1,因此不需要将其设置为1
本文向大家介绍Hadoop MapReduce编程的优势,包括了Hadoop MapReduce编程的优势的使用技巧和注意事项,需要的朋友参考一下 大数据基本上是一个涵盖大型和复杂数据集的术语。为了处理它,与传统类型相比,需要使用不同的数据处理应用程序。 尽管有各种应用程序可以处理和处理大数据,但基本框架始终是Apache Hadoop的框架。 什么是Apache Hadoop? Hadoop是一
我试图运行WordCount示例的一个变体,这个变体是,映射器输出文本作为键和文本作为值,而还原器输出文本作为键和NullWritable作为值。 除了地图,减少签名,我把主要的方法是这样的:
我正在使用MapReduce为web搜索建立一个倒排索引。我知道如何使用一个键类型的MapReduce,您在这里设置它: 但是,如果我的密钥可以是不同类型的,那是不是支持呢?例如,一个键可能只是文本,另一个键可能是PairofWritables。我想为从映射器到reducer的输出,以及从reducer到最终输出的输出设置不同的键类型。我已经看到了一个名为MultipleOutput的类,它允许指
一、背景 最近总在弄MR的东西,所以写点关于这个方面的内容,总结一下吧 二、流程描述 说实话,文字描述比较苍白,画了个图,贴出来,大家看看,有问题欢迎指出 三、总结 1、值得提出的是,一个map结束就马上会进行分区的操作。并非是等所有的map都结束才做分区的操作。 2、分组的操作是对key的值进行比较分组。(可以是复合key,也可以是单一的key) 3、关于job.setSortComparato
我正在学习一些MapReduce,但是我遇到了一些问题,情况是这样的:我有两个文件:“users”包含一个用户列表,其中包含一些用户数据(性别、年龄、国家等)...)文件看起来像这样: “歌曲”包含所有用户收听的歌曲的数据(用户ID,收听日期和时间,艺术家ID,艺术家姓名,歌曲ID,歌曲标题): 目标是在某些国家找到k首最受欢迎的歌曲。k和输入中提供的国家列表。 我决定为映射器使用Multiple