Como posso acessar os logs do driver do Spark em um cluster do Amazon EMR?

4 minuto de leitura
0

Quero solucionar problemas de um aplicativo Apache Spark. Como faço para acessar os logs do driver do Spark em um cluster do Amazon EMR?

Breve descrição

No Amazon EMR, o Spark é executado como um aplicativo YARN e é compatível com dois modos de implantação:

  • Modo cliente: esse é o modo de implantação padrão. No modo cliente, o driver do Spark é executado no host em que o comando spark-submit é executado.
  • Modo de cluster: o driver do Spark é executado no aplicativo mestre. O aplicativo mestre é o primeiro contêiner executado quando o trabalho do Spark é executado.

Resolução

Trabalhos no modo cliente

Quando você envia um aplicativo Spark executando spark-submit com o cliente --deploy-mode no nó principal, os logs do driver são exibidos na janela do terminal. O Amazon EMR não arquiva esses logs por padrão. Para capturar os logs, salve a saída do comando spark-submit em um arquivo. Exemplo:

$ spark-submit [--deploy-mode client] ... 1>output.log 2>error.log

Ao enviar um aplicativo do Spark usando uma etapa do Amazon EMR, os logs do driver são arquivados no arquivo stderr.gz no Amazon Simple Storage Service (Amazon S3). O caminho do arquivo é semelhante ao seguinte:

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

Para obter mais informações, consulte Exibir arquivos de log arquivados no Amazon S3.

Faça o download dos logs de etapas em uma instância do Amazon Elastic Compute Cloud (Amazon EC2) e, em seguida, pesquise avisos e erros:

1.    Baixe os logs de etapas:

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

2.    Abra a pasta de logs de etapas:

cd s-2M809TD67U2IA/

3.    Descompacte o arquivo de log:

find . -type f -exec gunzip {} \;

4.    Obtenha o ID do aplicativo YARN do log do modo de cluster:

grep "Client: Application report for" * | tail -n 1

5.    Encontre erros e avisos no log do modo cliente:

egrep "WARN|ERROR" *

Também é possível enviar um aplicativo Spark usando um aplicativo como JupyterHub, Apache Livy ou Apache Zeppelin. Esses aplicativos se tornam o cliente que envia o aplicativo Spark ao cluster. Nesse cenário, os logs do driver são armazenados nos logs do aplicativo correspondente, na pasta /mnt/var/log/ no nó principal. Você também pode encontrar os logs compactados no seguinte caminho do Amazon S3:

s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/

Por exemplo, se você estiver usando o Zeppelin, poderá encontrar os logs do driver do Spark em /mnt/var/log/zeppelin/zeppelin-interpreter-spark-xxxxxxxxxx.log.

Observação: no Jupyter, os logs do driver são armazenados nos logs do Livy: /mnt/var/log/livy/livy-livy-server.out.

Para obter mais informações sobre como acessar logs específicos do aplicativo, consulte Exibir arquivos de log arquivados no Amazon S3.

Trabalhos no modo de cluster

Quando você envia o aplicativo Spark no modo de cluster, o processo do driver é executado no contêiner mestre do aplicativo. O aplicativo mestre é o primeiro contêiner executado quando o aplicativo Spark é executado. O cliente registra o relatório do aplicativo YARN. Para obter os logs do driver:

1.    Obtenha o ID do aplicativo nos logs do cliente. No exemplo a seguir, application_1572839353552_0008 é o ID do aplicativo.

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

2.    Identifique os logs do contêiner mestre do aplicativo. Veja a seguir um exemplo de lista de logs do aplicativo Spark. Nessa lista, container_1572839353552_0008_01_000001 é o primeiro contêiner, o que significa que é o contêiner mestre do aplicativo.

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.    Faça o download dos logs do contêiner mestre do aplicativo em uma instância do EC2:

aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/

4.    Abra a pasta de log do aplicativo Spark:

cd application_1572839353552_0008/

5.    Descompacte o arquivo de log:

find . -type f -exec gunzip {} \;

6.    Pesquise erros e avisos em todos os logs do contêiner:

egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"

7.    Abra os logs do contêiner que são retornados na saída do comando anterior.

Em um cluster em execução, você pode usar a CLI do YARN para obter os logs do contêiner do aplicativo YARN. Para um aplicativo Spark enviado no modo de cluster, você pode acessar os logs do driver do Spark extraindo os logs do contêiner mestre do aplicativo da seguinte forma:

# 1. Get the address of the node that the application master container ran on
$ yarn logs -applicationId application_1585844683621_0001 | grep  'Container: container_1585844683621_0001_01_000001'

20/04/02 19:15:09 INFO client.RMProxy: Connecting to ResourceManager at ip-xxx-xx-xx-xx.us-west-2.compute.internal/xxx.xx.xx.xx:8032
Container: container_1585844683621_0001_01_000001 on ip-xxx-xx-xx-xx.us-west-2.compute.internal_8041

# 2. Use the node address to pull the container logs
$ yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-xxx-xx-xx-xx.us-west-2.compute.internal

Informações relacionadas

Solucionar problemas de cluster

Configurar o Spark

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos