Global outage event
If you're experiencing issues with your AWS services, then please refer to the AWS Health Dashboard. You can find the overall status of ongoing outages, the health of AWS services, and the latest updates from AWS engineers.
Como resolvo o erro "java.lang.ClassNotFoundException" no Spark no Amazon EMR?
Quero resolver o erro "java.lang.ClassNotFoundException" no Apache Spark no Amazon EMR.
Breve descrição
O erro java.lang.ClassNotFoundException no Spark ocorre pelos seguintes motivos:
- O trabalho spark-submit não consegue encontrar os arquivos relevantes no caminho de classe.
- Uma ação de bootstrap ou configuração personalizada está substituindo os caminhos de classe. Como resultado, o carregador de classes coleta somente os arquivos JAR que existem no local que você especificou na sua configuração.
Resolução
Para resolver o erro java.lang.ClassNotFoundException, verifique o rastreamento de pilha para encontrar o nome da classe ausente. Em seguida, adicione o caminho do seu JAR personalizado que contém a classe ausente ao caminho de classes do Spark. É possível adicionar o caminho do seu JAR personalizado em um cluster em execução, em um novo cluster ou ao enviar um trabalho.
Adicione seu caminho JAR personalizado em um cluster em execução
Em /etc/spark/conf/spark-defaults.conf, adicione o caminho do seu JAR personalizado aos nomes das classes especificados no rastreamento da pilha de erros.
Exemplo:
sudo vim /etc/spark/conf/spark-defaults.conf spark.driver.extraClassPath <other existing jar locations>:example-custom-jar-path spark.executor.extraClassPath <other existing jar locations>:example-custom-jar-path
Observação: substitua example-custom-jar-path pelo seu caminho JAR personalizado.
Adicione seu caminho JAR personalizado em um novo cluster
Para adicionar seu caminho JAR personalizado aos caminhos de classe existentes em /etc/spark/conf/spark-defaults.conf, forneça um objeto de configuração ao criar um cluster novo. Use as versões 5.14.0 ou posteriores do Amazon EMR para criar um novo cluster.
No Amazon EMR 5.14.0 ao Amazon EMR 5.17.0, inclua o seguinte:
[ { "Classification": "spark-defaults", "Properties": { "spark.driver.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*", "spark.executor.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*" } } ]
No Amazon EMR 5.17.0 ao Amazon EMR 5.18.0, inclua /usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar como o caminho JAR adicional:
[ { "Classification": "spark-defaults", "Properties": { "spark.driver.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/extrajars/*", "spark.executor.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/extrajars/*" } } ]
No Amazon EMR 5.19.0 ao Amazon EMR 5.32.0, atualize o caminho do JAR da seguinte forma:
[ { "Classification": "spark-defaults", "Properties": { "spark.driver.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/goodies/lib/emr-spark-goodies.jar:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/extrajars/*", "spark.executor.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/goodies/lib/emr-spark-goodies.jar:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/extrajars/*" } } ]
No Amazon EMR 5.33.0 ao Amazon EMR 5.36.0, atualize o caminho do JAR da seguinte forma:
[ { "Classification": "spark-defaults", "Properties": { "spark.driver.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/goodies/lib/emr-spark-goodies.jar:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/extrajars/", "spark.executor.extraClassPath": "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/goodies/lib/emr-spark-goodies.jar:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/extrajars/" } } ]
Nas versões 6.0.0 e posteriores do Amazon EMR, não é possível usar a configuração para atualizar o caminho JAR porque o arquivo conf inclui vários caminhos JAR. Além disso, o tamanho de cada configuração de propriedade que você atualiza não pode exceder 1.024 caracteres. Para passar a localização do JAR personalizado para spark-defaults.conf, adicione uma ação de bootstrap. Para obter mais informações, consulte Como atualizar todos os nós do Amazon EMR após a ação de bootstrap?
Para adicionar uma ação de bootstrap, consulte Adicionar ações de bootstrap personalizadas e, em seguida, realize as seguintes ações:
- Substitua s3://example-bucket/Bootstraps/script_b.sh pelo seu caminho do Amazon Simple Storage Service (Amazon S3).
- Substitua /home/hadoop/extrajars/* pelo caminho do seu arquivo JAR personalizado.
- Confirme se o perfil runtime do Amazon EMR tem as permissões necessárias para acessar o bucket do Amazon S3.
Observação: quando você adiciona o script de bootstrap, o script se aplica à configuração do Spark do cluster em vez de a um trabalho específico.
Exemplo de script para alterar /etc/spark/conf/spark-defaults.conf:
#!/bin/bash # # This is an example of script_b.sh for changing /etc/spark/conf/spark-defaults.conf # while [ ! -f /etc/spark/conf/spark-defaults.conf ] do sleep 1 done # # Now the file is available, do your work here # sudo sed -i '/spark.*.extraClassPath/s/$/:\/home\/hadoop\/extrajars\/\*/' /etc/spark/conf/spark-defaults.conf exit 0 Launch the EMR cluster and add a bootstrap action similar to the following: #!/bin/bash pwd aws s3 cp s3://example-bucket/Bootstraps/script_b.sh . chmod +x script_b.sh nohup ./script_b.sh &
Observação: substitua example-bucket pelo seu bucket do Amazon S3.
Adicione seu caminho JAR personalizado ao enviar um trabalho
Para adicionar seu caminho JAR personalizado ao enviar um trabalho, execute o comando spark-submit com a opção jars. Para obter mais informações, consulte Launching applications with spark-submit (Execução de aplicações com spark-submit) no site do Apache Spark.
spark-submit --deploy-mode client --class org.apache.spark.examples.SparkPi --master yarn spark-examples.jar 100 --jars example-custom-jar-path
Observação: substitua example-custom-jar-path pelo seu caminho JAR personalizado. Para evitar conflitos de classe, não inclua JARs padrão ao usar a opção jars. Por exemplo, não inclua spark-core.jar porque ele já existe no cluster. Para obter mais informações, consulte Configurar o Spark.
Informações relacionadas
Spark configuration (Configuração do Spark) no site do Apache Spark
- Tópicos
- Analytics
- Tags
- Amazon EMR
- Idioma
- Português
Vídeos relacionados


Conteúdo relevante
- feita há 8 meses
- feita há um ano
- feita há 7 meses