Hadoop - создание одного экземпляра класса для каждой функции map () внутри Mapper для определенного узла - PullRequest
1 голос
/ 24 октября 2011

У меня есть класс что-то вроде этого в Java для Hadoop MapReduce

public Class MyClass {
    public static MyClassMapper extends Mapper {
        static SomeClass someClassObj = new SomeClass();

        void map(Object Key, Text value, Context context) {
             String someText = someClassObj.getSomeThing();
        }
    }
}

Мне нужен только один экземпляр someClassObj, который будет доступен для функции map () на узел . Как этого добиться?

Пожалуйста, не стесняйтесь спрашивать, нужна ли вам дополнительная информация по этой теме.

Спасибо!

1 Ответ

4 голосов
/ 24 октября 2011

mapreduce.tasktracker.map.tasks.maximum (по умолчанию 2) контролирует максимальное количество задач карты, которые одновременно запускаются TaskTracker.Задайте для этого значения значение 1.

Каждая запускаемая задача карты является отдельной JVM.Также установите для mapreduce.job.jvm.numtasks значение от -1 до повторное использование JVM .

Приведенные выше настройки позволят всем задачам карты работать в одной JVM последовательно.Теперь необходимо сделать SomeClass одноэлементным классом .

. Это не лучшая практика, поскольку узел используется неэффективно из-за меньшего числа задач сопоставления, которые могут выполняться параллельно.Кроме того, при повторном использовании JVM нет никакой изоляции между задачами, поэтому, если будет какая-либо утечка памяти, она будет продолжаться до сбоя jvm.

...