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 en PATH.

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.0 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:

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:

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

  1. En la página Crear proceso, especifique una versión de Databricks Runtime que admita Databricks Container Services.

  2. En Opciones avanzadas, seleccione la pestaña Docker.

  3. Seleccione Use your own Docker container (Usar su propio contenedor de Docker).

  4. 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>
  5. Seleccione el tipo de autenticación.

Inicio del proceso mediante la API

  1. Genere un token de API.

  2. Use la API de clústeres para iniciar un proceso con la base de Docker personalizada.

    curl -X POST -H "Authorization: Bearer <token>" https://<databricks-instance>/api/2.0/clusters/create -d '{
      "cluster_name": "<cluster-name>",
      "num_workers": 0,
      "node_type_id": "Standard_DS3_v2",
      "docker_image": {
        "url": "databricksruntime/standard:latest",
        "basic_auth": {
          "username": "<docker-registry-username>",
          "password": "<docker-registry-password>"
        }
      },
      "spark_version": "7.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.

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:

  1. Se adquieren las máquinas virtuales del proveedor de nube.
  2. Se descarga del repositorio la imagen de Docker personalizada.
  3. Azure Databricks crea un contenedor de Docker a partir de la imagen.
  4. Se copia el código de Databricks Runtime en el contenedor de Docker.
  5. 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.

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 API de configuración del área de trabajo. En un cuerpo de solicitud JSON, especifique enableDcs en true, como en el ejemplo siguiente:

curl -X PATCH -n \
  https://<databricks-instance>/api/2.0/workspace-conf \
  -d '{
    "enableDcs": "true"
    }'