Configuración de Docker para su uso con clústeres de Amazon EMR - Amazon EMR

Configuración de Docker para su uso con clústeres de Amazon EMR

Amazon EMR 6.x es compatible con Hadoop 3, que permite que YARN NodeManager lance contenedores, ya sea directamente en el clúster de Amazon EMR o bien dentro de un contenedor de Docker. Los contenedores de Docker proporcionan entornos de ejecución personalizados en los que se ejecuta el código de aplicación. El entorno de ejecución personalizado está aislado del entorno de ejecución de YARN NodeManager y otras aplicaciones.

Los contenedores de Docker pueden incluir bibliotecas especiales utilizadas por la aplicación y proporcionar diferentes versiones de las herramientas y las bibliotecas nativas, como R y Python. Puede utilizar las herramientas de Docker conocidas para definir dependencias en tiempo de ejecución y bibliotecas para sus aplicaciones.

Los clústeres de Amazon EMR 6.x se han configurado de forma predeterminada para permitir que las aplicaciones de YARN, como Spark, se ejecuten utilizando contenedores de Docker. Para personalizar la configuración del contenedor, edite las opciones de soporte de Docker definidas en los archivos container-executor.cfg y yarn-site.xml disponibles en el directorio /etc/hadoop/conf. Para obtener información detallada sobre cada opción de configuración y cómo se utiliza, consulte Lanzamiento de aplicaciones mediante contenedores de Docker.

Si lo desea, puede usar Docker cuando envíe un trabajo. Use las siguientes variables para especificar el tiempo de ejecución de Docker y la imagen de Docker.

  • YARN_CONTAINER_RUNTIME_TYPE=docker

  • YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={DOCKER_IMAGE_NAME}

Cuando usa contenedores de Docker para ejecutar sus aplicaciones de YARN, YARN descarga la imagen de Docker que se ha especificado al enviar el trabajo. Para que YARN resuelva esta imagen de Docker, debe configurarse con un registro de Docker. Las opciones de configuración de un registro de Docker dependen de si el clúster se ha implementado mediante una subred pública o privada.

Registros de Docker

Un registro de Docker es un sistema de almacenamiento y distribución para imágenes de Docker. En el caso de Amazon EMR, se recomienda usar Amazon ECR, que es un registro de contenedores de Docker completamente administrado que le permite crear sus propias imágenes personalizadas y alojarlas en una arquitectura escalable y de alta disponibilidad.

Consideraciones sobre la implementación

Los registros de Docker requieren acceso a la red desde cada host del clúster. Esto se debe a que cada host descarga imágenes del registro de Docker cuando la aplicación de YARN se ejecuta en el clúster. Estos requisitos de conectividad de red pueden limitar la elección del registro de Docker, dependiendo de si el clúster de Amazon EMR se ha implementado en una subred pública o privada.

Public subnet (Subred pública)

Cuando los clústeres de EMR se implementan en una subred pública, los nodos que ejecutan YARN NodeManager pueden acceder directamente a cualquier registro disponible a través de Internet.

Subred privada

Cuando los clústeres de EMR se implementan en una subred privada, los nodos que ejecutan YARN NodeManager no tienen acceso directo a Internet. Las imágenes de Docker se pueden alojar en Amazon ECR y se puede acceder a ellas a través de AWS PrivateLink.

Para más información acerca de cómo utilizar AWS PrivateLink para permitir el acceso a Amazon ECR en un escenario de subred privada, consulte Configuración de AWS PrivateLink para Amazon ECS y Amazon ECR.

Configuración de registros de Docker

Para utilizar registros de Docker con Amazon EMR, debe configurar Docker de tal forma que confíe en el registro específico que desea utilizar para resolver las imágenes de Docker. Los registros de confianza predeterminados son locales (privados) y de Centos. Para utilizar otros repositorios públicos o Amazon ECR, puede anular la configuración de docker.trusted.registries en /etc/hadoop/conf/container-executor.cfg mediante la API de clasificación de EMR con la clave de clasificación container-executor.

En el ejemplo siguiente se muestra cómo configurar el clúster de tal forma que confíe tanto en un repositorio público denominado your-public-repo, como en un punto de enlace de registro de ECR, 123456789123.dkr.ecr.us-east-1.amazonaws.com. Si utiliza ECR, sustituya este punto de enlace por su punto de enlace de ECR específico.

[ { "Classification": "container-executor", "Configurations": [ { "Classification": "docker", "Properties": { "docker.trusted.registries": "local,centos,your-public-repo,123456789123.dkr.ecr.us-east-1.amazonaws.com", "docker.privileged-containers.registries": "local,centos,your-public-repo,123456789123.dkr.ecr.us-east-1.amazonaws.com" } } ] } ]

Para lanzar un clúster de Amazon EMR 6.0.0 con esta configuración mediante la AWS Command Line Interface (AWS CLI), cree un archivo llamado container-executor.json con el contenido de la configuración container-executor de JSON anterior. A continuación, utilice los siguientes comandos para lanzar el clúster.

export KEYPAIR=<Name of your Amazon EC2 key-pair> export SUBNET_ID=<ID of the subnet to which to deploy the cluster> export INSTANCE_TYPE=<Name of the instance type to use> export REGION=<Region to which to deploy the cluster> aws emr create-cluster \ --name "EMR-6.0.0" \ --region $REGION \ --release-label emr-6.0.0 \ --applications Name=Hadoop Name=Spark \ --service-role EMR_DefaultRole \ --ec2-attributes KeyName=$KEYPAIR,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=$SUBNET_ID \ --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=$INSTANCE_TYPE InstanceGroupType=CORE,InstanceCount=2,InstanceType=$INSTANCE_TYPE \ --configuration file://container-executor.json

Configuración de YARN para acceder a Amazon ECR en EMR 6.0.0 y versiones anteriores

Si es la primera vez que usa Amazon ECR, siga las instrucciones de Introducción a Amazon ECR y compruebe que dispone de acceso a Amazon ECR desde cada instancia del clúster de Amazon EMR.

En EMR 6.0.0 y versiones anteriores, para acceder a Amazon ECR mediante el comando de Docker, antes debe generar unas credenciales. Para verificar que YARN pueda acceder a las imágenes desde Amazon ECR, utilice la variable de entorno contenedora YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG para pasar una referencia a las credenciales que ha generado.

Ejecute el siguiente comando en uno de los nodos principales para obtener la línea de inicio de sesión de su cuenta de ECR.

aws ecr get-login --region us-east-1 --no-include-email

El comando get-login genera el comando correcto de la CLI de Docker que hay que ejecutar para crear las credenciales. Copie y ejecute la salida desde get-login.

sudo docker login -u AWS -p <password> https://<account-id>.dkr.ecr.us-east-1.amazonaws.com

Este comando genera un archivo config.json en la carpeta /root/.docker. Copie este archivo en HDFS para que los trabajos enviados al clúster puedan usarlo para autenticarse en Amazon ECR.

Ejecute los siguientes comandos para copiar el archivo config.json en su directorio de inicio.

mkdir -p ~/.docker sudo cp /root/.docker/config.json ~/.docker/config.json sudo chmod 644 ~/.docker/config.json

Ejecute los siguientes comandos para poner el archivo config.json en HDFS, de tal forma que puedan usarlo los trabajos que se ejecutan en el clúster.

hadoop fs -put ~/.docker/config.json /user/hadoop/

YARN puede acceder a ECR como un registro de imágenes de Docker y extraer contenedores durante la ejecución del trabajo.

Después de configurar los registros de Docker y YARN, puede ejecutar las aplicaciones de YARN utilizando contenedores de Docker. Para más información, consulte Ejecutar aplicaciones de Spark con Docker mediante Amazon EMR 6.0.0.

En EMR 6.1.0 y versiones posteriores, no es necesario configurar manualmente la autenticación en Amazon ECR. Si se detecta un registro de Amazon ECR en la clave de clasificación container-executor, se activa la característica de autenticación automática de Amazon ECR y YARN se encarga del proceso de autenticación cuando se envía un trabajo de Spark con una imagen de ECR. Para confirmar si la autenticación automática está habilitada, compruebe yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled en yarn-site. La autenticación automática está habilitada y la configuración de autenticación de YARN se establece en true si docker.trusted.registries contiene una URL de registro de ECR.

Requisitos previos para utilizar la autenticación automática en Amazon ECR

  • EMR versión 6.1.0 o posterior

  • El registro de ECR incluido en la configuración se encuentra en la misma región que el clúster

  • Rol de IAM con permisos para obtener el token de autorización y extraer cualquier imagen

Consulte Configuración con Amazon ECR para más información.

Cómo habilitar la autenticación automática

Siga Configuración de registros de Docker para establecer un registro de Amazon ECR como registro de confianza y asegúrese de que el repositorio de Amazon ECR y el clúster estén en la misma región.

Para habilitar esta característica incluso cuando el registro de ECR no esté establecido en el registro de confianza, utilice la clasificación de configuración para establecer yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled en true.

Cómo desactivar la autenticación automática

De forma predeterminada, la autenticación automática se deshabilita si no se detecta ningún registro de Amazon ECR en el registro de confianza.

Para desactivar la autenticación automática, incluso cuando el registro de Amazon ECR se haya establecido en el registro de confianza, utilice la clasificación de configuración para establecer yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled en false.

Cómo comprobar si la autenticación automática está habilitada en un clúster

En el nodo maestro, utilice un editor de texto como vi para ver el contenido del archivo: vi /etc/hadoop/conf.empty/yarn-site.xml. Compruebe el valor de yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled.