Personalización de contenedores con Databricks Container Services
Databricks Container Services le permite especificar una imagen de Docker cuando crea proceso. Algunos casos de uso de ejemplo son:
- Personalización de bibliotecas: tiene el control total sobre las bibliotecas del sistema que desea instalar.
- Entorno de contenedor modelo: la imagen de Docker es un entorno bloqueado que no cambia.
- Integración de CI/CD de Docker: puede integrar Azure Databricks con las canalizaciones de CI/CD de Docker.
También puede usar imágenes de Docker para crear entornos de aprendizaje profundo personalizados en proceso con dispositivos GPU. Para más información sobre el uso del proceso de GPU con Databricks Container Services, vea Databricks Container Services en el proceso de GPU.
Para que las tareas se ejecuten cada vez que se inicie el contenedor, use un script de inicialización.
Requisitos
- El área de trabajo de Azure Databricks debe tener habilitado Databricks Container Services.
- La máquina debe ejecutar un demonio de Docker reciente (uno que se pruebe y funcione con la versión 18.03.0-ce del cliente/servidor) y el comando
docker
debe estar disponible enPATH
.
Limitaciones
- Databricks Container Services no se admite en clústeres que usan el modo de acceso compartido.
- Databricks Runtime para Machine Learning no admite Databricks Container Services.
- Para acceder a volúmenes de Databricks Container Services, agregue la siguiente configuración al campo Configuración de Spark del proceso:
spark.databricks.unityCatalog.volumes.enabled true
.
Paso 1: Compilación de la base
Databricks recomienda crear la base de Docker con una base que Databricks haya creado y probado. También puede crear la base de Docker desde cero. En esta sección, se describen las dos opciones.
Opción 1. Uso de una base creada por Databricks
En este ejemplo, se usa la etiqueta 9.x
para una imagen que tendrá como destino un proceso con la versión del entorno de ejecución Databricks Runtime 9.1 LTS y posterior:
FROM databricksruntime/standard:9.x
...
Para especificar bibliotecas de Python adicionales, como la versión más reciente de pandas y urllib, use la versión de pip
específica para el contenedor. Para el contenedor databricksruntime/standard:9.x
, incluya lo siguiente:
RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3
Para el contenedor databricksruntime/standard:8.x
o anterior, incluya lo siguiente:
RUN /databricks/conda/envs/dcs-minimal/bin/pip install pandas
RUN /databricks/conda/envs/dcs-minimal/bin/pip install urllib3
Las imágenes base se hospedan en Docker Hub, en https://hub.docker.com/u/databricksruntime. Los Dockerfiles usados para generar estas bases se encuentran en https://github.com/databricks/containers.
Nota:
Se revisarán las imágenes hospedadas en Docker Hub con etiquetas con sufijo "-LTS". Todas las demás imágenes son ejemplos y no se revisan con regularidad.
Nota:
Las imágenes base databricksruntime/standard
y databricksruntime/minimal
no deben confundirse con los entornos databricks-standard
y databricks-minimal
no relacionados que se incluyen en la versión de Databricks Runtime con Conda (Beta), que ya no está disponible.
Opción 2. Creación de su propia base de Docker
También puede crear una base de Docker desde cero. La imagen de Docker debe cumplir los siguientes requisitos:
- JDK 8u191 como Java en el
PATH
del sistema - Bash
- iproute2 (ubuntu iproute)
- coreutils (ubuntu coreutils)
- procps (ubuntu procps)
- sudo (ubuntu sudo)
- Ubuntu Linux
Para crear su propia imagen desde cero, debe crear el entorno virtual. También debe incluir paquetes integrados en proceso de Databricks, como Python y R. Para empezar, puede usar la imagen base adecuada:
- Para R:
databricksruntime/rbase
- Para Python:
databricksruntime/python
- Para la imagen mínima creada por Databricks:
databricksruntime/minimal
También puede hacer referencia a los Dockerfiles en GitHub de ejemplo.
Nota:
Databricks recomienda usar Ubuntu Linux. Sin embargo, se puede usar Alpine Linux. Para usar Alpine Linux, debe incluir estos archivos:
Además, debe configurar Python, como se muestra en este Dockerfile de ejemplo.
Advertencia
Pruebe la imagen de contenedor personalizada exhaustivamente en un clúster de Azure Databricks. El contenedor puede funcionar en una máquina local o de compilación, pero, al iniciarlo en Azure Databricks, el inicio del proceso puede dar error, algunas características podrían deshabilitarse, o que el contenedor deje de funcionar, incluso en modo silencioso. En el peor de los casos, podría dañar los datos o exponerlos accidentalmente a entidades externas.
Paso 2: Inserción de la imagen base
Inserte la imagen base personalizada en un registro de Docker. Este proceso es compatible con los registros siguientes:
- Docker Hub sin autenticación o con autenticación básica.
- Azure Container Registry con autenticación básica.
También se espera que funcionen otros registros de Docker que admitan la no autenticación o la autenticación básica.
Nota:
Si usa Docker Hub para el registro de Docker, asegúrese de comprobar que los límites de velocidad se ajusten a la cantidad de proceso que espera iniciar en un período de seis horas. Estos límites de velocidad son diferentes para los usuarios anónimos, los usuarios autenticados sin una suscripción de pago y las suscripciones de pago. Consulte la documentación de Docker para obtener más información. Si se supera este límite, obtendrá una respuesta "429 Demasiadas solicitudes".
Paso 3: Inicio del proceso
Puede iniciar el proceso usando la interfaz de usuario o la API.
Inicio del proceso mediante la interfaz de usuario
En la página Crear proceso, especifique una versión de Databricks Runtime que admita Databricks Container Services.
En Opciones avanzadas, seleccione la pestaña Docker.
Seleccione Use your own Docker container (Usar su propio contenedor de Docker).
En el campo Docker Image URL (Dirección URL de la imagen de Docker), especifique la imagen personalizada de Docker.
Ejemplos de dirección URL de imagen de Docker:
Registro Formato de la etiqueta Docker Hub <organization>/<repository>:<tag>
(por ejemplo:databricksruntime/standard:latest
)Azure Container Registry <your-registry-name>.azurecr.io/<repository-name>:<tag>
Seleccione el tipo de autenticación. Puede usar secretos para almacenar valores de autenticación de nombre de usuario y contraseña. Consulte Uso de secretos para la autenticación.
Inicio del proceso mediante la API
Use la CLI de Databricks para iniciar un proceso con la base de Docker personalizada.
databricks clusters create \ --cluster-name <cluster-name> \ --node-type-id Standard_DS3_v2 \ --json '{ "num_workers": 0, "docker_image": { "url": "databricksruntime/standard:latest", "basic_auth": { "username": "<docker-registry-username>", "password": "<docker-registry-password>" } }, "spark_version": "14.3.x-scala2.12" }'
basic_auth
Los requisitos dependen del tipo de imagen de Docker:- Para imágenes de Docker públicas, no incluya el campo
basic_auth
. - Para imágenes de Docker privadas, debe incluir el campo
basic_auth
, con un identificador de entidad de servicio y una contraseña como nombre de usuario y contraseña. - Para Azure Container Registry, debe establecer el campo
basic_auth
en el identificador y la contraseña de una entidad de servicio. Consulte Autenticación de Azure Container Registry con entidades de servicio para obtener información sobre cómo crear la entidad de servicio. - También puede usar un secreto para almacenar la información de autenticación. Consulte Uso de secretos para la autenticación.
- Para imágenes de Docker públicas, no incluya el campo
Uso de un script de inicialización
Los servicios de contenedor de Databricks permiten que los clientes incluyan scripts de inicialización en el contenedor de Docker. En la mayoría de los casos, debe evitar los scripts de inicialización y, en su lugar, realizar personalizaciones a través de Docker directamente (mediante Dockerfiles). Sin embargo, ciertas tareas deben ejecutarse cuando se inicia el contenedor, no cuando se crea. Use un script de inicialización para estas tareas.
Por ejemplo, suponga que desea ejecutar un demonio de seguridad dentro de un contenedor personalizado. Instale y compile el demonio en la imagen de Docker a través de la canalización de creación de imágenes. A continuación, agregue un script de inicialización que inicie el demonio. En este ejemplo, el script de inicialización incluiría una línea como systemctl start my-daemon
.
En la API, puede especificar scripts de inicialización como parte de la especificación del proceso, de la manera siguiente. Para más información, consulte la Clusters API.
"init_scripts": [
{
"file": {
"destination": "file:/my/local/file.sh"
}
}
]
En el caso de las imágenes de Databricks Container Services, también puede almacenar scripts de inicialización en el almacenamiento en la nube.
Cuando se inicia un proceso que usa Databricks Container Services, se llevan a cabo los siguientes pasos:
- Se adquieren las máquinas virtuales del proveedor de nube.
- Se descarga del repositorio la imagen de Docker personalizada.
- Azure Databricks crea un contenedor de Docker a partir de la imagen.
- Se copia el código de Databricks Runtime en el contenedor de Docker.
- Se ejecutan los scripts de inicialización. Consulte ¿Qué son los scripts de inicialización?.
Azure Databricks omite los tipos primitivos CMD
y ENTRYPOINT
de Docker.
Uso de secretos para la autenticación
El servicio de contenedor de Databricks admite el uso de secretos para la autenticación. Al crear el recurso de proceso, en lugar de escribir el nombre de usuario o la contraseña de texto sin formato, escriba el secreto con el formato {{secrets/<scope-name>/<dcs-secret>}}
. Para obtener información sobre cómo crear secretos, consulte Secretos.
Habilitación de servicios de contenedor
Para usar contenedores personalizados en el proceso, un administrador del área de trabajo debe habilitar Databricks Container Services.
Los administradores del área de trabajo pueden habilitar el servicio de contenedor de Databricks mediante la CLI de Databricks. En un cuerpo de solicitud JSON, especifique enableDcs
en true
, como en el ejemplo siguiente:
databricks workspace-conf set-status \
--json '{"enableDcs": "true"}'