Identificar e excluir o endpoint vazio do Vector Search
Esta página descreve como o senhor pode identificar e excluir o endpoint vazio do Vector Search. Como o endpoint do Vector Search é um recurso específico do site workspace, o senhor precisa repetir esse processo para cada workspace separadamente.
Requisitos
- Databricks SDK for Python (
databricks-sdk
). - Databricks Vector Search Python SDK (
databricks-vectorsearch
). - Autenticação configurada (OAuth, PAT ou perfis de configuração).
CAN_MANAGE
permissão para o ponto de extremidade do Vector Search no espaço de trabalho de destino.
Para instalar os SDKs necessários em seu notebook Databricks ou no ambiente local Python:
# In a Databricks notebook
%pip install databricks-sdk databricks-vectorsearch
# In local Python environment
# pip install databricks-sdk databricks-vectorsearch
Identificar o ponto final vazio
Na interface do usuário Databricks, o ponto final da pesquisa de vetores é mostrado em Vector Search tab da tela de computação . Alterne a caixa de seleção Empty endpoint (Ponto de extremidade vazio ) para exibir os pontos de extremidade que não têm índices associados a eles. Os pontos de extremidade vazios também são marcados com um ícone de triângulo de advertência, conforme mostrado.
Autenticação
Esta seção descreve as opções de autenticação.
Opção 1. execução em um notebook Databricks
Quando o senhor executa o código em um notebook Databricks workspace , a autenticação é automática:
from databricks.vector_search.client import VectorSearchClient
# Credentials are picked up automatically from notebook context
client = VectorSearchClient()
Opção 2. Tokens de acesso pessoal (PAT)
Para ambientes externos, forneça credenciais explícitas:
from databricks.vector_search.client import VectorSearchClient
client = VectorSearchClient(
workspace_url="https://<your-instance>.cloud.databricks.com",
personal_access_token="dapiXXXXXXXXXXXXXXXXXXXXXXXX"
)
Opção 3. Usar perfis de configuração (recomendado para vários espaços de trabalho)
Crie um arquivo .databrickscfg
em seu diretório pessoal e inclua um perfil para cada workspace:
[DEFAULT]
host = https://workspace1.cloud.databricks.com
token = dapiXXXXXXXXXXXXXXXXXXXXXXXX
[PRODUCTION]
host = https://workspace2.cloud.databricks.com
token = dapiYYYYYYYYYYYYYYYYYYYYYYYY
[DEVELOPMENT]
host = https://workspace3.cloud.databricks.com
token = dapiZZZZZZZZZZZZZZZZZZZZZZZZ
Se preferir não usar perfis de configuração, você pode especificar as credenciais diretamente:
# Define workspaces with explicit credentials
workspace_configs = [
{
'workspace_url': 'https://workspace1.cloud.databricks.com',
'token': 'dapiXXXXXXXXXXXXXXXXXXXXXXXX'
},
{
'workspace_url': 'https://workspace2.cloud.databricks.com',
'token': 'dapiYYYYYYYYYYYYYYYYYYYYYYYY'
}
]
# Run cleanup, set `dry_run=False` to perform actual deletion
results = cleanup_multiple_workspaces(workspace_configs, dry_run=True)
Excluir endpoint em um único workspace
Os pontos de extremidade do Vector Search são específicos do site workspace. Aqui está um script básico para localizar e excluir um endpoint vazio em um único workspace. Para limpar um ponto de extremidade vazio em vários espaços de trabalho, consulte Excluir ponto de extremidade em vários espaços de trabalho.
a exclusão do ponto final é irreversível. Use a opção dry_run=True
para ver uma lista do endpoint que será excluído. Depois que o senhor tiver confirmado que a lista está correta, execute o script com dry_run=False
.
from databricks.vector_search.client import VectorSearchClient
def cleanup_empty_endpoints(client, dry_run=True):
"""
Find and delete empty Vector Search endpoints.
Args:
client: VectorSearchClient instance
dry_run: If True, only print what would be deleted without actually deleting
Returns:
List of deleted endpoint names
"""
deleted_endpoints = []
# List all Vector Search endpoints
endpoints = client.list_endpoints()
for endpoint in endpoints["endpoints"]:
# List indexes in this endpoint
indexes = list(client.list_indexes(name=endpoint["name"])['vector_indexes'])
if len(indexes) == 0:
if dry_run:
print(f"[DRY RUN] Would delete empty endpoint: '{endpoint["name"]}'")
else:
print(f"Deleting empty endpoint: '{endpoint["name"]}'")
try:
client.delete_endpoint(endpoint["name"])
deleted_endpoints.append(endpoint["name"])
print(f"✓ Successfully deleted: {endpoint["name"]}")
except Exception as e:
print(f"✗ Failed to delete {endpoint["name"]}: {str(e)}")
else:
print(f"Endpoint '{endpoint["name"]}' has {len(indexes)} indexes - keeping")
return deleted_endpoints
# Example usage
client = VectorSearchClient() # Uses default authentication
# Set `dry_run=False` when you are ready to delete endpoints
deleted = cleanup_empty_endpoints(client, dry_run=True)
print(f"\nTotal endpoints deleted: {len(deleted)}")
Excluir endpoint em vários espaços de trabalho
Para limpar o ponto de extremidade vazio em vários espaços de trabalho, itere pelos perfis de configuração:
-
a exclusão do ponto final é irreversível. Use a opção
dry_run=True
para ver uma lista do endpoint que será excluído. Depois que o senhor tiver confirmado que a lista está correta, execute o script comdry_run=False
. -
Ao processar muitos espaços de trabalho, esteja atento aos limites de taxa do site API. Adicione atrasos, se necessário:
Pythonimport time
for config in workspace_configs:
# Set `dry_run=False` to perform actual deletion
result = cleanup_workspace(**config, dry_run=True)
time.sleep(2) # Add delay between workspaces
from databricks.sdk import WorkspaceClient
from databricks.vector_search.client import VectorSearchClient
import logging
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def cleanup_workspace(profile_name=None, workspace_url=None, token=None, dry_run=True):
"""
Clean up empty endpoints in a specific workspace.
Args:
profile_name: Name of configuration profile to use
workspace_url: Direct workspace URL (if not using profile)
token: PAT token (if not using profile)
dry_run: If True, only show what would be deleted
Returns:
Dict with cleanup results
"""
try:
# Initialize client based on authentication method
if profile_name:
# Use Databricks SDK to get credentials from profile
w = WorkspaceClient(profile=profile_name)
workspace_url = w.config.host
client = VectorSearchClient(
workspace_url=workspace_url,
personal_access_token=w.config.token
)
logger.info(f"Connected to workspace using profile '{profile_name}': {workspace_url}")
elif workspace_url and token:
client = VectorSearchClient(
workspace_url=workspace_url,
personal_access_token=token
)
logger.info(f"Connected to workspace: {workspace_url}")
else:
# Use default authentication (notebook context)
client = VectorSearchClient()
logger.info("Connected using default authentication")
# Perform cleanup
deleted = cleanup_empty_endpoints(client, dry_run=dry_run)
return {
'workspace': workspace_url or 'default',
'success': True,
'deleted_count': len(deleted),
'deleted_endpoints': deleted
}
except Exception as e:
logger.error(f"Failed to process workspace: {str(e)}")
return {
'workspace': workspace_url or profile_name or 'default',
'success': False,
'error': str(e)
}
def cleanup_multiple_workspaces(workspace_configs, dry_run=True):
"""
Clean up empty endpoints across multiple workspaces.
Args:
workspace_configs: List of workspace configurations
dry_run: If True, only show what would be deleted
Returns:
Summary of cleanup results
"""
results = []
for config in workspace_configs:
logger.info(f"\n{'='*60}")
result = cleanup_workspace(**config, dry_run=dry_run)
results.append(result)
logger.info(f"{'='*60}\n")
# Print summary
total_deleted = sum(r['deleted_count'] for r in results if r['success'])
successful = sum(1 for r in results if r['success'])
failed = sum(1 for r in results if not r['success'])
logger.info("\n" + "="*60)
logger.info("CLEANUP SUMMARY")
logger.info("="*60)
logger.info(f"Workspaces processed: {len(results)}")
logger.info(f"Successful: {successful}")
logger.info(f"Failed: {failed}")
logger.info(f"Total endpoints deleted: {total_deleted}")
if failed > 0:
logger.warning("\nFailed workspaces:")
for r in results:
if not r['success']:
logger.warning(f" - {r['workspace']}: {r['error']}")
return results
# Example: Clean up using configuration profiles
workspace_configs = [
{'profile_name': 'DEFAULT'},
{'profile_name': 'PRODUCTION'},
{'profile_name': 'DEVELOPMENT'}
]
# Set `dry_run=False` to do actual deletion.
results = cleanup_multiple_workspaces(workspace_configs, dry_run=True)
Filtragem personalizada
O senhor pode adicionar lógica personalizada para excluir determinados endpoints da exclusão, conforme mostrado:
def should_delete_endpoint(endpoint, indexes):
"""
Custom logic to determine if an endpoint should be deleted.
Args:
endpoint: Endpoint object
indexes: List of indexes in the endpoint
Returns:
Boolean indicating if endpoint should be deleted
"""
# Don't delete if it has indexes
if len(indexes) > 0:
return False
# Don't delete endpoints with specific naming patterns
protected_patterns = ['prod-', 'critical-', 'do-not-delete']
for pattern in protected_patterns:
if pattern in endpoint.name.lower():
logger.warning(f"Skipping protected endpoint: {endpoint.name}")
return False
# Add more custom logic as needed
return True
Exportar resultados
Para salvar os resultados da limpeza em um arquivo para auditoria:
import json
from datetime import datetime
def export_results(results, filename=None):
"""Export cleanup results to JSON file."""
if not filename:
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f'vector_search_cleanup_{timestamp}.json'
with open(filename, 'w') as f:
json.dump({
'timestamp': datetime.now().isoformat(),
'results': results
}, f, indent=2)
logger.info(f"Results exported to: {filename}")
Solução de problemas
Problemas de autenticação
- Verifique se os tokens PAT são válidos e não expiraram.
- Verifique se os perfis de configuração estão formatados corretamente.
- Verifique se seus tokens têm as permissões necessárias.
Erros de permissão
Verifique se o seu usuário ou entidade de serviço tem permissão CAN_MANAGE
para o endpoint do Vector Search.
Problemas de rede
Para ambientes com requisitos de proxy, configure o SDK adequadamente:
import os
os.environ['HTTPS_PROXY'] = 'http://your-proxy:po
Próximos passos
- Programar esse script para ser executado periodicamente usando LakeFlow Jobs.
- Integre-se com seu site Infrastructure-as-Code pipeline.
- Adicione notificações do email ou do Slack para resumos de limpeza.
- Crie um painel para monitorar o uso do endpoint em todo o espaço de trabalho.