0

ジョブ内にパーティショナークラスを持つHadoopコードを実行しています。しかし、コマンドを実行すると

hadoop jar Sort.jar SecondarySort inputdir outputdir

次のようなランタイムエラーが発生します

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

KeyPartitionerクラスがPartitionerクラスを拡張していることを確認しましたが、なぜこのエラーが発生するのですか?

ドライバーコードは次のとおりです。

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;
}
}  
4

1 に答える 1

1

hadoop には 2 つのパーティショナーがあることに注意してください。

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

KeyPartitionerクラスが最初の抽象クラスではなく、2 番目のインターフェイスを実装していることを確認してください。

編集:入力フォルダーと出力フォルダーを設定する必要があります:

FileInputFormat.addInputPath(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
于 2012-07-08T14:19:46.170 に答える