Come personalizzare le immagini Docker
Completa le fasi seguenti 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 di Amazon EMR su EKS 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)
L'immagine di base contiene il runtime Amazon EMR e i connettori utilizzati per accedere ad altri servizi AWS. Per Amazon EMR 6.9.0 e versioni successive, è possibile ottenere le immagini di base da Amazon ECR Public Gallery. Sfoglia la galleria per trovare il collegamento all'immagine e trasferiscila nel tuo Workspace locale. Ad esempio, per la versione 6.14.0 di Amazon EMR, il comando docker pull
seguente consente di ottenere l'immagine di base standard più recente. Puoi sostituire emr-6.14.0:latest
con emr-6.14.0-spark-rapids:latest
per recuperare l'immagine che dispone dell'acceleratore RAPIDS Nvidia. Puoi anche sostituire emr-6.14.0:latest
con emr-6.14.0-java11:latest
per recuperare l'immagine con runtime Java 11.
docker pull public.ecr.aws/emr-on-eks/spark/
emr-6.14.0:latest
Se desideri recuperare l'immagine di base per il rilascio 6.9.0 o precedenti di Amazon EMR o se preferisci recuperarla dagli account di registro Amazon ECR in ogni Regione, completa la procedura seguente:
-
Scegli un URI dell'immagine di base. L'URI dell'immagine presenta questo formato,
, come illustrato nell'esempio seguente.ECR-registry-account
.dkr.ecr.Region
.amazonaws.com/spark/container-image-tag
895885662937
.dkr.ecr.us-west-2
.amazonaws.com/spark/emr-6.6.0:latest
Per scegliere un'immagine di base nella tua Regione, consulta Come selezionare un URI dell'immagine di base.
-
Accedi al repository Amazon ECR in cui è memorizzata l'immagine di base. Sostituisci
895885662937
eus-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-stdin895885662937
.dkr.ecr.us-west-2
.amazonaws.com -
Estrai l'immagine di base nel Workspace locale. Sostituisci
emr-6.6.0:latest
con il tag dell'immagine di container selezionato.docker pull
895885662937
.dkr.ecr.us-west-2
.amazonaws.com/spark/emr-6.6.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.
-
Crea un nuovo
Dockerfile
nel Workspace locale. -
Modifica il
Dockerfile
appena creato e aggiungi i seguenti contenuti. QuestoDockerfile
usa l'immagine di container estratto da895885662937.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
-
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 inDockerfile
.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
-
Dalla stessa directory in cui viene creato
Dockerfile
, esegui il comando seguente per generare l'immagine Docker. Fornisci un nome per l'immagine Docker, ad esempioemr6.6_custom
.docker build -t
emr6.6_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
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.
-
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
. -
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
-
Eseguire il comando seguente per convalidare l'immagine personalizzata.
emr-on-eks-custom-image validate-image -i
image_name
-rrelease_version
[-timage_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 esempioemr-6.6.0-latest
. -
-t
specifica il tipo di immagine. Se si tratta di un'immagine Spark, inseriscispark
. Il valore predefinito è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.
-
Esegui il comando seguente per creare un repository Amazon ECR per archiviare l'immagine Docker. Fornisci un nome per il repository, ad esempio
emr6.6_custom_repo
. Sostituiscius-west-2
con la tua Regione.aws ecr create-repository \ --repository-name
emr6.6_custom_repo
\ --image-scanning-configuration scanOnPush=true \ --regionus-west-2
Per ulteriori informazioni, consulta Creazione di un repository nella Guida per l'utente di Amazon ECR.
-
Esegui il comando seguente per autenticarti nel registro di default.
aws ecr get-login-password --region
us-west-2
| docker login --username AWS --password-stdinaws_account_id
.dkr.ecr.us-west-2
.amazonaws.comPer ulteriori informazioni, consulta Autenticazione nel registro di default nella Guida per l'utente di Amazon ECR.
-
Tagga e pubblica un'immagine nel repository Amazon ECR creato.
Tagga l'immagine.
docker tag
emr6.6_custom
aws_account_id
.dkr.ecr.us-west-2
.amazonaws.com/emr6.6_custom_repo
Invia l'immagine.
docker push
aws_account_id
.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo
Per ulteriori informazioni, consulta Invio di un'immagine ad 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, puoi 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
Puoi utilizzare lo schema local://
per fare riferimento ai file disponibili nell'immagine personalizzata come mostrato con l'argomento entryPoint
nel frammento JSON riportato di seguito. È possibile utilizzare anche la schema local://
per fare riferimento alle dipendenze dell'applicazione. Tutti i file e le dipendenze a cui si fa riferimento utilizzando lo schema local://
devono essere già presenti nel percorso specificato nell'immagine personalizzata.
{ "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
" } } }
Puoi fare riferimento all'immagine personalizzata con le proprietà applicationConfiguration
come illustrato nell'esempio seguente.
{ "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
" } } ] } }
Successivamente, 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.6.0-latest
con la versione di Amazon EMR in uso. Consigliamo vivamente di utilizzare la versione -latest
per garantire che la versione selezionata contenga gli aggiornamenti di sicurezza più recenti. Per ulteriori informazioni sulle versioni di Amazon EMR e sui relativi tag di immagine, 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 di driver ed executor.
Personalizzazione delle immagini Docker per endpoint interattivi
È anche possibile personalizzare le immagini Docker per gli endpoint interattivi in modo da poter eseguire immagini kernel di base personalizzate. In questo modo puoi garantire di disporre delle dipendenze necessarie quando esegui carichi di lavoro interattivi da EMR Studio.
-
Segui le fasi da 1 a 4 descritte in precedenza per personalizzare un'immagine Docker. Per i rilasci 6.9.0 e successivi di Amazon EMR, puoi ottenere le immagini di base da Amazon ECR Public Gallery. Per le versioni precedenti ad Amazon EMR 6.9.0, puoi ottenere l'immagine negli account di Amazon ECR Registry in ciascuna Regione AWS e l'unica differenza è l'URI dell'immagine di base nel tuo Dockerfile. L'URI dell'immagine di base segue il formato:
ECR-registry-account
.dkr.ecr.Region
.amazonaws.com/notebook-spark/container-image-tag
Nell'URI dell'immagine di base è necessario utilizzare
notebook-spark
, anziché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 di immagine di container, consulta Come selezionare un URI dell'immagine di base.Nota
Attualmente sono supportate solo gli override delle immagini di base e non è supportata l'introduzione di kernel completamente nuovi di altro tipo rispetto alle immagini di base che AWS fornisce.
-
Crea un endpoint interattivo che si possa utilizzare con l'immagine personalizzata.
Innanzitutto, crea 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.6.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
" } } ] } ] } }Successivamente, crea un endpoint interattivo 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 Creazione di un endpoint interattivo per il cluster virtuale.
-
Connettiti all'endpoint interattivo attraverso EMR Studio. Per ulteriori informazioni, consulta Connessione da Studio
.
Lavorare con immagini multi-architettura
Amazon EMR su EKS supporta le immagini di container multi-architettura per Amazon Elastic Container Registry (Amazon ECR). Per ulteriori informazioni, consulta Presentazione delle immagini di container multi-architettura per Amazon ECR
Le immagini personalizzate di Amazon EMR su EKS supportano sia le istanze EC2 basate su AWS Graviton sia le istanze EC2 non basate su Graviton. Le immagini basate su Graviton vengono archiviate negli stessi repository di immagini in Amazon ECR delle immagini non basate su Graviton.
Ad esempio, per ispezionare l'elenco manifest Docker per le immagini 6.6.0, esegui il comando seguente.
docker manifest inspect 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.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" } } ] }
Completa la procedura seguente per creare immagini multi-architettura:
-
Crea un
Dockerfile
con i seguenti contenuti in modo da poter estrarre l'immaginearm64
.FROM --platform=arm64 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest USER root RUN pip3 install boto3 // install customizations here USER hadoop:hadoop
-
Segui le istruzioni riportate in Presentazione delle immagini di container multi-architettura per Amazon ECR
per creare un'immagine multi-architettura. Nota
Devi creare immagini
arm64
su istanzearm64
. Analogamente, devi creare immaginiamd64
su istanzeamd64
.Puoi anche creare immagini multi-architettura senza basarti su ogni tipo di istanza specifico utilizzando il comando Docker
buildx
. Per ulteriori informazioni, consulta Uso del supporto per l'architettura multi-CPU. -
Dopo aver creato l'immagine multi-architettura, puoi inviare un processo con lo stesso parametro
spark.kubernetes.container.image
e indirizzarlo verso l'immagine. In un cluster eterogeneo che include istanze EC2 basate suAWS Graviton e non basate su Graviton, l'istanza determina l'immagine dell'architettura corretta in base all'architettura dell'istanza che estrae tale immagine.