Come personalizzare le immagini Docker - Amazon EMR

Come personalizzare le immagini Docker

Attieniti ai seguenti passaggi per personalizzare le immagini Docker per Amazon EMR su EKS.

Di seguito sono riportate altre opzioni che potresti prendere in considerazione quando personalizzi le immagini Docker:

Prerequisiti

  • Completa le fasi Configurazione per Amazon EMR su EKS.

  • Installa Docker nel tuo ambiente. Per ulteriori informazioni, consulta Ottieni Docker.

Fase 1: Recupero di un'immagine di base da Amazon Elastic Container Registry (Amazon ECR)

Attieniti alla seguente procedura per recuperare un'immagine di base di Amazon EMR su EKS da Amazon ECR. L'immagine di base contiene il runtime Amazon EMR e i connettori utilizzati per accedere ad altri servizi AWS.

  1. Scegli un URI dell'immagine di base. L'URI dell'immagine presenta questo formato, ECR-registry-account.dkr.ecr.Region.amazonaws.com/spark/container-image-tag, come illustrato nell'esempio seguente.

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

    Per scegliere un'immagine di base nella tua Regione, consulta Come selezionare un URI dell'immagine di base.

  2. Accedi al repository Amazon ECR in cui è memorizzata l'immagine di base. Sostituisci 895885662937 e us-west-2 con l'account del registro Amazon ECR e la Regione AWS selezionata.

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com
  3. Estrai l'immagine di base nel WorkSpace locale. Sostituisci emr-6.5.0:latest con il tag dell'immagine del container selezionato.

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

Fase 2: Personalizzazione di un'immagine di base

Segui le fasi seguenti per personalizzare l'immagine di base che hai estratto da Amazon ECR.

  1. Crea un nuovo Dockerfile nel WorkSpace locale.

  2. Modifica il Dockerfile appena creato e aggiungi i seguenti contenuti. Questo Dockerfile usa l'immagine del container estratto da 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest.

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest USER root ### Add customization commands here #### USER hadoop:hadoop
  3. Aggiungi comandi in Dockerfile per personalizzare l'immagine di base. Ad esempio, aggiungi un comando per installare le librerie Python, come mostrato qui di seguito in Dockerfile.

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest USER root RUN pip3 install --upgrade boto3 pandas numpy // For python 3 USER hadoop:hadoop
  4. Dalla stessa directory in cui viene creato Dockerfile, esegui il comando seguente per costruire l'immagine Docker. Fornisci un nome per l'immagine Docker, ad esempio emr6.5_custom.

    docker build -t emr6.5_custom .

Fase 3: (facoltativo ma consigliato) Convalida di un'immagine personalizzata

Si consiglia di testare la compatibilità dell'immagine personalizzata prima di pubblicarla. Puoi utilizzare la CLI di immagine personalizzata di Amazon EMR su EKS per verificare se l'immagine ha le strutture di file richieste e le configurazioni corrette per l'esecuzione su Amazon EMR su EKS.

Nota

La CLI di immagine personalizzata di Amazon EMR su EKS non può confermare che l'immagine sia priva di errori. Prestare attenzione quando si rimuovono le dipendenze dalle immagini di base.

Seguire i seguenti fasi per convalidare l'immagine personalizzata.

  1. Download e installa la CLI di immagine personalizzata di Amazon EMR su EKS. Per ulteriori informazioni, consulta Guida all'installazione della CLI di immagine personalizzata di Amazon EMR su EKS.

  2. Eseguire il comando seguente per testare l'installazione.

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

    Di seguito è illustrato un esempio di output.

    Amazon EMR on EKS Custom Image CLI Version: x.xx
  3. Eseguire il comando seguente per convalidare l'immagine personalizzata.

    emr-on-eks-custom-image validate-image -i image_name -r release_version [-t image_type]
    • -i specifica l'URI dell'immagine locale che deve essere convalidato. Questo può essere l'URI dell'immagine, qualsiasi nome o tag definito per l'immagine.

    • -r specifica la versione di rilascio esatta per l'immagine di base, ad esempio emr-6.5.0-latest.

    • -t specifica il tipo di immagine. Se si tratta di un'immagine Spark, inserisci spark. Il valore di default è spark. L'attuale versione CLI per immagine personalizzata di Amazon EMR su EKS supporta solo le immagini runtime Spark.

    Se si esegue correttamente il comando e l'immagine personalizzata soddisfa tutte le configurazioni e le strutture di file richieste, l'output restituito visualizza i risultati di tutti i test, come dimostra l'esempio seguente.

    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 l'immagine personalizzata non soddisfa le configurazioni o le strutture di file richieste, si verificano messaggi di errore. L'output restituito fornisce informazioni sulle configurazioni o sulle strutture di file errate.

Fase 4: Pubblicazione di un'immagine personalizzata

Pubblica la nuova immagine Docker nel registro Amazon ECR.

  1. Esegui il comando seguente per creare un repository Amazon ECR per archiviare l'immagine Docker. Fornisci un nome per il repository, ad esempio emr6.5_custom_repo. Sostituisci us-west-2 con la tua Regione.

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

    Per ulteriori informazioni, consulta Creazione di un repository nella Guida per l'utente di Amazon ECR.

  2. Esegui il comando seguente per autenticarti nel registro di default.

    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

    Per ulteriori informazioni, consulta Autenticazione nel registro di default nella Guida per l'utente di Amazon ECR.

  3. Tagga e pubblica un'immagine nel repository Amazon ECR creato.

    Tagga l'immagine.

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

    Inviare l'immagine.

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

    Per ulteriori informazioni, consulta Pubblicazione di un'immagine su Amazon ECR nella Guida per l'utente di Amazon ECR.

Fase 5: Invio di un carico di lavoro Spark in Amazon EMR utilizzando un'immagine personalizzata

Dopo aver creato e pubblicato un'immagine personalizzata, è possibile inviare un processo Amazon EMR su EKS utilizzando un'immagine personalizzata.

Innanzitutto, crea un file start-job-run-request.json e specifica il parametro spark.kubernetes.container.image per fare riferimento all'immagine personalizzata, come illustrato nel seguente file JSON di esempio.

Nota

È possibile utilizzare la schema local:// per fare riferimento ai file disponibili nell'immagine personalizzata come mostrato con argomento entryPoint nello snippet JSON qui sotto. È possibile utilizzare anche la schema local:// per fare riferimento alle dipendenze dell'applicazione. Tutti i file e le dipendenze a cui si fa riferimento al utilizzo di schema local:// deve essere già presente nel percorso specificato nell'immagine personalizzata.

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.5.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.5_custom_repo" } } }

È anche possibile fare riferimento all'immagine personalizzata utilizzando le proprietà applicationConfiguration come illustrato nell'esempio seguente.

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.5.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.5_custom_repo" } } ] } }

Poi, esegui il comando start-job-run per inviare il processo.

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

Negli esempi JSON sopra riportati, sostituisci emr-6.5.0-latest con la versione di Amazon EMR in uso. Si consiglia fortemente di utilizzare la versione -latest per assicurarsi che la versione selezionata contenga gli aggiornamenti di sicurezza più recenti. Per ulteriori informazioni sulle versioni di Amazon EMR e sui tag immagine corrispondenti, consulta Come selezionare un URI dell'immagine di base.

Nota

È possibile utilizzare spark.kubernetes.driver.container.image e spark.kubernetes.executor.container.image per specificare un'immagine diversa per i pod driver ed executor.

Personalizzare le immagini Docker per endpoint gestiti

Puoi anche personalizzare le immagini Docker per gli endpoint gestiti, in modo da poter eseguire immagini kernel personalizzate e assicurarti di avere le dipendenze necessarie quando esegui carichi di lavoro interattivi da EMR Studio.

  1. Segui i passaggi da 1 a 4 precedentemente descritti per personalizzare un'immagine Docker. L'unica differenza è l'URI dell'immagine di base nel proprio Dockerfile. L'URI dell'immagine di base segue questo formato: ECR-registry-account.dkr.ecr.Region.amazonaws.com/notebook-spark/container-image-tag. Nell'URI dell'immagine di base è necessario utilizzare notebook-spark, invece di spark. L'immagine di base contiene il runtime Spark e i kernel del notebook che vengono eseguiti con esso. Per ulteriori informazioni sulla selezione delle Regioni e dei tag immagine del container, consulta Come selezionare un URI dell'immagine di base.

    Nota

    Attualmente sono supportate solo le sovrascrizioni delle immagini di base e non è supportata l'introduzione di kernel completamente nuovi, di altri tipi, diversi dalle immagini di base che AWS fornisce.

  2. Creare un endpoint gestito che può essere utilizzato con l'immagine personalizzata.

    Innanzitutto, creare un file JSON denominato custom-image-managed-endpoint.json con i seguenti contenuti.

    { "name": "endpoint-name", "virtualClusterId": "virtual-cluster-id", "type": "JUPYTER_ENTERPRISE_GATEWAY", "releaseLabel": "emr-6.5.0-latest", "executionRoleArn": "execution-role-arn", "certificateArn": "certificate-arn", "configurationOverrides": { "applicationConfiguration": [ { "classification": "jupyter-kernel-overrides", "configurations": [ { "classification": "python3", "properties": { "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-python:latest" } }, { "classification": "spark-python-kubernetes", "properties": { "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-spark:latest" } } ] } ] } }

    Quindi crea un endpoint gestito utilizzando le configurazioni specificate nel file JSON, come dimostrato nell'esempio seguente.

    aws emr-containers create-managed-endpoint --cli-input-json custom-image-managed-endpoint.json

    Per ulteriori informazioni, consulta Creare un endpoint gestito per il proprio cluster virtuale.

  3. Connettiti all'endpoint gestito tramite EMR Studio. Per ulteriori informazioni, consulta Connessione da Studio.

Lavorare con immagini multi-architettura

Amazon EMR su EKS supporta le immagini dei container multi-architettura per Amazon Elastic Container Registry (Amazon ECR). Per ulteriori informazioni, consulta Presentazione di immagini container multi-architettura per Amazon ECR.

Le immagini personalizzate Amazon EMR su EKS supportano sia le istanze EC2 basate su Graviton che le istanze EC2 non basate su Graviton. Le immagini basate su Graviton, proprio come quelle non basate su Graviton, vengono archiviate negli stessi repository di immagini in Amazon ECR.

Ad esempio, per ispezionare l'elenco manifest Docker per le immagini 6.5.0, esegui il comando seguente.

docker manifest inspect 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest

Ecco l'output. L'architettura arm64 è per un'istanza Graviton. Quella amd64 è per un'istanza non Graviton.

{ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1805, "digest": "xxx123:6b971cb47d11011ab3d45fff925e9442914b4977ae0f9fbcdcf5cfa99a7593f0", "platform": { "architecture": "arm64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1805, "digest": "xxx123:6f2375582c9c57fa9838c1d3a626f1b4fc281e287d2963a72dfe0bd81117e52f", "platform": { "architecture": "amd64", "os": "linux" } } ] }

Eseguire la procedura seguente per creare immagini multi-architettura:

  1. Creare un Dockerfile con i seguenti contenuti in modo da poter estrarre un'immagine arm64.

    FROM --platform=arm64 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest USER root RUN pip3 install boto3 // install customizations here USER hadoop:hadoop
  2. Seguire le istruzioni riportate in Presentazione di immagini container multi-architettura per Amazon ECR per creare un'immagine multi-architettura.

    Nota

    Le immagini arm64 devono essere create su istanze arm64. Allo stesso modo, le immagini amd64 devono essere create su istanze arm64.

    Inoltre, è possibile creare immagini multi-architettura senza basarsi su ogni tipo di istanza specifico utilizzando il comando Docker buildx. Per ulteriori informazioni, consulta Avvalersi del supporto per l'architettura multi-CPU.

  3. Dopo aver creato l'immagine multi-architettura, puoi inviare un lavoro utilizzando lo stesso parametro spark.kubernetes.container.image e puntando all'immagine. In un cluster eterogeneo che include istanze EC2 basate su Graviton e non basate su Graviton, l'istanza determina l'immagine dell'architettura corretta in base all'architettura dell'istanza che estrae quell'immagine.