Personalizar contêineres com o Databricks Container Service

O Databricks Container Services permite especificar uma imagem do Docker ao criar computação. Alguns exemplos de casos de uso incluem:

  • Personalização de bibliotecas: você tem controle total sobre as bibliotecas do sistema que deseja instalar.
  • Ambiente de contêiner dourado: sua imagem do Docker é um ambiente bloqueado que nunca mudará.
  • Integração de CI/CD do Docker: você pode integrar o Azure Databricks com seus pipelines de CI/CD do Docker.

Você também pode usar imagens do Docker para criar ambientes personalizados de aprendizado profundo em computação com dispositivos GPU. Para obter informações adicionais sobre como usar a computação de GPU com Databricks Container Services, consulte Databricks Container Services on GPU compute.

Para que as tarefas sejam executadas sempre que o contêiner for iniciado, use um script init.

Requisitos

  • Seu espaço de trabalho do Azure Databricks deve ter os Serviços de Contêiner do Databricks habilitados.
  • Sua máquina deve estar executando um daemon Docker recente (um que é testado e funciona com Client/Server Versão 18.03.0-ce) e o docker comando deve estar disponível no seu PATH.

Limitações

  • O Databricks Container Services não é suportado na computação usando o modo de acesso compartilhado.
  • O Databricks Runtime for Machine Learning não suporta Databricks Container Services.
  • Para acessar Volumes no Databricks Container Services, adicione a seguinte configuração ao campo de configuração do Spark da computação: spark.databricks.unityCatalog.volumes.enabled true.

Passo 1: Construa a sua base

O Databricks recomenda que você crie sua base do Docker a partir de uma base que o Databricks tenha criado e testado. Também é possível construir sua base Docker do zero. Esta seção descreve as duas opções.

Opção 1. Use uma base construída pela Databricks

Este exemplo usa a tag para uma imagem que terá como alvo uma 9.x computação com a versão de tempo de execução Databricks Runtime 9.0 e superior:

FROM databricksruntime/standard:9.x
...

Para especificar bibliotecas Python adicionais, como a versão mais recente do pandas e urllib, use a versão específica do contêiner do pip. Para o databricksruntime/standard:9.x recipiente, inclua o seguinte:

RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3

Para o databricksruntime/standard:8.x recipiente ou inferior, inclua o seguinte:

RUN /databricks/conda/envs/dcs-minimal/bin/pip install pandas
RUN /databricks/conda/envs/dcs-minimal/bin/pip install urllib3

As imagens de base são hospedadas no Docker Hub em https://hub.docker.com/u/databricksruntime. Os Dockerfiles usados para gerar essas bases estão em https://github.com/databricks/containers.

Nota

As imagens hospedadas no Docker Hub com tags com sufixo "-LTS" serão corrigidas. Todas as outras imagens são exemplos e não são corrigidas regularmente.

Nota

As imagens databricksruntime/standard base e databricksruntime/minimal não devem ser confundidas com os ambientes não relacionados databricks-standard e databricks-minimal incluídos no Databricks Runtime com Conda (Beta) não mais disponível.

Opção 2. Crie sua própria base Docker

Você também pode criar sua base do Docker do zero. A imagem do Docker deve atender aos seguintes requisitos:

Para construir sua própria imagem do zero, você deve criar o ambiente virtual. Você também deve incluir pacotes que são incorporados à computação do Databricks, como Python e R. Para começar, você pode usar a imagem base apropriada:

  • Para R: databricksruntime/rbase
  • Para Python: databricksruntime/python
  • Para a imagem mínima criada pelo Databricks: databricksruntime/minimal

Você também pode consultar o exemplo Dockerfiles no GitHub.

Nota

Databricks recomenda o uso do Ubuntu Linux; no entanto, é possível usar o Alpine Linux. Para usar o Alpine Linux, você deve incluir estes arquivos:

Além disso, você deve configurar o Python, como mostrado neste exemplo Dockerfile.

Aviso

Teste sua imagem de contêiner personalizada completamente em uma computação do Azure Databricks. Seu contêiner pode funcionar em uma máquina local ou de compilação, mas quando seu contêiner é iniciado no Azure Databricks, a inicialização de computação pode falhar, certos recursos podem ser desabilitados ou seu contêiner pode parar de funcionar, mesmo silenciosamente. Na pior das hipóteses, pode corromper os seus dados ou expô-los acidentalmente a terceiros.

Passo 2: Empurre a sua imagem base

Envie sua imagem base personalizada para um registro do Docker. Este processo é suportado pelos seguintes registos:

Outros registros do Docker que não suportam autenticação ou autenticação básica também devem funcionar.

Nota

Se você usar o Docker Hub para seu registro do Docker, verifique se os limites de taxa acomodam a quantidade de computação que você espera iniciar em um período de seis horas. Esses limites de taxa são diferentes para usuários anônimos, usuários autenticados sem uma assinatura paga e assinaturas pagas. Consulte a documentação do Docker para obter detalhes. Se esse limite for excedido, você receberá uma resposta "429 solicitações demais".

Etapa 3: Inicie sua computação

Você pode iniciar sua computação usando a interface do usuário ou a API.

Inicie sua computação usando a interface do usuário

  1. Na página Criar computação, especifique uma Versão de Tempo de Execução do Databricks que ofereça suporte aos Serviços de Contêiner do Databricks.

  2. Em Opções avançadas, selecione a guia Docker .

  3. Selecione Usar seu próprio contêiner do Docker.

  4. No campo URL da imagem do Docker, insira sua imagem personalizada do Docker.

    Exemplos de URL de imagem do Docker:

    Registo Formato da etiqueta
    Docker Hub <organization>/<repository>:<tag> (por exemplo: databricksruntime/standard:latest)
    Registo de Contentores do Azure <your-registry-name>.azurecr.io/<repository-name>:<tag>
  5. Selecione o tipo de autenticação.

Inicie sua computação usando a API

  1. Gere um token de API.

  2. Use a API de Clusters para iniciar uma computação com sua base personalizada do Docker.

    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 os requisitos dependem do tipo de imagem do Docker:

    • Para imagens públicas do Docker, não inclua o basic_auth campo.
    • Para imagens privadas do Docker, você deve incluir o basic_auth campo, usando um ID da entidade de serviço e senha como nome de usuário e senha.
    • Para o Registro de Contêiner do Azure, você deve definir o basic_auth campo como ID e senha de uma entidade de serviço. Consulte a documentação de autenticação da entidade de serviço do Registro de Contêiner do Azure para obter informações sobre como criar a entidade de serviço.

Usar um script init

Os Serviços de Contêiner Databricks permitem que os clientes incluam scripts de inicialização no contêiner do Docker. Na maioria dos casos, você deve evitar scripts init e, em vez disso, fazer personalizações através do Docker diretamente (usando o Dockerfile). No entanto, determinadas tarefas devem ser executadas quando o contêiner é iniciado, em vez de quando o contêiner é construído. Use um script init para essas tarefas.

Por exemplo, suponha que você queira executar um daemon de segurança dentro de um contêiner personalizado. Instale e construa o daemon na imagem do Docker por meio do pipeline de construção de imagens. Em seguida, adicione um script init que inicia o daemon. Neste exemplo, o script init incluiria uma linha como systemctl start my-daemon.

Na API, você pode especificar scripts init como parte da especificação de computação da seguinte maneira. Para obter mais informações, consulte a API de Clusters.

"init_scripts": [
    {
        "file": {
            "destination": "file:/my/local/file.sh"
        }
    }
]

Para imagens do Databricks Container Services, você também pode armazenar scripts init no armazenamento em nuvem.

As etapas a seguir ocorrem quando você inicia uma computação que usa o Databricks Container Services:

  1. As VMs são adquiridas do provedor de nuvem.
  2. A imagem personalizada do Docker é baixada do seu repositório.
  3. O Azure Databricks cria um contêiner do Docker a partir da imagem.
  4. O código Databricks Runtime é copiado para o contêiner do Docker.
  5. Os scripts init são executados. Consulte O que são scripts init?.

O Azure Databricks ignora o Docker CMD e ENTRYPOINT as primitivas.

Habilitar serviços de contêiner

Para usar contêineres personalizados em sua computação, um administrador de espaço de trabalho deve habilitar os Serviços de Contêiner do Databricks.

Os administradores de espaço de trabalho podem habilitar o Databricks Container Service usando a API de configuração do espaço de trabalho. Em um corpo de solicitação JSON, especifique enableDcs para true, como no exemplo a seguir:

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