Personalização de contêineres com o Serviço de Contêiner do Databricks
O Serviços de Contêiner do Databricks permite que você especifique uma imagem do Docker quando você cria a computação. Alguns exemplos de caso de uso incluem:
- Personalização de biblioteca: você tem controle total sobre as bibliotecas do sistema que deseja instalar.
- Ambiente de contêiner de ouro: sua imagem do Docker é um ambiente bloqueado que nunca mudará.
- Integração de CI/CD do Docker: você pode integrar o Azure Databricks aos seus pipelines de CI/CD do Docker.
Você também pode usar imagens do Docker para criar ambientes personalizados de aprendizado profundo na computação com dispositivos de GPU. Para obter mais informações sobre como usar clusters de GPU com os Serviços de Contêiner do Databricks, confira Serviços de Contêiner do Databricks em clusters de GPU.
Para que as tarefas sejam executadas sempre que o contêiner for iniciado, use um script de inicialização.
Requisitos
- Seu workspace do Azure Databricks precisa ter os Serviços de Contêiner do Databricks habilitado.
- Seu computador precisa executar um daemon recente do Docker (um que tenha sido testado e que funcione com o cliente/servidor versão 18.03.0-ce) e o comando
docker
precisa estar disponível noPATH
.
Limitações
- Não há suporte para o Serviços de Contêiner do Databricks na computação que usa o modo de acesso compartilhado.
- O Databricks Runtime para Machine Learning não dá suporte aos Serviços de Contêiner do Databricks.
- Para acessar Volumes no Serviços de Contêiner do Databricks, adicione a seguinte configuração ao campo configuração do Spark da computação:
spark.databricks.unityCatalog.volumes.enabled true
.
Etapa 1: Criar sua base
O Databricks recomenda que você crie sua base do Docker de uma base que o Databricks criou e testou. Também é possível criar sua base do Docker do zero. Esta seção descreve as duas opções.
Opção 1. Usar uma base criada pelo Databricks
Este exemplo usa a marca 9.x
para uma imagem que terá como destino uma computação com a versão de runtime Databricks Runtime 9.1 LTS e versões superioreses:
FROM databricksruntime/standard:9.x
...
Para especificar bibliotecas adicionais do Python, como a última versão do Pandas e da urllib, use a versão específica do contêiner do pip
. Para o contêiner databricksruntime/standard:9.x
, inclua o seguinte:
RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3
Para o contêiner databricksruntime/standard:8.x
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 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.
Observação
Imagens do Docker Hub hospedadas com marcas com o sufixo "-LTS" serão corrigidas. Todas as outras imagens são exemplos e não são corrigidas regularmente.
Observação
As imagens base databricksruntime/standard
e databricksruntime/minimal
não devem ser confundidas com os ambientes databricks-standard
e databricks-minimal
não relacionados incluídos no Databricks Runtime com o Conda (beta) não mais disponível.
Opção 2. Criar uma base própria do Docker
Você também pode criar sua base do Docker do zero. A imagem do Docker precisa atender a estes requisitos:
- JDK 8u191 como Java no sistema
PATH
- bash
- iproute2 (ubuntu iproute)
- coreutils (ubuntu coreutils)
- procps (ubuntu procps)
- sudo (ubuntu sudo)
- Ubuntu Linux
Para criar uma imagem própria do zero, você precisa criar o ambiente virtual. Você deve também incluir pacotes incorporados à computação do Databricks, como Python e R. Para começar, você pode usar a imagem base apropriada:
- Para o R:
databricksruntime/rbase
- Para o Python:
databricksruntime/python
- Para a imagem mínima criada pelo Databricks:
databricksruntime/minimal
Você também pode consultar os Dockerfiles de exemplo no GitHub.
Observação
O Databricks recomenda o uso do Ubuntu Linux. No entanto, é possível usar o Alpine Linux. Para usar o Alpine Linux, inclua estes arquivos:
Além disso, configure o Python, conforme mostrado neste exemplo de Dockerfile.
Aviso
Teste sua imagem de contêiner personalizada completamente em uma computação do Azure Databricks. Seu contêiner pode funcionar em um computador local ou de build, mas quando o contêiner é iniciado no Azure Databricks, a inicialização da computação pode falhar, certos recursos podem estar desabilitados ou o contêiner pode parar de funcionar, mesmo silenciosamente. Na pior das hipóteses, ele poderá corromper seus dados ou expor acidentalmente seus dados a terceiros.
Etapa 2: efetuar push da imagem base
Efetue push da imagem base personalizada para um registro do Docker. Esse processo é compatível com os seguintes registros:
- Docker Hub sem autenticação ou com a autenticação básica.
- Registro de Contêiner do Azure com a autenticação básica.
Outros registros do Docker que não dão suporte a nenhuma autenticação ou à autenticação básica também devem funcionar.
Observação
Se você usa o Docker Hub para o registro do seu Docker, verifique se os limites de taxa acomodam a quantidade de computação que você espera lançar 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. Confira a documentação do Docker para obter detalhes. Se esse limite for excedido, você receberá uma resposta com o erro "429 – Número excessivo de solicitações".
Etapa 3: iniciar 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
Na página Criar página de computação, especifique uma versão do Databricks Runtime que dê suporte aos serviços de contêineres do Databricks.
Em Opções avançadas, selecione a guia Docker.
Selecione Usar seu contêiner do Docker.
No campo URL da Imagem do Docker, insira a imagem personalizada do Docker.
Exemplos de URL de imagem do Docker:
Registro Formato de marca Hub do Docker <organization>/<repository>:<tag>
(por exemplo:databricksruntime/standard:latest
)Registro de Contêiner do Azure <your-registry-name>.azurecr.io/<repository-name>:<tag>
Selecione o tipo de autenticação. Você pode usar segredos para armazenar valores de autenticação de senha e nome de usuário. Confira Usar segredos para autenticação.
Inicie sua computação usando a API
Use a CLI do Databricks para iniciar uma computação com sua base personalizada do Docker.
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" }'
Os requisitos de
basic_auth
dependem do tipo de imagem do Docker:- Para imagens públicas do Docker, não inclua o campo
basic_auth
. - Para imagens privadas do Docker, é preciso incluir o campo
basic_auth
usando uma ID da entidade de serviço e uma senha como o nome de usuário e a senha. - Para o Registro de Contêiner do Azure, é preciso definir o campo
basic_auth
como a ID e a senha de uma entidade de serviço. Confira a documentação da autenticação de entidade de serviço do Registro de Contêiner do Azure para obter informações sobre como criar a entidade de serviço. - Você também pode usar um segredo para armazenar informações de autenticação. Confira Usar segredos para autenticação.
- Para imagens públicas do Docker, não inclua o campo
Usar um script de inicialização
Os Serviços de Contêiner do Databricks permitem que os clientes incluam scripts de inicialização no contêiner do Docker. Na maioria dos casos, você deve evitar o uso de scripts de inicialização e fazer personalizações por meio do Docker diretamente (usando o Dockerfile). No entanto, algumas tarefas precisam ser executadas quando o contêiner é iniciado, em vez de quando o contêiner é criado. Use um script de inicialização para essas tarefas.
Por exemplo, suponha que você queira executar um daemon de segurança em um contêiner personalizado. Instale e crie o daemon na imagem do Docker por meio do pipeline de criação de imagem. Em seguida, adicione um script de inicialização que inicia o daemon. Neste exemplo, o script de inicialização incluirá uma linha como systemctl start my-daemon
.
Na API, você pode especificar scripts de inicialização 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 dos Serviços de Contêiner do Databricks, você também pode armazenar scripts de inicialização no armazenamento em nuvem.
As etapas a seguir são executadas quando você inicia uma computação que usa o Serviços de Contêiner do Databricks:
- As VMs são adquiridas do provedor de nuvem.
- A imagem personalizada do Docker é baixada do seu repositório.
- O Azure Databricks cria um contêiner do Docker com base na imagem.
- O código do Databricks Runtime é copiado para o contêiner do Docker.
- Os scripts de inicialização são executados. Consulte O que são scripts de inicialização?.
O Azure Databricks ignora os primitivos CMD
e ENTRYPOINT
do Docker.
Usar segredos para autenticação
O Serviço de Contêiner do Databricks dá suporte ao uso de segredos para autenticação. Ao criar seu recurso de computação, em vez de inserir seu nome de usuário ou senha de texto sem formatação, insira seu segredo usando o formato {{secrets/<scope-name>/<dcs-secret>}}
. Para obter informações sobre como criar segredos, consulte Gerenciar segredos.
Habilitar os Serviços de Contêiner
Para usar contêineres personalizados em sua computação, um administrador do espaço de trabalho deve habilitar o Serviços de Contêiner do Databricks.
Os administradores do espaço de trabalho podem habilitar o Serviço de Contêiner do Databricks usando a CLI do Databricks. Em um corpo de solicitação JSON, especifique enableDcs
a true
, como no exemplo a seguir:
databricks workspace-conf set-status \
--json '{"enableDcs": "true"}'