2012-12-06 4 views
1

GoogleApp Engine을 사용 중이며 때때로 JSON API를 통해 BigQuery에 쿼리를 보낼 때 잘못된 결과가 표시됩니다. 일반적으로 BigQuery 내의 단일 테이블에만 국한됩니다 (생성되는 모든 배치 작업에 대해 새 테이블을 만듭니다). 프로덕션 환경에서이 문제가 발생하면 제출 된 쿼리를 기록한 다음 예상보다 오래 실행되지만 예상되는 결과를 반환하는 BigQuery 대시 보드를 통해 실행 해 봅니다.BigQuery 결과가 정확하게 반환되지 않습니다.

문제를 나타내는 응답에 아무것도 없습니다. jobCompleteTrue으로 표시되지만 rows은없고 jobReference, schematotalRows = 0입니다.

현재 전화가 결과를 반환해야한다고 생각하더라도 작업 결과를 얻기 위해 전화를 걸면 적절합니까?

관련 코드 :

http = httplib2.Http(memcache) 
self.credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/bigquery') 
self.http = self.credentials.authorize(http=http) 
self.service = build('bigquery','v2',http=self.http) 
jobs = self.service.jobs() 
result = jobs.query(projectId=settings.GOOGLE_APIS_PROJECT_ID, 
           body={'query': query}).execute() 

응답 :

{u'totalRows': u'0', u'kind': u'bigquery#queryResponse', u'jobComplete': True, u'jobReference': {u'projectId': u'<REMOVED>', u'jobId': u'<REMOVED>'}, u'schema': {u'fields': [<REMOVED>]}} 

상관없이 내가 생산, 같은 결과가 반환되는 쿼리 (이 때문에 수 있을까를 다시 실행하려고 얼마나 많은 시간을 잘못된 결과가 응답으로 캐싱되는 memcache를 통해 수행 된 캐싱)

+0

응답이 잘못되었다고 생각되는 직업의 jobid를 보낼 수 있습니까? –

+0

job_3729b36aa04148bbbb9625a1b4ce6190 – someone1

+2

공개 토론에서 검색어 세부 정보를 논의하지 않으려는 경우 google.com에서 내 성으로 이메일을 보내시겠습니까? (내 초기 조사를 통해 쿼리가 올바른 데이터를 반환하는 것처럼 보이지만 정확한 결과가 무엇인지,이 테이블에 대한 다른 쿼리가 예상대로 작동하는지 여부를 더 잘 이해하고 싶습니다.) –

답변

1

문제의 조합은 다음과 같습니다.

  1. 공유 http 객체는 threadsafe가 아닙니다! (https://developers.google.com/api-client-library/python/guide/thread_safety). GAE에서 사용하는 BigQuery의 대부분의 예는 공유 httplib2 객체를 사용하지만 잘못된 사용법입니다. 자격 증명 저장소 만 스레드가 안전하며 공유 할 수 있습니다.
  2. BigQuery의 쿼리에는 10 초의 시간 초과가 있습니다.

나는 공유 HTTP 오브젝트를 & Taskqueue를 사용하여 병렬로 BigQuery에 여러 통화를하고 있었는데 및 쿼리를 완료하는 데 10 초 이상 복용했다. 이것이 응답이 호출간에 섞여서 결과가 예상대로 나오지 않는 이유입니다. 예 : - 가끔 내 쿼리 요청에 발견 응답을받은

수정 :

BigQuery에 작업에 제출 통화 및 해제 몇 내 프로세스 사이의 httplib2 객체를 공유하지 내 BigQuery에 클라이언트 코드를 다시 쓰기 query() 호출을 사용하여 쿼리를 실행하십시오. 전화를 관리하고 상태를 확인하고 결과를받는 데 더 많은 오버 헤드가 있지만 적어도 현재는 작동하며 응답은 의미가 있습니다.

관련 문제