2012-07-08 102 views
0

我正在運行hadoop代碼,該代碼在作業中具有分區器類。但是,當我運行命令運行基本Hadoop代碼時出錯

hadoop jar Sort.jar SecondarySort inputdir outputdir 

我收到寫着

class KeyPartitioner not org.apache.hadoop.mapred.Partitioner. 

我已經確保了KeyPartitioner類擴展了分區程序類運行時錯誤,但爲什麼我會收到這個錯誤?

這裏是驅動程序代碼:

JobConf conf = new JobConf(getConf(), SecondarySort.class); 
    conf.setJobName(SecondarySort.class.getName()); 

    conf.setJarByClass(SecondarySort.class); 

    conf.setInputFormat(TextInputFormat.class); 
    conf.setOutputFormat(TextOutputFormat.class); 

    conf.setMapOutputKeyClass(StockKey.class); 
    conf.setMapOutputValueClass(Text.class); 

    conf.setPartitionerClass((Class<? extends Partitioner<StockKey, DoubleWritable>>) KeyPartitioner.class); 

    conf.setMapperClass((Class<? extends Mapper<LongWritable, Text, StockKey, DoubleWritable>>) StockMapper.class); 
    conf.setReducerClass((Class<? extends Reducer<StockKey, DoubleWritable, Text, Text>>) StockReducer.class); 

這裏是分區類的代碼:

public class KeyPartitioner extends Partitioner<StockKey, Text> { 

@Override 
public int getPartition(StockKey arg0, Text arg1, int arg2) { 

    int partition = arg0.name.hashCode() % arg2; 

    return partition; 
} 
} 
+0

將代碼粘貼 - 無碼那也只能是胡亂猜測。 – 2012-07-08 14:13:49

+0

向我們顯示導入列表。 – Tudor 2012-07-08 14:17:17

+0

謝謝。進口報表相應地改變爲@Tudor下面的答案。現在彈出一個新的錯誤 - >輸出目錄未在JobConf中設置。 – 2012-07-08 14:37:40

回答

1

注意,有兩個partitioners在Hadoop中:

org.apache.hadoop.mapreduce.Partitioner 
org.apache.hadoop.mapred.Partitioner 

確保您的KeyPartitioner類實現了第二個接口,而不是第一個抽象類秒。

編輯:你要設置的輸入和輸出文件夾:

FileInputFormat.addInputPath(conf, new Path(args[0])); 
FileOutputFormat.setOutputPath(conf, new Path(args[1])); 
+0

謝謝!正確更改了導入語句。現在出現一個新的錯誤: - >輸出目錄未在JobConf中設置。 – 2012-07-08 14:35:58

+1

@Ahishek Shivkumar:看我的編輯。 – Tudor 2012-07-08 15:11:50

+1

在新的['Hadoop - 權威指南'](http://shop.oreilly.com/product/0636920021773.do)中有關於新API的完整部分,本書中的示例也基於新的API。會建議拿到這本書。 – 2012-07-09 07:23:01