Тайм-аут на bigquery v2 от GAE

Я делаю запрос к 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 секунд, когда они будут готовы.

Должен быть другой путь! Что я делаю неправильно?


person Niko B    schedule 03.12.2012    source источник
comment
Обратите внимание, что ваше значение для timeoutMs равно 1000 или 1 секунде.   -  person Eric Walker    schedule 15.05.2014