Я пытаюсь создать собственный разделитель, чтобы выделить каждый уникальный ключ одному редуктору. это было после сбоя HashPartioner по умолчанию Альтернатива хэшпартионеру по умолчанию, поставляемому с hadoop
Я получаю следующую ошибку. Это как-то связано с тем, что конструктор не получает свои аргументы, насколько я могу судить по результатам некоторых исследований. но разве в этом контексте с hadoop аргументы не передаются автоматически фреймворком? Не могу найти ошибку в коде
18/04/20 17:06:51 INFO mapred.JobClient: Task Id : attempt_201804201340_0007_m_000000_1, Status : FAILED
java.lang.RuntimeException: java.lang.NoSuchMethodException: biA3pipepart$parti.<init>()
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:131)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:587)
Это мой разделитель:
public class Parti extends Partitioner<Text, Text> {
String partititonkey;
int result=0;
@Override
public int getPartition(Text key, Text value, int numPartitions) {
String partitionKey = key.toString();
if (numPartitions >= 9){
if (partitionKey.charAt(0) =='0' ){
if (partitionKey.charAt(2)=='0' )
result= 0;
else
if (partitionKey.charAt(2)=='1' )
result= 1;
else
result= 2;
}else
if (partitionKey.charAt(0)=='1'){
if (partitionKey.charAt(2)=='0' )
result= 3;
else
if (partitionKey.charAt(2)=='1' )
result= 4;
else
result= 5;
}else
if (partitionKey.charAt(0)=='2' ){
if (partitionKey.charAt(2)=='0' )
result= 6;
else
if (partitionKey.charAt(2)=='1' )
result= 7;
else
result= 8;
}
} //
else
result= 0;
return result;
}// close method
}// close class
Моя подпись картографа
public static class JoinsMap extends Mapper<LongWritable,Text,Text,Text>{
public void Map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
Моя подпись редуктора
public static class JoinsReduce extends Reducer<Text,Text,Text,Text>{
public void Reduce (Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
основной класс:
public static void main( String[] args ) throws Exception {
Configuration conf1 = new Configuration();
Job job1 = new Job(conf1, "biA3pipepart");
job1.setJarByClass(biA3pipepart.class);
job1.setNumReduceTasks(9);//***
job1.setOutputKeyClass(Text.class);
job1.setOutputValueClass(Text.class);
job1.setMapperClass(JoinsMap.class);
job1.setReducerClass(JoinsReduce.class);
job1.setInputFormatClass(TextInputFormat.class);
job1.setOutputFormatClass(TextOutputFormat.class);
job1.setPartitionerClass(Parti.class); //+++
// inputs to map.
FileInputFormat.addInputPath(job1, new Path(args[0]));
// single output from reducer.
FileOutputFormat.setOutputPath(job1, new Path(args[1]));
job1.waitForCompletion(true);
}
Ключи, выдаваемые Mapper, следующие:
0,0
0,1
0,2
1,0
1,1
1,2
2,0
2,1
2,2
а Редуктор только записывает ключи и значения, которые он получает.
Вы случайно не смешиваете два разных API-интерфейса hadoop? import org.apache.hadoop.mapred.Partitioner (более старый) vs import org.apache.hadoop.mapreduce.Partitioner; (новее) ??
весь мой импорт начинается с org.apache.hadoop.mapreduce Я использую старый API
Я добавил полный код в вопрос @ cricket_007
Я добавил полный код @ user238607
Определите разделитель как статический, точно так же, как вы это сделали для сопоставителя и редуктора. Просто предложение, которое вы можете попробовать на основе этого: stackoverflow.com/questions/11022812/…. Этот вопрос в точности похож на ваш: stackoverflow.com/questions/9437895/…
Твой БОЛЬШОЙ @ user238607 !! это сработало
Обновите свой пост с решением. Чтобы будущие читатели знали, что сработало. Люди не читают комментарии.




Решено
Я только что добавил static в свой класс Parti, например классы mapper и reducer, как было предложено в комментарии (user238607).
public static class Parti extends Partitioner<Text, Text> {
Это также сработало бы, если бы вы не использовали внутренние классы, которые не нужны
Покажите, пожалуйста, весь класс
biA3pipepart, конфигурацию задания и используйте все имена классов с заглавной буквы.