Como personalizar imagens do Docker - Amazon EMR

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Como personalizar imagens do Docker

Siga as etapas a seguir para personalizar as imagens do Docker para o Amazon EMR no EKS. As etapas mostram como obter uma imagem base, personalizá-la e publicá-la e enviar uma workload usando a imagem.

nota

Outras opções que você pode considerar ao personalizar imagens do Docker são a personalização para endpoints interativos, feita para garantir que tenha as dependências necessárias, ou o uso de imagens de contêiner com várias arquiteturas:

Pré-requisitos

Etapa 1: recuperar uma imagem base do Amazon Elastic Container Registry (Amazon ECR)

A imagem base contém o runtime do Amazon EMR e os conectores usados ​​para acessar outros serviços da AWS . Para a versão 6.9.0 e posteriores do Amazon EMR, você pode obter as imagens base na galeria pública do Amazon ECR. Navegue pela galeria para encontrar o link da imagem e extraia-a para seu Workspace local. Por exemplo, para a versão 7.6.0 do Amazon EMR, o docker pull comando a seguir fornece a última imagem base padrão. Você pode substituir emr-7.6.0:latest por emr-7.6.0-spark-rapids:latest para recuperar a imagem que tem o acelerador RAPIDS da Nvidia. Você também pode substituir emr-7.6.0:latest por emr-7.6.0-java11:latest para recuperar a imagem com o runtime do Java 11.

docker pull public.ecr.aws/emr-on-eks/spark/emr-7.6.0:latest

Se você desejar recuperar a imagem base para uma versão 6.9.0 ou para versões anteriores do Amazon EMR, ou se preferir recuperá-la de contas de registro do Amazon ECR em cada região, use as seguintes etapas:

  1. Escolha um URI de imagem base. O URI de imagem segue este formato, ECR-registry-account.dkr.ecr.Region.amazonaws.com/spark/container-image-tag, como demonstra o exemplo a seguir.

    895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest

    Para escolher uma imagem base em sua região, consulte Detalhes sobre como selecionar um URI de imagem base.

  2. Faça login no repositório do Amazon ECR no qual a imagem base está armazenada. Substitua 895885662937 e us-west-2 pela conta de registro do Amazon ECR e pela AWS região que você selecionou.

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com
  3. Extraia a imagem base para seu Workspace local. emr-6.6.0:latestSubstitua pela tag de imagem do contêiner que você selecionou.

    docker pull 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest

Etapa 2: personalizar uma imagem base

Siga as etapas a seguir para personalizar a imagem base extraída do Amazon ECR.

  1. Crie um novo Dockerfile em seu Workspace local.

  2. Edite o Dockerfile que você acabou de criar e adicione o conteúdo a seguir. Este Dockerfile usa a imagem de contêiner que você extraiu de 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest.

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest USER root ### Add customization commands here #### USER hadoop:hadoop
  3. Adicione comandos no Dockerfile para personalizar a imagem base. Por exemplo, adicione um comando para instalar bibliotecas Python, como demonstra o Dockerfile a seguir.

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest USER root RUN pip3 install --upgrade boto3 pandas numpy // For python 3 USER hadoop:hadoop
  4. No mesmo diretório em que o Dockerfile foi criado, execute o comando apresentado a seguir para criar a imagem do Docker. Forneça um nome para a imagem do Docker, por exemplo,emr6.6_custom.

    docker build -t emr6.6_custom .

Etapa 3: (opcional, mas recomendada) validar uma imagem personalizada

Recomendamos testar a compatibilidade da sua imagem personalizada antes de publicá-la. Você pode usar a CLI de imagem personalizada do Amazon EMR no EKS para verificar se sua imagem tem as estruturas de arquivos necessárias e as configurações corretas para a execução no Amazon EMR no EKS.

nota

A CLI de imagem personalizada do Amazon EMR no EKS não pode confirmar se sua imagem está isenta de erros. Tenha cuidado ao remover dependências das imagens base.

Siga as etapas apresentadas a seguir para validar a imagem personalizada.

  1. Faça download e instale a CLI de imagem personalizada do Amazon EMR no EKS. Para obter mais informações, consulte Amazon EMR on EKS custom image CLI Installation Guide.

  2. Execute o comando apresentado a seguir para testar a instalação.

    emr-on-eks-custom-image --version

    Confira a seguir um exemplo da saída.

    Amazon EMR on EKS Custom Image CLI Version: x.xx
  3. Execute o comando apresentado a seguir para validar a imagem personalizada.

    emr-on-eks-custom-image validate-image -i image_name -r release_version [-t image_type]
    • -i especifica o URI da imagem local que precisa ser validado. Pode ser o URI da imagem, qualquer nome ou etiqueta que você definiu para a imagem.

    • -r especifica a versão de liberação exata para a imagem base, por exemplo, emr-6.6.0-latest.

    • -t especifica o tipo de imagem. Se for uma imagem do Spark, insira spark. O valor padrão é spark. A versão atual da CLI de imagem personalizada do Amazon EMR no EKS oferece suporte somente para imagens de runtime do Spark.

    Se você executar o comando com êxito e a imagem personalizada atender a todas as configurações e estruturas de arquivos necessárias, a saída retornada exibirá os resultados de todos os testes, como demonstra o exemplo a seguir.

    Amazon EMR on EKS Custom Image Test Version: x.xx ... Checking if docker cli is installed ... Checking Image Manifest [INFO] Image ID: xxx [INFO] Created On: 2021-05-17T20:50:07.986662904Z [INFO] Default User Set to hadoop:hadoop : PASS [INFO] Working Directory Set to /home/hadoop : PASS [INFO] Entrypoint Set to /usr/bin/entrypoint.sh : PASS [INFO] SPARK_HOME is set with value: /usr/lib/spark : PASS [INFO] JAVA_HOME is set with value: /etc/alternatives/jre : PASS [INFO] File Structure Test for spark-jars in /usr/lib/spark/jars: PASS [INFO] File Structure Test for hadoop-files in /usr/lib/hadoop: PASS [INFO] File Structure Test for hadoop-jars in /usr/lib/hadoop/lib: PASS [INFO] File Structure Test for bin-files in /usr/bin: PASS ... Start Running Sample Spark Job [INFO] Sample Spark Job Test with local:///usr/lib/spark/examples/jars/spark-examples.jar : PASS ----------------------------------------------------------------- Overall Custom Image Validation Succeeded. -----------------------------------------------------------------

    Se a imagem personalizada não atender às configurações ou estruturas de arquivos necessárias, você obterá mensagens de erro. A saída retornada fornece informações sobre configurações ou estruturas de arquivos incorretas.

Etapa 4: publicar uma imagem personalizada

Publique a nova imagem do Docker no registro do Amazon ECR.

  1. Execute o comando apresentado a seguir para criar um repositório do Amazon ECR para o armazenamento da imagem do Docker. Forneça um nome para seu repositório, por exemplo,emr6.6_custom_repo. Substitua us-west-2 pela sua região.

    aws ecr create-repository \ --repository-name emr6.6_custom_repo \ --image-scanning-configuration scanOnPush=true \ --region us-west-2

    Para obter mais informações, consulte Criar um repositório no Guia do usuário do Amazon ECR.

  2. Execute o comando apresentado a seguir para realizar a autenticação em seu registro padrão.

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-west-2.amazonaws.com

    Para obter mais informações, consulte Autenticar-se no registro padrão no Guia do usuário do Amazon ECR.

  3. Faça a marcação e publique uma imagem no repositório do Amazon ECR que você criou.

    Marque a imagem.

    docker tag emr6.6_custom aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo

    Envie a imagem.

    docker push aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo

    Para obter mais informações, consulte Enviar uma imagem ao Amazon ECR no Guia do usuário do Amazon ECR.

Etapa 5: enviar uma workload do Spark no Amazon EMR usando uma imagem personalizada

Depois que uma imagem personalizada for criada e publicada, será possível enviar um trabalho do Amazon EMR no EKS usando uma imagem personalizada.

Primeiro, crie um start-job-run-request arquivo.json e especifique o spark.kubernetes.container.image parâmetro para referenciar a imagem personalizada, como demonstra o exemplo de arquivo JSON a seguir.

nota

Você pode usar o esquema local:// para se referir aos arquivos disponíveis na imagem personalizada, conforme mostrado com o argumento entryPoint no trecho de código JSON abaixo. Você também pode usar o esquema local:// para se referir às dependências da aplicação. Todos os arquivos e as dependências referenciados usando o esquema local:// já devem estar presentes no caminho especificado na imagem personalizada.

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.6.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": [ "10" ], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.kubernetes.container.image=123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo" } } }

Você também pode fazer referência à imagem personalizada com propriedades applicationConfiguration, como demonstra o exemplo a seguir.

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.6.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": [ "10" ], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi" } }, "configurationOverrides": { "applicationConfiguration": [ { "classification": "spark-defaults", "properties": { "spark.kubernetes.container.image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo" } } ] } }

Em seguida, execute o comando start-job-run para enviar o trabalho.

aws emr-containers start-job-run --cli-input-json file://./start-job-run-request.json

Nos exemplos de JSON acima, emr-6.6.0-latest substitua pela sua versão de lançamento do Amazon EMR. Recomendamos fortemente usar a versão de liberação -latest para garantir que a versão selecionada contenha as atualizações de segurança mais recentes. Para obter mais informações sobre as versões de liberação do Amazon EMR e suas etiquetas de imagem, consulte Detalhes sobre como selecionar um URI de imagem base.

nota

É possível usar spark.kubernetes.driver.container.image e spark.kubernetes.executor.container.image para especificar uma imagem diferente para pods de drivers e de executores.