Estoy intentando ejecutar un trabajo de alta memoria en un clúster de Hadoop (0.20.203). Modifiqué mapred-site.xml para aplicar algunos límites de memoria.Especificación de límites de memoria con hadoop
<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>
En mi trabajo, estoy especificando la cantidad de memoria que necesitaré. Desafortunadamente, aunque estoy ejecutando mi proceso con -Xmx2g
(el trabajo funcionará bien con esta cantidad de memoria como una aplicación de consola) necesito solicitar mucha más memoria para mi mapeador (como una subversión, ¿por qué es esto?) O es delicado.
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");
El reductor apenas necesita memoria ya que estoy realizando un reductor de identidad.
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)
}
}
}
Sin embargo, el reductor sigue usando mucha memoria. ¿Es posible darle al reductor diferentes argumentos de JVM que el asignador? Hadoop mata el reductor y afirma que está utilizando 3960 MB de memoria. Y los reductores terminan fallando el trabajo. ¿Cómo es esto posible?
TaskTree [pid=10282,tipID=attempt_201111041418_0005_r_000000_0] is running beyond memory-limits.
Current usage : 4152717312bytes.
Limit : 1073741824bytes.
Killing task.
ACTUALIZACIÓN: aun cuando especifico un trabajo en streaming con cat
como el asignador y uniq
como el reductor y -Xms512M -Xmx1g -XX:+UseSerialGC
mis tareas se hacen cargo de 2g memoria virtual! Esto parece extravagante a 4 veces el tamaño máximo de almacenamiento dinámico.
TaskTree [pid=3101,tipID=attempt_201111041418_0112_m_000000_0] is running beyond memory-limits.
Current usage : 2186784768bytes.
Limit : 2147483648bytes.
Killing task.
Actualización: el original JIRA para cambiar el formato de configuración para el uso de la memoria menciona específicamente que los usuarios de Java son en su mayoría interesados en la memoria física para prevenir latigazos. Creo que esto es exactamente lo que quiero: no quiero que un nodo haga girar un mapper si no hay memoria física disponible. Sin embargo, todas estas opciones parecen haberse implementado como restricciones de memoria virtual, que son difíciles de administrar.
Simplemente curioso: ¿cuál es la diferencia entre establecer la memoria máxima usando mapred.child.java.opts/-Xmx y mapred.job.map.memory.mb/mapred.job.reduce.memory.mb? He planteado una consulta en SO (http://goo.gl/aIBLr), pero no hay respuesta. –