AWS Partition Projections Улучшение производительности запросов в Athena

Улучшение производительности запросов в Athena с помощью AWS Partition Projections

В современном дата-ориентированном мире организации все чаще обращаются к надежным решениям, таким как AWS Data Lake, для централизации огромных объемов структурированных и неструктурированных данных. AWS Data Lake, масштабируемое и безопасное хранилище данных, позволяет предприятиям сохранять данные в их исходном формате, облегчая различные задачи аналитики и машинного обучения. Одним из популярных инструментов для запросов этого огромного резервуара информации является Amazon Athena, безсерверный кластерный сервис интерактивных запросов, который позволяет легко анализировать данные непосредственно в Amazon S3 с использованием стандартного SQL. Однако с ростом объема данных возникают проблемы производительности. Большие наборы данных, сложные запросы и неоптимальная структура таблиц могут привести к увеличению времени выполнения запросов и затраты, что может уменьшить все выгоды, которые обеспечивают эти решения. В данной статье рассматриваются подробности использования разделения проекций для решения этих проблем производительности.

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

Что такое разделения в AWS Data Lake?

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

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

Зачем нужны разделения?

Эффективность: Без разделений запрос огромных наборов данных потребовал бы просмотра каждого файла, что является затратным и требует много времени. При использовании разделений сканируются только соответствующие каталоги, что значительно сокращает объем обрабатываемых данных.

  • Экономия затрат: В облачных средах, таких как AWS, где вы платите за объем сканированных данных, разделения могут привести к существенным снижению затрат.
  • Масштабируемость: С ростом данных растет и важность разделений. Они обеспечивают управляемые время восстановления в случае увеличения объема данных.

Проблемы с разделениями

Хотя разделения предлагают множество преимуществ, они не без своих проблем:

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

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

Что такое разделительные проекции?

Усечение разделений – это техника, при которой выбирается только необходимая метаинформация, специфичная для запроса, что исключает ненужные данные. Этот метод часто ускоряет выполнение запросов. Athena использует эту стратегию для всех таблиц с разделенными столбцами. В типичной ситуации, при обработке запросов Athena сначала связывается с каталогом данных AWS Glue, выполняя запрос GetPartitions, а затем выполняет усечение разделений. Однако, если таблица имеет большой набор разделений, это может замедлить выполнение операции.

Чтобы избежать этой затратной операции на таблице с большим количеством разделений, AWS предложил метод разделительных проекций. С разделительными проекциями Athena не нужно делать запрос GetPartitions. Вместо этого конфигурация, предоставленная в разделительной проекции, позволяет Athena сделать все необходимое для создания разделений самостоятельно.

Преимущества разделительных проекций

  • Улучшение производительности запросов: Сокращение объема обрабатываемых данных позволяет более быстро и эффективно выполнять запросы.
  • Снижение затрат: С Athena вы платите только за данные, которые сканируете. Благодаря сканированию меньшего объема данных затраты снижаются.
  • Упрощенное управление данными: Виртуальные разделения устраняют необходимость в непрерывных задачах обслуживания разделений, таких как добавление новых разделений при поступлении новых данных.

Настройка проекций разделов

Для использования проекций разделов:

1. Определить типы проекций: Athena поддерживает несколько типов проекций, включая `integer,` `enum,` `date` и `injected.` Каждый тип служит определенному использованию, например, для генерации диапазона целых чисел или дат.

2. Указать конфигурацию проекции: Это включает определение правил и шаблонов для ваших проекций. Например, для проекции даты вам необходимо указать начальную дату, конечную дату и формат даты.

3. Изменить свойства таблицы: После определения проекций, измените свойства вашей таблицы в Athena, чтобы использовать эти проекции.

Пример использования

Рассмотрим пример, где наши данные хранятся в озере данных и разделены по идентификатору клиента и дате (dt). Данные хранятся в формате Parquet, который является колоночным форматом данных.

s3://my-bucket/data/customer_id/yyyy-MM-dd/*.parquet

В нашем примере давайте предположим, что у нас есть данные за один год, т.е. 365 дней и 100 клиентов. Это приведет к 365 * 100 = 36500 разделов в озере данных.

Давайте сравним запросы к этой таблице с и без включенных проекций разделов.

Давайте получим количество всех записей за весь год для пяти клиентов.

Запрос

Без проекции раздела

Без включенных проекций разделов общее время выполнения запроса составляет 7.3 секунды. При этом на планирование запроса тратится 78%, а на выполнение – 20%.

Результаты запроса

Планирование: 78% = 5.6 секунды
Выполнение: 20% = 1.46

С проекциями разделов

Теперь давайте включим проекцию разделов для этой таблицы. Взгляните на все свойства таблицы, которые имеют суффикс “partition.*”. В этом примере у нас есть два раздела: dt и customer_id. Мы будем использовать проекцию типа “date” для даты и проекцию типа “enum” для customer_id. Для проекций enum типа вы можете создать автоматическую задачу для обновления свойств таблицы при появлении новых записей.

Результаты запроса

Планирование: 1.69 секунды
Выполнение: 0.6 секунды

Результат

Мы видим примерно 70% улучшение производительности запроса. Это происходит потому, что Athena избегает удаленного вызова AWS Glue для получения разделов, поскольку с помощью этой функции он может проецировать значения для этих разделов.

Ограничения и соображения

Хотя проекции разделов мощны, они не решают все проблемы.

  • Сложные настройки: Для настройки проекций требуется глубокое понимание ваших данных и принципов, которым они следуют.
  • Не всегда лучший вариант: Для наборов данных, не следующих предсказуемым шаблонам или имеющих неправильные обновления, традиционное разделение может быть более подходящим.

Заключение

Введение проекций разделов в Athena со стороны AWS является доказательством их стремления к улучшению опыта пользователей и эффективности. Используя эту функцию, организации могут достичь более быстрой производительности запросов с минимальными изменениями конфигурации. Как и с любым инструментом, понимание его преимуществ и ограничений является ключом к раскрытию его потенциала.