Ogni connessione HTTP stabilita dalla tua applicazione richiede una certa quantità di overhead. Le richieste dell'API Data Catalog supportano il raggruppamento e ti consentono di combinare più chiamate API in un'unica richiesta HTTP. Se devi effettuare molte piccole richieste e vuoi ridurre al minimo il sovraccarico delle richieste HTTP, ti consigliamo di utilizzare il batching HTTP.
Per ulteriori informazioni sull'utilizzo di batch HTTP con Google Cloud, consulta la documentazione del client Python per le API di Google.
Creazione di richieste batch HTTP in Python
Per utilizzare le richieste collettive per creare o manipolare le voci in Data Catalog, devi prima cercare le voci da modificare utilizzando catalog.search()
o entries.lookup()
.
A questo punto, segui questi passaggi per creare una richiesta batch HTTP utilizzando l'API Google Python:
- Crea un oggetto
BatchHttpRequest
chiamandonew_batch_http_request()
o con il costruttoreBatchHttpRequest()
. Puoi passare un callback, che verrà chiamato in risposta a ogni richiesta. - Chiama
add()
sull'oggettoBatchHttpRequest
per ogni richiesta da eseguire. Se hai passato un callback durante la creazione dell'oggettoBatchHttpRequest
, ogniadd()
potrebbe includere parametri da passare al callback. - Dopo aver aggiunto le richieste, chiama
execute()
sull'oggettoBatchHttpRequest
per eseguirle. La funzioneexecute()
si blocca fino a quando non sono stati chiamati tutti i callback.
Le richieste in un BatchHttpRequest
potrebbero essere eseguite in parallelo e non nell'ordine di esecuzione. Ciò significa che le richieste nello stesso batch non devono essere dipendenti tra loro. Ad esempio, non dovresti creare un EntryGroup
e un Entry
appartenente allo stesso nella stessa richiesta, poiché la creazione del Entry
potrebbe essere eseguita prima della creazione del EntryGroup
, causando un errore di esecuzione.
Richieste batch con endpoint regionali
Quando utilizzi le richieste batch HTTP con gli endpoint API regionali di Data Catalog, tutte le richieste API in un batch devono appartenere alla stessa regione. Quando esegui il batch, devi chiamare l'endpoint regionale corretto. Ad esempio, se le tue risorse si trovano in
us-central1
, chiama https://us-central1-datacatalog.googleapis.com/batch
.
API indipendenti dalla regione
Le API indipendenti dalla regione, come catalog.lookup
e entries.search
, possono essere raggruppate tra loro, ma non con API specifiche per regione.
Per le API indipendenti dalla regione, utilizza l'endpoint: https://datacatalog.googleapis.com/batch
.
Esempio
Questa applicazione Python di esempio mostra come utilizzare una richiesta batch HTTP per creare più tag da un modello di tag utilizzando l'API Data Catalog.
from googleapiclient.discovery import build from googleapiclient.http import BatchHttpRequest from oauth2client.service_account import ServiceAccountCredentials import uuid #-------------------------------------------------------------# # 0. Helper and initialization logic #-------------------------------------------------------------# # Set the environment configuration. service_key_file_location = '[SA_PATH]' project_id = '[MY_PROJECT_ID]' # Helper container to store results. class DataContainer: def __init__(self): self.data = {} def callback(self, request_id, response, exception): if exception is not None: print('request_id: {}, exception: {}'.format(request_id, str(exception))) pass else: print(request_id) self.data[request_id] = response # Helper function to build the Discovery Service config. def get_service(api_name, api_version, scopes, key_file_location): """ Get a service that communicates to a Google API. Args: api_name: The name of the API to connect to. api_version: The API version to connect to. scopes: A list auth scopes to authorize for the application. key_file_location: The path to a valid service account JSON key file. Returns: A service that is connected to the specified API. """ credentials = ServiceAccountCredentials.from_json_keyfile_name( key_file_location, scopes=scopes) # Build the service object. service = build(api_name, api_version, credentials=credentials) return service # Helper function to create a UUID for each request def generated_uui(): return str(uuid.uuid4()) def create_batch_request(callback): # For more info on supported regions # check: https://cloud.google.com/data-catalog/docs/concepts/regions region='us-datacatalog.googleapis.com' return BatchHttpRequest(batch_uri='https://{}/batch'.format(region), callback=callback) container = DataContainer() # Scope to set up the Discovery Service config. scope = 'https://www.googleapis.com/auth/cloud-platform' # Create service. service = get_service( api_name='datacatalog', api_version='v1', scopes=[scope], key_file_location=service_key_file_location) # Create the batch request config. batch = create_batch_request(container.callback) #-------------------------------------------------------------# # 1. Start by fetching a list of entries using search call #-------------------------------------------------------------# # Create the search request body. # This example searches for all BigQuery tables in a project. search_request_body = { 'query': 'type=TABLE system=BIGQUERY', 'scope': {'includeProjectIds': [project_id]} } # Generated a unique ID for the request. request_id = generated_uui() # Add the request to the batch client. batch.add(service.catalog().search(body=search_request_body), request_id=request_id) # Execute the batch request. batch.execute() # Uncomment to verify the full response from search. # print(container.data) response = container.data[request_id] results = response['results'] first_table = results[0] # Verify that a first table is present. print(first_table) second_table = results[1] # Verify that a second table is present print(second_table) #-------------------------------------------------------------------# # 2. Send the batch request to attach tags over the entire result set #-------------------------------------------------------------------# # Create a new container container = DataContainer() # Create a new batch request batch = create_batch_request(container.callback) # Set the template name config template_name = 'projects/[MY_PROJECT_ID]/locations/[MY-LOCATION]/tagTemplates/[MY-TEMPLATE-NAME]' for result in results: # Generated a unique id for request. request_id = generated_uui() # Add the entry name as the tag parent. parent=result['relativeResourceName'] # Create the tag request body. create_tag_request_body = { 'template': template_name, # CHANGE for your template field values. 'fields': {'etl_score': {'doubleValue': 0.5}} } # Add requests to the batch client. batch.add(service.projects().locations(). entryGroups().entries().tags(). create(body=create_tag_request_body, parent=parent), request_id=request_id) # Execute the batch request. # Since the Batch Client works with regions # If you receive [HttpError 400 errors] # 1. Verify the region you used to create the Batch client # 2. Verify the region where the Entry is located. # 3. verify the region of the parent tag template used by the tag. batch.execute() # Uncomment to verify the full response from tag creation. # print(container)