Como resolver falhas de estágio de “não há mais espaço no dispositivo” no Spark no Amazon EMR?
Enviei uma aplicação do Apache Spark para um cluster do Amazon EMR. A aplicação apresenta uma falha de estágio “sem espaço no dispositivo” semelhante à seguinte: Trabalho abortado devido a uma falha de estágio: A tarefa 31 no estágio 8.0 falhou 4 vezes, falha mais recente: Tarefa perdida 31.3 no estágio 8.0 (TID 2036, ip-xxx-xxx-xx-xxx.compute.internal, executor 139): org.apache.spark.memory.SparkOutOfMemoryError: erro ao chamar spill() em org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter@1a698b89 : Não há mais espaço no dispositivo
Breve descrição
O Spark usa discos locais nos nós principais e de tarefas para armazenar dados intermediários. Se os discos ficarem sem espaço, a tarefa falhará com o erro “não há mais espaço no dispositivo”. Use um dos métodos a seguir para resolver esse erro:
- Adicione mais capacidade do Amazon Elastic Block Store (Amazon EBS).
- Adicione mais partições do Spark.
- Use uma ação de bootstrap para aumentar a escala verticalmente do armazenamento nos nós principais e de tarefas de forma dinâmica. Para obter mais informações e um exemplo de script de ação de bootstrap, consulte Aumentar a escala verticalmente do armazenamento em clusters do Amazon EMR de forma dinâmica.
Resolução
Adicione mais capacidade do EBS
Para novos clusters: use volumes maiores do EBS
Inicie um cluster do Amazon EMR e escolha um tipo de instância do Amazon Elastic Compute Cloud (Amazon EC2) com volumes maiores do EBS. Para obter mais informações sobre a quantidade de armazenamento e o número de volumes alocados para cada tipo de instância, consulte Armazenamento padrão do Amazon EBS para instâncias.
Para clusters em execução: adicione mais volumes do EBS
1. Se volumes maiores do EBS não resolverem o problema, conecte mais volumes do EBS aos nós principais e de tarefas.
2. Formate e monte os volumes anexados. Certifique-se de usar o número de disco correto (por exemplo, /mnt1 ou /mnt2 em vez de /data).
3. Conecte-se ao nó usando SSH.
4. Crie um diretório /mnt2/yarn e, em seguida, defina a propriedade do diretório para o usuário do YARN:
sudo mkdir /mnt2/yarn chown yarn:yarn /mnt2/yarn
5. Adicione o diretório /mnt2/yarn dentro da propriedade yarn.nodemanager.local-dirs de /etc/hadoop/conf/yarn-site.xml. Exemplo:
<property> <name>yarn.nodemanager.local-dirs</name> <value>/mnt/yarn,/mnt1/yarn,/mnt2/yarn</value> </property>
6. Reinicie o serviço NodeManager:
sudo stop hadoop-yarn-nodemanager sudo start hadoop-yarn-nodemanager
Adicione mais partições do Spark
Dependendo de quantos nós principais e de tarefas estão no cluster, considere aumentar o número de partições do Spark. Use o seguinte código Scala para adicionar mais partições do Spark:
val numPartitions = 500 val newDF = df.repartition(numPartitions)
Informações relacionadas
Como solucionar falhas de etapa em trabalhos do Spark no Amazon EMR?
Conteúdo relevante
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 24 dias