Java-клиент Bigquery Api периодически возвращает неверные результаты

Я выполняю некоторые длительные запросы, используя Java-клиент с большим запросом.

Я создаю задание с большим запросом и выполняю его следующим образом.

val queryRequest = new QueryRequest().setQuery(query)
val queryJob = client.jobs().query(ProjectId, queryRequest)
queryJob.execute()

Проблема, с которой я сталкиваюсь, заключается в том, что для того же запроса клиент возвращается до завершения задания, т.е. количество строк в результате равно нулю.

Я попытался распечатать ответ, и он показывает

{"jobComplete":false,"jobReference":{"jobId":"job_bTLRGrw5_xR26i9Li3a9EQvuA6c","projectId":"analytics-production"},"kind":"bigquery#queryResponse"}

Из этого я вижу, что работа не завершена. Почему клиент вернулся до завершения задания?

При сборке клиента я использую HttpRequestInitializer и в методе инициализации задаю параметры времени ожидания.

override def initialize(request: HttpRequest): Unit = {
  request.setConnectTimeout(...)
  request.setReadTimeout(...)
}

Пробовал задавать высокие значения тайм-аута, например, 240 секунд и т. д., но безуспешно. Поведение остается прежним. Периодически выходит из строя.


person Vishal John    schedule 27.01.2015    source источник


Ответы (1)


Убедитесь, что вы установили тайм-аут в теле запроса Bigquery, а не в объекте HTTP.

val queryRequest = new QueryRequest().setQuery(query).setTimeoutMs(10000) //10 seconds

Параметр timeoutMs. Это задокументировано здесь: https://cloud.google.com/bigquery/docs/reference/v2/jobs/query

Также прочтите документацию, касающуюся этого поля: как долго ждать завершения запроса в миллисекундах, прежде чем запрос истечет и вернется. Обратите внимание, что это только время ожидания для запроса, а не запроса. Если выполнение запроса занимает больше времени, чем значение времени ожидания, вызов возвращается без каких-либо результатов и с флагом jobComplete, установленным в false. Вы можете вызвать GetQueryResults(), чтобы дождаться завершения запроса и прочитать результаты. Значение по умолчанию — 10000 миллисекунд (10 секунд).

Подробнее о синхронных запросах здесь
https://cloud.google.com/bigquery/querying-data#syncqueries

person Pentium10    schedule 27.01.2015
comment
Как связаны request.setReadTimeout() и setQuery().setTimeoutMs()? - person Vishal John; 27.01.2015
comment
setReadTimeout предназначен для самого соединения, пока оно остается открытым. setQuery timeout для самого запроса. - person Pentium10; 27.01.2015