Como soluciono problemas de uma etapa do Spark com falha no Amazon EMR?

4 minuto de leitura
0

Quero solucionar uma falha na etapa do Apache Spark no Amazon EMR.

Descrição breve

Para solucionar falhas nas etapas do Spark:

  • Para trabalhos Spark enviados com --deploy-mode client: verifique os logs da etapa para identificar a causa raiz da falha da etapa.
  • Para trabalhos Spark enviados com --deploy-mode cluster: Verifique os logs das etapas para identificar o ID da aplicação. Em seguida, verifique os logs mestres da aplicação para identificar a causa raiz da falha na etapa.

Resolução

Trabalhos no modo de cliente

Quando um trabalho Spark é implantado no modo de cliente, os logs de etapas fornecem os parâmetros da tarefa e as mensagens de erro da etapa. Esses logs são arquivados no Amazon Simple Storage Service (Amazon S3). Por exemplo:

  • s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/controller.gz: Esse arquivo contém o comando spark-submit. Verifique esse log para ver os parâmetros do trabalho.
  • s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz: Esse arquivo fornece os logs do driver. (Quando o trabalho Spark é executado no modo de cliente, o driver do Spark é executado no nó principal.)

Para encontrar a causa raiz da falha da etapa, execute os seguintes comandos para baixar os logs da etapa em uma instância do Amazon Elastic Compute Cloud (Amazon EC2). Em seguida, procure avisos e erros:

#Download the step logs:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/
#Open the step log folder:
cd s-2M809TD67U2IA/
#Uncompress the log file:
find . -type f -exec gunzip {} \;
#Get the yarn application id from the cluster mode log:
grep "Client: Application report for" * | tail -n 1
#Get the errors and warnings from the client mode log:
egrep "WARN|ERROR" *

Por exemplo, este arquivo:

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz

indica um problema de memória:

19/11/04 05:24:45 ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalArgumentException: Executor memory 134217728 must be at least 471859200. Please increase executor memory using the --executor-memory option or spark.executor.memory in Spark configuration.

Use as informações nos logs para resolver o erro.

Por exemplo, para resolver o problema de memória, envie um trabalho com mais memória de executor:

spark-submit --deploy-mode client --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar

Trabalhos no modo de cluster

1.    Verifique o log da etapa stderr para identificar o ID da aplicação associada à etapa que falhou. Os logs das etapas são arquivados no Amazon S3. Por exemplo, este log:

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz

identifica application_1572839353552_0008:

19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)

2.    Identifique os logs principais da aplicação. Quando o trabalho Spark é executado no modo de cluster, o driver do Spark é executado na aplicação principal. A aplicação principal é o primeiro contêiner executado quando o trabalho Spark é executado. Veja a seguir um exemplo de lista de logs do aplicação Spark.

Nessa lista, container_1572839353552_0008_01_000001 é o primeiro contêiner, o que significa que é a aplicação principal.

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stdout.gz

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stderr.gz

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stdout.gz

3.    Depois de identificar os logs da aplicação principal, baixe-os em uma instância do Amazon EC2. Em seguida, procure avisos e erros. Por exemplo:

#Download the Spark application logs:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/
#Open the Spark application log folder:
cd application_1572839353552_0008/
#Uncompress the log file:
find . -type f -exec gunzip {} \;
#Search for warning and errors inside all the container logs. Then, open the container logs returned in the output of this command.
egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"

Por exemplo, este log:

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz

indica um problema de memória:

19/11/04 05:24:45 ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalArgumentException: Executor memory 134217728 must be at least 471859200. Please increase executor memory using the --executor-memory option or spark.executor.memory in Spark configuration.

4.    Resolva o problema identificado nos logs. Por exemplo, para corrigir o problema de memória, envie um trabalho com mais memória de executor:

spark-submit --deploy-mode cluster --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar 1000

Informações relacionadas

Adicionar uma etapa do Spark

AWS OFICIAL
AWS OFICIALAtualizada há 3 anos