He enviado una aplicación Apache Spark a un clúster de Amazon EMR. La aplicación produce un error en la fase «no queda espacio en el dispositivo» similar al siguiente: Trabajo cancelado debido a un error de fase: La tarea 31 de la etapa 8.0 falló 4 veces, el error más reciente: Se perdió la tarea 31.3 en la etapa 8.0 (TID 2036, ip-xxx-xxx-xx-xxx.compute.internal, executor 139): org.apache.spark.memory.SparkOutOfMemoryError: error while calling spill() on org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter@1a698b89 : No queda espacio en el dispositivo
Descripción breve
Spark usa discos locales en el núcleo y en los nodos de tareas para almacenar datos intermedios. Si los discos se quedan sin espacio, se produce un error en el trabajo y aparece el error «no queda espacio en el dispositivo». Utilice uno de los métodos siguientes para resolver este error:
- Añada más capacidad de Amazon Elastic Block Store (Amazon EBS).
- Añadir más particiones de Spark.
- Utilice una acción de arranque para ampliar dinámicamente el almacenamiento en los nodos central y de tareas. Para obtener más información y un ejemplo de script de acción de arranque, consulte Escalar dinámicamente el almacenamiento en los clústeres de Amazon EMR.
Resolución
Añada más capacidad de EBS
Para clústeres nuevos: utilice volúmenes de EBS más grandes
Inicie un clúster de Amazon EMR y elija un tipo de instancia de Amazon Elastic Compute Cloud (Amazon EC2) con volúmenes de EBS más grandes. Para obtener más información sobre la cantidad de almacenamiento y la cantidad de volúmenes asignados a cada tipo de instancia, consulte Almacenamiento predeterminado de Amazon EBS para instancias.
Para ejecutar clústeres: añada más volúmenes de EBS
1. Si volúmenes EBS más grandes no resuelven el problema,aadjunta más volúmenes EBS a los nodos principales y de tareas.
2. Formatee y monte los volúmenes adjuntos. Asegúrese de utilizar el número de disco correcto (por ejemplo, /mnt1 o /mnt2 en lugar de /data).
3. Conéctese al nodo mediante SSH.
4. Cree un directorio /mnt2/yarn y, a continuación, asigne la propiedad del directorio al usuario YARN:
sudo mkdir /mnt2/yarn
chown yarn:yarn /mnt2/yarn
5. Añada el directorio /mnt2/yarn dentro de la propiedad yarn.nodemanager.local-dirs de /etc/hadoop/conf/yarn-site.xml. Ejemplo:
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/mnt/yarn,/mnt1/yarn,/mnt2/yarn</value>
</property>
6. Reinicie el servicio NodeManager:
sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager
Añadir más particiones de Spark
En función del número de nodos principales y de tareas que haya en el clúster, considere aumentar el número de particiones de Spark. Use el siguiente código de Scala para añadir más particiones de Spark:
val numPartitions = 500
val newDF = df.repartition(numPartitions)
Información relacionada
¿Cómo puedo solucionar errores de fase en los trabajos de Spark en Amazon EMR?