Criar e gerenciar sandboxes com o SDK

Importante

Esse recurso está em Beta. Para habilitar essa pré-visualização no workspace, opte pela configuração Databricks Sandbox na página de Pré-visualizações do workspace. Consulte Gerenciar visualizações do Azure Databricks.

Atualmente, a Databricks não cobra pelo uso desse recurso. No entanto, o custo e o preço dos recursos no Beta podem ser alterados.

O SDK Databricks para Python inclui um cliente sandbox para criar sandboxes, executar comandos neles e gerenciar seu ciclo de vida. Esta página explica essas operações. Para uma visão geral do Databricks Sandbox, veja Databricks Sandbox.

Instalar o SDK

Instale ou atualize o SDK Databricks para Python, que inclui o cliente sandbox:

pip install --upgrade databricks-sdk

Criar um Cliente de Espaço de Trabalho

Todas as operações na sandbox passam por um WorkspaceClient. Crie um WorkspaceClient usando credenciais obtidas do seu ambiente, de um perfil de configuração ou de um host e um token explícitos:

from databricks.sdk import WorkspaceClient

# Resolve credentials from the environment or the default config profile:
w = WorkspaceClient()

# Or select a specific ~/.databrickscfg profile:
w = WorkspaceClient(profile="my-workspace")

# Or pass the host and token explicitly:
w = WorkspaceClient(host="https://<workspace>.cloud.databricks.com", token="dapi...")

Para mais informações sobre como configurar e autenticar o SDK, veja o Databricks SDK para Python.

Crie uma sandbox

Crie um sandbox por ID. Você pode, opcionalmente, configurar a especificação de computação, como o tempo limite de inatividade que controla por quanto tempo o sandbox permanece em execução sem atividade:

from google.protobuf.duration_pb2 import Duration
from databricks.sdk.service.sandbox import ComputeSpec, Sandbox, SandboxSpec

created = w.sandbox.create_sandbox(
    sandbox=Sandbox(
        spec=SandboxSpec(compute=ComputeSpec(inactivity_timeout=Duration(seconds=900))),
    ),
    sandbox_id="my-sandbox",
)
print(created.name)   # "sandboxes/my-sandbox"

Obter e listar as áreas restritas

Recupere um único sandbox pelo nome, ou liste todos os sandboxes:

sandbox = w.sandbox.get_sandbox("sandboxes/my-sandbox")
print(sandbox.status.state)   # SandboxState.SANDBOX_STATE_RUNNING

for sandbox in w.sandbox.list_sandboxes():
    print(sandbox.name, sandbox.status.state if sandbox.status else None)

Execute um comando em um sandbox

Execute um comando em um sandbox e leia sua saída. O primeiro argumento é o nome sandbox, seguido pelo programa a ser executado e seus argumentos. Este é um exec direto sem shell, então para executar um comando shell, invoque /bin/bash -c. Passe quaisquer variáveis de ambiente por envs:

from google.protobuf.duration_pb2 import Duration

resp = w.sandbox.execute_command_sync(
    "sandboxes/my-sandbox",
    "/bin/bash",
    args=["-c", "echo hello world && whoami"],
    envs={"MY_VAR": "value"},
    execution_timeout=Duration(seconds=30),
)
print(resp.status)      # ExecuteCommandStatus.EXECUTE_COMMAND_STATUS_COMPLETED
print(resp.exit_code)   # 0
print(resp.stdout)      # "hello world\nsandbox-agent\n"
print(resp.stderr)
print(resp.truncated)   # True if the output was truncated

Atualizar metadados da sandbox

Você pode atualizar o nome de exibição e o tempo de inatividade de um sandbox. Somente os seguintes caminhos de campo são aceitos. Qualquer outro caminho retorna INVALID_PARAMETER_VALUE:

  • display_name
  • spec.compute.inactivity_timeout
from databricks.sdk.common.types.fieldmask import FieldMask
from databricks.sdk.service.sandbox import ComputeSpec, Sandbox, SandboxSpec
from google.protobuf.duration_pb2 import Duration

# Rename the sandbox
w.sandbox.update_sandbox(
    name="sandboxes/my-sandbox",
    sandbox=Sandbox(display_name="renamed sandbox"),
    update_mask=FieldMask(["display_name"]),
)

# Extend the inactivity timeout
w.sandbox.update_sandbox(
    name="sandboxes/my-sandbox",
    sandbox=Sandbox(spec=SandboxSpec(compute=ComputeSpec(inactivity_timeout=Duration(seconds=1800)))),
    update_mask=FieldMask(["spec.compute.inactivity_timeout"]),
)

Pare e reinicie um sandbox

Interrompa um sandbox para liberar seus recursos computacionais enquanto preserva seu diretório home:

w.sandbox.stop_sandbox("sandboxes/my-sandbox")    # Moves to SANDBOX_STATE_STOPPED

Inicie o sandbox novamente para retomar o trabalho:

w.sandbox.start_sandbox("sandboxes/my-sandbox")   # Moves to SANDBOX_STATE_RUNNING

Excluir uma sandbox

Exclua um sandbox quando terminar. Deletar um sandbox remove seu diretório inicial e para de cobrar o sandbox:

w.sandbox.delete_sandbox("sandboxes/my-sandbox")

Recursos adicionais