Bu aptal bir soru gibi görünse IntWritable değil, ama söz konusu belirtildiği gibi ben HadoopYanlış anahtar sınıfı: problem olmasıdır Metin
benim mapreduce kodunda benim türlerinde sorunu görmek için başarısız Intwritable bekleniyor ama redüktörün collector.collect içindeki bir Text nesnesini geçiriyorum.
Mesleğim yapılandırması aşağıdaki mapper çıkış sınıfları vardır:
conf.setMapOutputKeyClass(IntWritable.class);
conf.setMapOutputValueClass(IntWritable.class);
Ve aşağıdaki redüktör çıkış sınıfları:
public static class Reduce extends MapReduceBase implements Reducer<IntWritable, IntWritable, Text, IntWritable>
:
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
Benim haritalama sınıfı aşağıdaki tanıma sahip Gerekli işlevle:
public void reduce(IntWritable key, Iterator<IntWritable> values, OutputCollector<Text,IntWritable> output, Reporter reporter)
Ve sonra dediğim zaman başarısız:
output.collect(new Text(),new IntWritable());
Ben azaltmak harita için oldukça yeni ama her türlü, bu derler ama sonra söyleyerek satırda başarısız maç gibi onun bir IntWritable bekliyor küçültme sınıfının anahtarı olarak. ben burada
Hadoop'un
0.21 sürümünü kullanıyorum konularda ise benim haritası sınıftır:public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, IntWritable, IntWritable> {
private IntWritable node = new IntWritable();
private IntWritable edge = new IntWritable();
public void map(LongWritable key, Text value, OutputCollector<IntWritable, IntWritable> output, Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
node.set(Integer.parseInt(tokenizer.nextToken()));
edge.set(Integer.parseInt(tokenizer.nextToken()));
if(node.get() < edge.get())
output.collect(node, edge);
}
}
}
ve benim azaltmak sınıfı:
public static class Reduce extends MapReduceBase implements Reducer<IntWritable, IntWritable, Text, IntWritable> {
IntWritable $ = new IntWritable(Integer.MAX_VALUE);
Text keyText = new Text();
public void reduce(IntWritable key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
ArrayList<IntWritable> valueList = new ArrayList<IntWritable>();
//outputs original edge pair as key and $ for value
while (values.hasNext()) {
IntWritable value = values.next();
valueList.add(value);
keyText.set(key.get() + ", " + value.get());
output.collect(keyText, $);
}
//outputs all the 2 length pairs
for(int i = 0; i < valueList.size(); i++)
for(int j = i+1; i < valueList.size(); j++)
output.collect(new Text(valueList.get(i).get() + ", " + valueList.get(j).get()), key);
}
}
ve işim yapılandırma:
JobConf conf = new JobConf(Triangles.class);
conf.setJobName("mapred1");
conf.setMapOutputKeyClass(IntWritable.class);
conf.setMapOutputValueClass(IntWritable.class);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path("mapred1"));
JobClient.runJob(conf);
iyi görünüyor ok olmalıdır (sizin durumunuzda IntWriteable, IntWritable) aynı anahtar/değer türü yayarlar gerekir. Postayı postalayabilir, haritalayabilir ve sınıfları azaltabilir misiniz? –
Soruları harita ile güncelledim ve sınıfları azaltabilirim, ancak yeni bir veritabanı oluşturuyor ve posta sınıfının ne olduğunu bilmiyor muyum? Bunu, bu sınıfı içermediğini düşündüğüm WordCount örneğini değiştirerek yaptım. – user1084563