Как создать бэкэнд для отображения больших наборов данных в веб-интерфейсе - PullRequest
0 голосов
/ 13 марта 2020

У меня есть множество относительных данных временных рядов, разбитых на интервалы в один час в файлах паркета, хранящихся в aws s3 (для каждого часа один файл). Цель состоит в том, чтобы веб-приложение отображало эти данные. Поскольку мы не можем сканировать каждый паркет на s3 по запросу, мой подход будет заключаться в том, чтобы использовать процессы ETL для агрегирования этих рядов и сохранения их в виде одного паркета и в таблице DynamodB для различных агрегированных представлений, таких как год, месяц, неделя, день, час или даже минут. Кроме того, этот обработанный паркет будет доступен с aws athena для запроса (не из внешнего интерфейса, так как я ожидаю долгого времени ожидания для выполнения запросов)

1 Ответ

0 голосов
/ 13 марта 2020

Звучит как разумный план. Я предполагаю, что вам нужны некоторые указатели на то, как этого добиться?

В зависимости от размера вашего текущего набора данных и ваших требований для запроса его с помощью Athena вам может не понадобиться делать ETL.

Вы можете настроить таблицу с местоположением, которое является префиксом всех файлов Parquet (например, s3://example/dir/, если файлы хранятся с ключами, такими как s3://example/dir/2020/03/13/12/file.parquet). Если ваш общий набор данных не превышает пары гигабайт, я бы порекомендовал это. Если ваш набор данных больше и он организован в префиксы, содержащие каждый день или час, вы можете создать секционированную таблицу и добавить разделы с расположениями, которые используют структуру префикса (например, s3://example/dir/2020/03/13, s3://example/dir/2020/03/12 для ежедневных разделов или s3://example/dir/2020/03/13/11 и s3: // example / dir / 2020/03/13 / 12` для почасовых разделов). Если у вас нет сотен гигабайт данных в день или если запросы, которые вы будете выполнять с Athena, почти всегда смотрят только на несколько часов, я бы порекомендовал разбивать данные по дням, а не по часам, чтобы уменьшить количество разделов.

Если ваши существующие файлы Parquet очень маленькие, меньше ста мегабайт, и производительность для запросов Athena очень важна, вы можете попытаться ETL файлы в большие файлы, чтобы посмотреть, поможет ли это. Это может или не может, это будет зависеть. Я рекомендую вам использовать саму Афину для ETL. Вы можете использовать INSERT INTO для создания новых разделов в таблице на основе данных в другой таблице. Я предлагаю автоматизировать это путем создания правила Event Bridge с расписанием , которое либо запускает функцию Lambda, которая выполняет запрос преобразования в Афине, либо конечный автомат Step Functions, если вы хотите избежать оплаты за простоя Lambda ожидание запроса до фини sh (или нужно подождать более 15 минут). AWS имеет сервис под названием Glue ETL, который был создан для такого рода вещей, но, по моему опыту, он того не стоит. Использование функций Athena, Lambda и Step превосходит его с точки зрения удобства использования и гибкости.

Вы можете использовать тот же механизм для загрузки предварительно рассчитанных временных рядов в DynamoDB - используйте Event Bridge для планирования функции Lambda, которая выполняет запросы в Афине, и преобразовать результаты для хранения в DynamoDB. Используйте пошаговые функции, чтобы избежать оплаты простоя при ожидании окончания запросов sh.

Если Amazon Timestream когда-либо будет выпущен, это может быть лучшей целью для хранения временных рядов, чем DynamoDB. Также рассмотрите возможность сохранения предварительно рассчитанного временного ряда как JSON, CSV или Apache Стрелка на S3 вместо DynamoDB, что может быть дешевле и в некоторых отношениях проще в зависимости от вашего варианта использования.

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

...