Я делаю запрос к BigQuery из своего приложения в движке приложений Google и иногда получаю странный результат от BQ (discovery#restDescription). Мне потребовалось некоторое время, чтобы понять, что проблема возникает только тогда, когда объем данных, которые я запрашиваю, высок, и, таким образом, мой запрос каким-то образом истекает в течение 10 секунд.
Я нашел хорошее описание моей проблемы здесь: Плохой ответ к запросу BigQuery
После повторного чтения документов GAE я обнаружил, что HTTP-запросы должны обрабатываться в несколько секунд. Итак, я предполагаю, и это только предположение, что bigquery также может ограничивать себя таким же образом и поэтому должен отвечать на мои запросы «в течение нескольких секунд».
Если это так, во-первых, я буду немного удивлен, потому что мои запросы bigquery наверняка будут занимать больше нескольких секунд... запрос, а затем получите queryResult, опросив вызов API getQueryResults.
Результат очень интересный. BigQuery возвращает что-то в течение 3 секунд, более или менее (а не 1, как я просил), а затем я получаю свои результаты позже, в течение 26 секунд путем опроса. Это похоже на обход проблемы тайм-аута 10 секунд.
Но я почти не вижу себя, выполняющего этот трюк в продакшене.
Кто-нибудь сталкивался с такой же проблемой с BigQuery? Что я должен делать, когда запрос длится более «несколько секунд»?
Вот код, который я использую для запроса:
query_config = {
'timeoutMs': 1000,
"defaultDataset": {
"datasetId": self.dataset,
"projectId": self.project_id
},
}
query_config.update(params)
result_json = (self.service.jobs()
.query(projectId=project,
body=query_config)
.execute())
И чтобы получить результаты, я опрашиваю это:
self.service.jobs().getQueryResults(projectId=project,jobId=jobId).execute()
А это журналы того, что происходит в BigQuery:
2012-12-03 12:31:19.835 /api/xxxxx/ 200 4278ms 0kb Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
xx.xx.xx.xx - - [03/Dec/2012:02:31:19 -0800] "GET /api/xxxxx/ HTTP/1.1" 200 243 ....... ms=4278 cpu_ms=346 cpm_usd=0.000426 instance=00c61b117c1169753678c6d5dac736b223809b
I 2012-12-03 12:31:16.060
URL being requested: https://www.googleapis.com/discovery/v1/apis/bigquery/v2/rest?userIp=xx.xx.xx.xx
I 2012-12-03 12:31:16.061
Attempting refresh to obtain initial access_token
I 2012-12-03 12:31:16.252
URL being requested: https://www.googleapis.com/bigquery/v2/projects/xxxxxxxxxxxx/queries?alt=json
I 2012-12-03 12:31:19.426
URL being requested: https://www.googleapis.com/bigquery/v2/projects/xxxxxxxx/jobs/job_a1e74a6769f74cb997d998623b1b6b2e?alt=json
I 2012-12-03 12:31:19.500
Это то, что мне возвращает вызов API запроса. И в метаданных статус «РАБОТАЕТ»:
{u'kind': u'bigquery#queryResponse', u'jobComplete': False, u'jobReference': {u'projectId': u'xxxxxxxxxxx', u'jobId': u'job_a1e74a6769f74cb997d998623b1b6b2e'}}
с помощью jobId я могу получить результаты через 26 секунд, когда они будут готовы.
Должен быть другой путь! Что я делаю неправильно?
timeoutMs
равно 1000 или 1 секунде. - person Eric Walker   schedule 15.05.2014