2

Google アプリ エンジンで自分のアプリから BigQuery にクエリを実行していますが、BQ から奇妙な結果が返されることがあります (discovery#restDescription)。クエリしているデータの量が多い場合にのみ問題が発生するため、クエリが10秒以内にタイムアウトすることを理解するのに少し時間がかかりました。

ここで問題の適切な説明を見つけました: BigQuery クエリへの応答が悪い

GAE ドキュメントをもう一度読んだ後、HTTP リクエストは数秒以内に処理する必要があることがわかりました。したがって、これは推測にすぎませんが、bigquery も同じように自分自身を制限している可能性があるため、「数秒以内に」クエリに応答する必要があります。

これが事実である場合、まず第一に、私のbigqueryリクエストは確かに数秒以上かかるので、私は少し驚いています...しかし、とにかく、私は1秒のタイムアウトを強制的にテストしましたクエリを実行し、API 呼び出し getQueryResults をポーリングして queryResult を取得します。

その結果は非常に興味深いものです。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 呼び出しから返されるものです。メタデータでは、ステータスは「RUNNING」です。

{u'kind': u'bigquery#queryResponse', u'jobComplete': False, u'jobReference': {u'projectId': u'xxxxxxxxxxx', u'jobId': u'job_a1e74a6769f74cb997d998623b1b6b2e'}}

jobId を使用すると、準備が整った 26 秒後に結果を取得できます。

他に方法があるに違いない!私は何を間違っていますか?

4

0 に答える 0