Как заставить Афину обрабатывать несколько запросов одновременно - PullRequest
0 голосов
/ 15 апреля 2019

Я запускаю несколько параллельных запросов в Афину через приложение Python.

Учитывая историю запросов Афины, кажется, что все запросы действительно были получены Афиной одновременно и обрабатывались одновременно.

Однако оказывается, что общее время выполнения запроса не сильно отличается от отправки запросов один за другим.

Пример: отправка трех запросов последовательно и одновременно:

# sequentially
           received at       took      finished at
query_1       22:01:14         6s         22:01:20
query_2       22:01:20         6s         22:01:27
query_3       22:01:27         5s         22:01:25

# concurrently
           received at       took      finished at
query_1       22:02:25        17s         22:02:42
query_2       22:02:25        17s         22:02:42
query_3       22:02:25        17s         22:02:42

Согласно этим результатам, во втором случае кажется, что Афина, хотя и притворяется, что обрабатывает запросы одновременно, эффективно обрабатывает их последовательно.

Есть ли какая-то конфигурация, о которой я бы не знал, чтобы Афина эффективно обрабатывала несколько запросов одновременно? В идеале в этом примере три запроса, обрабатываемые одновременно, должны занимать глобальное время выполнения 6 с (самое длинное время из трех отдельных запросов).

Примечание: это три запроса, ориентированные на одну и ту же базу данных / таблицу и поддерживаемые одним и тем же (единственным) файлом Parquet в S3. Этот паркет файл ок. 70 МБ большой и имеет 2,5 М строк с полдюжины столбцов.

1 Ответ

1 голос
/ 16 апреля 2019

Как правило, вы выполняете параллельные запросы в Афине, чтобы выполнить столько вызовов StartQueryExecution, сколько вам нужно, собрать идентификаторы выполнения запроса, а затем выполнить опрос, используя GetQueryExecution для каждого из них, которые необходимо выполнить.Athena выполняет каждый запрос независимо, одновременно и асинхронно.

В зависимости от того, сколько времени вы ожидаете между опросом каждого ID выполнения запроса, может показаться, что запросы занимают различное количество времени.Вы можете использовать свойство Statistics.EngineExecutionTimeInMillis ответа от GetQueryExecution, чтобы увидеть, как долго выполняется запрос в Афине, и разницу между свойствами Status.SubmissionDateTime и Status.CompletionDateTime, чтобы увидеть общее время между тем, как Афина получила запрос икогда ответ был доступен.Обычно эти два числа очень близки, и если есть разница, ваш запрос был помещен в очередь внутри Афины.

Числа в вашем вопросе выглядят маловероятными.То, что они закончили в ту же секунду после пробега в течение 17 секунд, выглядит подозрительно.Сколько раз вы проводили эксперимент?Если вы посмотрите на Statistics.EngineExecutionTimeInMillis, они различаются по количеству миллисекунд или все числа идентичны?Вы установили ClientRequestToken, и если да, было ли это одинаковым значением для всех трех запросов (в этом случае вы фактически выполняли только один).

Что вы подразумеваете под «одновременно», запускаете ли вы иопрос из разных потоков или опрос в одном цикле?Как долго вы ждали между каждым опросом?

...