Uso do ajuste de escala automático vertical com o operador do Spark para Amazon EMR no EKS
A partir do Amazon EMR 7.0, você pode usar o ajuste de escala automático vertical do Amazon EMR no EKS para simplificar o gerenciamento de recursos. Ela ajusta automaticamente os recursos de memória e de CPU para se adaptar às necessidades da workload fornecida para aplicações do Spark no Amazon EMR. Para ter mais informações, consulte Uso da escalabilidade automática vertical com trabalhos do Spark no Amazon EMR.
Esta seção descreve como configurar o operador Spark para usar o ajuste de escala automático vertical.
Pré-requisitos
Antes de usar continuar, verifique se você concluiu estas configurações:
-
Siga as etapas em Configuração do operador do Spark para o Amazon EMR no EKS.
-
(Opcional) Se você instalou anteriormente uma versão mais antiga do operador do Spark, exclua o CRD SparkApplication/ScheduledSparkApplication.
kubectl delete crd sparkApplication kubectl delete crd scheduledSparkApplication
-
Siga as etapas em Instalação do operador do Spark. Na etapa 3, adicione a seguinte linha ao comando de instalação para permitir webhooks para o operador:
--set webhook.enable=true
-
Siga as etapas em Configuração da escalabilidade automática vertical para o Amazon EMR no EKS.
-
Dê acesso aos arquivos na localização do Amazon S3:
-
Anote sua conta de serviço do driver e do operador com o
JobExecutionRole
que tem as permissões do S3.kubectl annotate serviceaccount -n spark-operator emr-containers-sa-spark eks.amazonaws.com/role-arn=
JobExecutionRole
kubectl annotate serviceaccount -n spark-operator emr-containers-sa-spark-operator eks.amazonaws.com/role-arn=JobExecutionRole
-
Atualize a política de confiança do perfil de execução de trabalho nesse namespace.
aws emr-containers update-role-trust-policy \ --cluster-name cluster \ --namespace ${Namespace}\ --role-name iam_role_name_for_job_execution
-
Edite a política de confiança do perfil do IAM do perfil de execução de trabalhos e atualize a
serviceaccount
deemr-containers-sa-spark-*-*-xxxx
paraemr-containers-sa-*
.{ "Effect": "Allow", "Principal": { "Federated": "
OIDC-provider
" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "OIDC
": "system:serviceaccount:${Namespace}:emr-containers-sa-*" } } } -
Se estiver usando o Amazon S3 como armazenamento de arquivos, adicione os padrões a seguir ao arquivo YAML.
hadoopConf: # EMRFS filesystem fs.s3.customAWSCredentialsProvider: com.amazonaws.auth.WebIdentityTokenCredentialsProvider fs.s3.impl: com.amazon.ws.emr.hadoop.fs.EmrFileSystem fs.AbstractFileSystem.s3.impl: org.apache.hadoop.fs.s3.EMRFSDelegate fs.s3.buffer.dir: /mnt/s3 fs.s3.getObject.initialSocketTimeoutMilliseconds: "2000" mapreduce.fileoutputcommitter.algorithm.version.emr_internal_use_only.EmrFileSystem: "2" mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem: "true" sparkConf: # Required for EMR Runtime 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.driver.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native 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/* spark.executor.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native
-
Execute um trabalho com ajuste de escala automático vertical no operador do Spark
Antes de executar uma aplicação do Spark com o operador do Spark, conclua as etapas em Pré-requisitos.
Para usar o ajuste de escala automático vertical com o operador do Spark, adicione a seguinte configuração ao driver da especificação da aplicação do Spark para ativar o ajuste de escala automático vertical:
dynamicSizing: mode: Off signature: "my-signature"
Essa configuração permite o ajuste de escala automático vertical e é uma configuração de assinatura obrigatória que permite escolher uma assinatura para o trabalho.
Para obter mais informações sobre as configurações e os valores dos parâmetros, consulte Configuring vertical autoscaling for Amazon EMR on EKS. Por padrão, seu trabalho é enviado com a opção somente monitoramento no modo Desativado para a escalabilidade automática vertical. Esse estado de monitoramento permite calcular e visualizar recomendações de recursos sem realizar a escalabilidade automática. Para obter mais informações, consulte Vertical autoscaling modes.
O exemplo a seguir mostra um arquivo de definição SparkApplication
chamado spark-pi.yaml
com as configurações necessárias para usar ajuste de escala automático vertical.
apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi namespace: spark-operator spec: type: Scala mode: cluster image: "895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-7.3.0:latest" imagePullPolicy: Always mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar" sparkVersion: "3.4.1" dynamicSizing: mode: Off signature: "my-signature" restartPolicy: type: Never volumes: - name: "test-volume" hostPath: path: "/tmp" type: Directory driver: cores: 1 coreLimit: "1200m" memory: "512m" labels: version: 3.4.1 serviceAccount: emr-containers-sa-spark volumeMounts: - name: "test-volume" mountPath: "/tmp" executor: cores: 1 instances: 1 memory: "512m" labels: version: 3.4.1 volumeMounts: - name: "test-volume" mountPath: "/tmp"
Agora, envie a aplicação do Spark com o comando apresentado a seguir. Isso também criará um objeto SparkApplication
chamado spark-pi
:
kubectl apply -f spark-pi.yaml
Para obter mais informações sobre o envio de aplicações ao Spark usando o operador do Spark, consulte Using a SparkApplication
spark-on-k8s-operator
no GitHub.
Verificação de funcionalidade da escalabilidade automática vertical
Para verificar se a escalabilidade automática vertical está funcionando corretamente para o trabalho enviado, use kubectl para obter o recurso personalizado verticalpodautoscaler
e visualizar suas recomendações de escalabilidade.
kubectl get verticalpodautoscalers --all-namespaces \ -l=emr-containers.amazonaws.com/dynamic.sizing.signature=
my-signature
A saída desta consulta deve ser semelhante à seguinte:
NAMESPACE NAME MODE CPU MEM PROVIDED AGE
spark-operator ds-p73j6mkosvc4xeb3gr7x4xol2bfcw5evqimzqojrlysvj3giozuq-vpa Off 580026651 True 15m
Se a saída não for semelhante ou tiver um código de erro, consulte Solução de problemas de escalabilidade automática vertical do Amazon EMR no EKS para obter passos que ajudam a resolver o problema.
Para remover pods e aplicações, execute o seguinte comando:
kubectl delete sparkapplication spark-pi