¿Cómo puedo resolver los errores de la etapa «no queda espacio en el dispositivo» en Spark en Amazon EMR?

3 minutos de lectura
0

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?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años