non sono riuscito a ottenere il metodo urlfetch.set_default_fetch_deadline()
da applicare alle API Big Query, ma era in grado di aumentare il timeout quando autorizza la grande sessione di query come segue:
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
credentials = ServiceAccountCredentials.from_json_keyfile_dict(credentials_dict, scopes)
# Create an authorized session and set the url fetch timeout.
http_auth = credentials.authorize(Http(timeout=60))
# Build the service.
service = build(service_name, version, http=http_auth)
# Make the query
request = service.jobs().query(body=query_body).execute()
O con un approccio asincrono utilizzando jobs().insert
query_response = service.jobs().insert(body=query_body).execute()
big_query_job_id = query_response['jobReference']['jobId']
# poll the job.get endpoint until the job is complete
while True:
job_status_response = service.jobs()\
.get(jobId=big_query_job_id).execute()
if job_status_response['status']['state'] == done:
break
time.sleep(1)
results_respone = service.jobs()\
.getQueryResults(**query_params)\
.execute()
abbiamo finito per andare con un approccio simile a quello che Micha el suggerisce sopra, tuttavia, anche quando si utilizza la chiamata asincrona, il metodo getQueryResults
(impaginato con un piccolo parametro maxResults
) è scaduto durante il recupero dell'URL, generando l'errore indicato nella domanda.
Quindi, al fine di aumentare il timeout di recupero URL in Big Query/App Engine, impostare il timeout di conseguenza quando si autorizza la sessione.
fonte
2016-11-16 17:42:16
Perfetto. Grazie, Michael! – humanbeing