Задание пределов памяти с помощью hadoop - PullRequest
9 голосов
/ 05 ноября 2011

Я пытаюсь запустить задание с высокой памятью в кластере Hadoop (0.20.203).Я изменил mapred-site.xml, чтобы применить некоторые ограничения памяти.

  <property>
    <name>mapred.cluster.max.map.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapred.cluster.max.reduce.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapred.cluster.map.memory.mb</name>
    <value>2048</value>
  </property>
  <property>
    <name>mapred.cluster.reduce.memory.mb</name>
    <value>2048</value>
  </property>

В своей работе я указываю, сколько памяти мне понадобится.К сожалению, даже несмотря на то, что я запускаю свой процесс с -Xmx2g (задание будет отлично работать с таким большим количеством памяти, как консольное приложение), мне нужно запросить гораздо больше памяти для моего преобразователя (в качестве подзапроса, почему это так?) Илион убит.

val conf = new Configuration()
conf.set("mapred.child.java.opts", "-Xms256m -Xmx2g -XX:+UseSerialGC");
conf.set("mapred.job.map.memory.mb", "4096");
conf.set("mapred.job.reduce.memory.mb", "1024");

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

  class IdentityReducer[K, V] extends Reducer[K, V, K, V] {
    override def reduce(key: K,
        values: java.lang.Iterable[V],
        context:Reducer[K,V,K,V]#Context) {
      for (v <- values) {
        context write (key, v)
      }
    }
  }

Однако редуктор все еще использует много памяти.Можно ли дать редуктору другие аргументы JVM, чем мапперу?Hadoop убивает редуктор и утверждает, что использует 3960 МБ памяти!И редукторы заканчивают тем, что терпели неудачу работу.Как это возможно?

TaskTree [pid=10282,tipID=attempt_201111041418_0005_r_000000_0] is running beyond memory-limits.
Current usage : 4152717312bytes.
Limit : 1073741824bytes.
Killing task.

ОБНОВЛЕНИЕ: даже когда я указываю потоковое задание с cat в качестве преобразователя и uniq в качестве преобразователя и -Xms512M -Xmx1g -XX:+UseSerialGC, мои задачи занимают 2 г виртуальной памяти!Это кажется экстравагантным при 4-кратном максимальном размере кучи.

TaskTree [pid=3101,tipID=attempt_201111041418_0112_m_000000_0] is running beyond memory-limits.
Current usage : 2186784768bytes.
Limit : 2147483648bytes.
Killing task.

Обновление: оригинальная JIRA для изменения формата конфигурации для использования памяти, в частности упоминается, что пользователи Java больше всего заинтересованы в физической памяти дляпредотвратить побои.Я думаю, что это именно то, что я хочу: я не хочу, чтобы узел раскручивал маппер, если имеется недостаточно физической памяти.Однако все эти параметры, по-видимому, реализованы как ограничения виртуальной памяти, которыми трудно управлять.

1 Ответ

6 голосов
/ 15 ноября 2011

Проверьте свой ulimit. Начиная с Cloudera , на версии 0.20.2, но аналогичная проблема, вероятно, относится к более поздним версиям:

... если вы установите mapred.child.ulimit, важно, чтобы он был больше чем в два раза больше значения размера кучи, установленного в mapred.child.java.opts. За Например, если вы установили кучу 1 ГБ, установите для mapred.child.ulimit значение 2,5 ГБ. ребенок процессы теперь гарантированно разветвляются хотя бы один раз, а разветвление на мгновение требует вдвое больше нагрузки на виртуальную память.

Также возможно, что программная установка mapred.child.java.opts "слишком поздняя"; Вы можете убедиться, что он действительно вступает в силу, и, если нет, поместить его в свой mapred-site.xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...