#java #map #hadoop #mapreduce
#java #словарь #hadoop #mapreduce
Вопрос:
У меня есть класс, подобный этому, в 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:
mapreduce.tasktracker.map.tasks.maximum (значение по умолчанию равно 2) управляет максимальным количеством задач map, которые одновременно выполняются TaskTracker. Установите это значение равным 1.
Каждая запускаемая задача map представляет собой отдельную JVM. Также установите для mapreduce.job.jvm.numtasks значение -1 для повторного использования JVM.
Приведенные выше настройки позволят последовательно запускать все задачи map в одной JVM. Теперь SomeClass должен быть сделан одноэлементным классом.
Это не лучшая практика, поскольку узел неэффективно используется из-за меньшего количества задач map, которые могут выполняться параллельно. Кроме того, при повторном использовании JVM нет изоляции между задачами, поэтому, если есть какая-либо утечка памяти, она будет продолжаться до сбоя jvm.
Комментарии:
1. Довольно банально, но это правильный путь. 1
2. В принципе, пытался получить одну JVM для всех mappers в одном узле.
3. Круто! Я обязательно приму это во внимание. 1 от меня тоже.