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