Пользовательский разделитель в ошибке Hadoop java.lang.NoSuchMethodException: - <init> ()

Я пытаюсь создать собственный разделитель, чтобы выделить каждый уникальный ключ одному редуктору. это было после сбоя 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

а Редуктор только записывает ключи и значения, которые он получает.

Покажите, пожалуйста, весь класс biA3pipepart, конфигурацию задания и используйте все имена классов с заглавной буквы.

OneCricketeer 21.04.2018 00:48

Вы случайно не смешиваете два разных API-интерфейса hadoop? import org.apache.hadoop.mapred.Partitioner (более старый) vs import org.apache.hadoop.mapreduce.Partitioner; (новее) ??

user238607 21.04.2018 11:52

весь мой импорт начинается с org.apache.hadoop.mapreduce Я использую старый API

zaranaid 21.04.2018 12:00

Я добавил полный код в вопрос @ cricket_007

zaranaid 21.04.2018 12:13

Я добавил полный код @ user238607

zaranaid 21.04.2018 12:13

Определите разделитель как статический, точно так же, как вы это сделали для сопоставителя и редуктора. Просто предложение, которое вы можете попробовать на основе этого: stackoverflow.com/questions/11022812/…. Этот вопрос в точности похож на ваш: stackoverflow.com/questions/9437895/…

user238607 21.04.2018 17:40

Твой БОЛЬШОЙ @ user238607 !! это сработало

zaranaid 21.04.2018 17:56

Обновите свой пост с решением. Чтобы будущие читатели знали, что сработало. Люди не читают комментарии.

user238607 21.04.2018 18:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
337
1

Ответы 1

Решено

Я только что добавил static в свой класс Parti, например классы mapper и reducer, как было предложено в комментарии (user238607).

public static class Parti extends Partitioner<Text, Text> {

Это также сработало бы, если бы вы не использовали внутренние классы, которые не нужны

OneCricketeer 21.04.2018 22:16

Другие вопросы по теме