Hadoop использует один экземпляр для каждого картографа

Я использую уменьшение карты Hadoop для анализа XML-файлов. Итак, у меня есть класс с именем Parser, который может иметь метод parse() для анализа файлов xml. И поэтому я должен использовать его в функции Mapper map().

Однако это означает, что каждый раз, когда я хочу вызвать Parser, мне нужно создать экземпляр Parser. Но этот экземпляр должен быть одинаковым для каждого задания карты. Итак, мне интересно, могу ли я просто создать экземпляр этого Parser только один раз?

И еще один дополнительный вопрос, почему класс Mapper всегда статичен?


person Elona Mishmika    schedule 31.05.2016    source источник
comment
В распределенной вычислительной среде совместное использование экземпляров переменной невозможно... Также не уверен, что Mapper всегда статичен. Где ты это видишь?   -  person OneCricketeer    schedule 31.05.2016
comment
Сотрите это второе утверждение... Недавно я не писал mapreduce, но вот объяснение stackoverflow.com/questions/11570674/   -  person OneCricketeer    schedule 31.05.2016
comment
В этом примере кода Mapper является статическим классом. ссылка   -  person Elona Mishmika    schedule 31.05.2016
comment
+1 крикет_007. Не обязательно быть статическим (кроме внутреннего класса). выше ссылка от cricket_007 описывает При объявлении классов преобразователя и редуктора в качестве внутренних классов для другого класса они должны быть объявлены статическими, чтобы они не зависели от родительского класса. @Yilinkg Liu: В вашем примере также ваш класс WordCount2 является драйвером, в который вложены все остальные классы. Разве это не так?   -  person Ram Ghadiyaram    schedule 31.05.2016
comment
обновил мой ответ. Пожалуйста, проверьте это   -  person Ram Ghadiyaram    schedule 31.05.2016
comment
Mapper и Reducer должны быть статическими, если только они не вложены в программу драйвера, прежде всего потому, что метод main является статическим. Я был прав, что они не всегда статичны, так как вы можете написать MyMapper.java, MyReducer.java и MyDriver.java, и ни один из них не содержит статических классов.   -  person OneCricketeer    schedule 31.05.2016
comment
Ответ был полезен, чтобы подписать это?   -  person Ram Ghadiyaram    schedule 02.06.2016


Ответы (1)


Чтобы обеспечить один экземпляр парсера для каждого Mapper , используйте метод установки картографов для создания экземпляра вашего парсера и очистки с помощью метода очистки.

То же самое мы применили для парсера protobuf, который у нас был, но нужно убедиться, что ваш экземпляр парсера является потокобезопасным и не имеет общих данных. Примечание: метод установки и очистки будет вызываться только один раз для каждого преобразователя, поэтому мы можем инициализировать там частные переменные. Чтобы пояснить, что cricket_007 сказал в "В распределенной вычислительной среде совместное использование экземпляров переменной невозможно..."

вместо этого у нас есть практика повторного использования записываемых классов создания новых записываемых файлов каждый раз, когда нам нужно. мы можем создать экземпляр один раз и переустановить перезаписываемые несколько раз, как описано в Совете 6 Аналогичным образом объекты парсера также можно использовать повторно (стиль Совет-6). как описано в приведенном ниже коде. Например:

private YourXMLParser xmlParser = null;
    @Override
        protected void setup(Context context) throws IOException, InterruptedException {
            super.setup(context);
            xmlParser= new YourXMLParser();        
        }

     @Override
        protected void cleanup(Mapper<ImmutableBytesWritable, Result, NullWritable, Put>.Context context) throws IOException,
                        InterruptedException {
            super.cleanup(context);
                  xmlParser= null;
    }
person Ram Ghadiyaram    schedule 31.05.2016