www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Конвертация паркета в AWS с использованием Airflow (часть 1)

Дата публикации Aug 26, 2019

В этой статье будет рассмотрено все, что касается паркета в облачных сервисах, оптимизированная структура папок S3, адекватный размер разделов, когда, почему и как использовать разделы, а затем, как использовать Airflow для организации всего.

Я не хочу тратить это место на изучение возможностей Airflow и на то, насколько он завершен. Есть много сообщений в Интернете, чтобы изучить его функциональность. Я бы лучшеразделэтот пост в следующие 4 части:

  1. Краткий обзор формата файла паркета
  2. Типы структур папок S3 и «как» правильная структура s3 может сэкономить затраты
  3. Адекватный размер и количество разделов для внешних таблиц (Redshift Spectrum, Athena, ADLA и т. Д.)
  4. Завершение с фрагментами Airflow (Следующие сообщения)

Формат файла паркета и виды компрессий

Что ж, есть несколько факторов в выборе идеального формата файла и сжатия, но следующие 5 охватывают изрядное количество арены:

  • Столбец против строки на основе:Каждый хочет использовать CSV до тех пор, пока вы не достигнете того объема данных, который либо практически невозможно просмотреть, либо он займет много места в вашем озере данных. И если ваши данные больше чем, чаще всего они имеют чрезмерное количество столбцов. Теперь, как мы знаем, не все столбцы являются информационными, и для запроса некоторых нам необходим формат, оптимизированный для столбцового выбора данных. Другими словами, когда вы импортируете его во внешние таблицы (Athena, Redshift Spectrum, Azure data lake Analytics и т. Д.) И выбираете столбец из данных паркета, он не будет и не должен загружать весь файл перед выбором нужного столбца. И если вы не используете инструменты с открытым исходным кодом, такие как Hive, в своем кластере Hadoop, вы в конечном итоге оплатите объем отсканированных данных.
  • Схема эволюции: Паркет поддерживает эволюцию схемы. Теперь большинство источников данных в какой-то момент развивают свою схему (добавление / удаление столбца, изменение типа данных и т. Д.), И если вы принимаете его в формате, который не поддерживает эволюцию схемы, вы не сможете прочитать это файл с бывшими загруженными файлами.
  • Сжатие поддерживаетсяТеперь, когда у вас есть выбранный формат файла, почему бы не включить в него сжатие, но выбрать правильный формат сжатия довольно сложно, потому что нужно выбирать между скоростью или степенью сжатия. Снейппи, безусловно, выигрывает эту битву, поскольку в ней великий баланс обоих миров. И, кроме того, паркет это поддерживает.
  • Место для храненияЯ полагаю, что многие читатели уже знают об этом, но паркет - это формат, настолько оптимизированный, что он занимает 1/10 пространства, чем CSV. Я знаю, что S3, BLOB-объект Azure или GCS стоят недорого, и буквально вы можете использовать его в качестве зоны приземления без каких-либо затрат, но через несколько лет, когда вы в конечном итоге будете использовать 10 ТБ пространства, вы поймете, что стоимость действительно идет вверх.
  • СамоописаниеВместе с каждым файлом Parquet выдает свои метаданные, такие как типы данных каждого столбца, которые всегда необходимы при разборе столбца или в тех случаях, когда данные должны быть отправлены в другую систему.

Я понимаю, что форматы файлов зависят от варианта использования. Например: если вы хотите прочитать все значения, тогда Avro лучше всего подходит, потому что это формат на основе строк (чтение пар ключ-значение), но тогда не у каждого варианта использования есть такие требования. Avro также хорошо подходит для интенсивных операций записи.

Структура папки S3 и как она может сэкономить

Теперь, как паркет и перегородки связаны между собой. Итак, до сих пор мы установили, что паркет является правильным форматом файлов для большинства случаев использования. Для простоты давайте предположим, что мы периодически принимаем данные, и для определения того, с какого периода времени они получены, давайте дадим ему имя файла, подобное этому, в s3 bucket «production»:

цифровой маркетинг / гггг-мм-dd.snappy.parquet

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

гггг / мм / дд / гггг-мм-dd.snappy.parquet

Другими словами, мы разбили данные на формат гггг / мм / дд. Все идет нормально. Код выбирает правильный ключ для обработки его для DWH. Теперь, спустя пару лет, мы получили электронное письмо о том, что наша DWH стоит на съемках, и нам нужно управлять этим. Но ученые данных говорят нам, что им нужны данные за последние 5 лет для исторического анализа, если не больше. Кроме того, у них также есть свои опасения, что из-за всех данных в DWH агрегирование становится чрезмерно медленным. А вот и внешние таблицы

Таким образом, следующий язык определения данных (DDL) спектра Redshift будет находиться в папке «s3: // production / digital-marketing / facebook / accounts / engagement /». Всегда приятно выровнять структуру хранилища (база данных / схема / таблица) с структурой озера данных. Ну, вы можете себе представить преимущества.

создать внешнюю таблицу facebook.accounts.engagement (
page_fans_new BIGINT,
page_fans BIGINT,
аккаунт VARCHAR (80),
дата ДАТА
)
разделено на (год char (4), месяц char (2), день char (2))
формат строки с разделителями
поля заканчиваются на ‘|’
местоположение ‘s3: // production / facebook / account / engagement /’
свойства таблицы («skip.header.line.count» = «1», «has_encrypted_data» = «false»);

И ключи / капли / файлы будут с этим именем.

facebook / счета / зацепления / гггг / мм / дд / гггг-мм-dd.snappy.parquet

И добавить данные ввнешнийтаблица, нужно выполнить следующую команду.

изменить таблицу facebook.accounts.engagement
добавить раздел (год = «2019», месяц = ​​«01», день = «01»)
местоположение s3: // production / facebook / account / engagement / year = 2019 / month = 01 / day = 01 / ’;

Поэтому, когда вы запустите указанную выше команду, она добавит 3 ключа раздела в свои метаданные, указывающие, из какого раздела происходит конкретная строка. Самое приятное то, что теперь нам не нужно сканировать всю таблицу, чтобы получить необходимые данные. Мы просто воспользуемся предложением «где», чтобы выбрать год, месяц и день, для которого нам нужно проанализировать данные. Но хуже всего то, что в метаданные будут добавлены 3 ключа раздела, которые являются анти-климатическими. Итак, давайте объединим три в один. Следующий DDL разделит данные наbatch_dateсо значениями, такими как «2019–01–01».

создать внешнюю таблицу facebook.accounts.engagement (
page_fans_new BIGINT,
page_fans BIGINT,
аккаунт VARCHAR (80),
дата ДАТА
)
разделено на (batch_date char (10))
формат строки с разделителями
поля заканчиваются на ‘|’
местоположение ‘s3: // production / facebook / account / engagement /’
свойства таблицы («skip.header.line.count» = «1», «has_encrypted_data» = «false»);

И чтобы добавить раздел, давайте воспользуемся приведенным ниже фрагментом:

изменить таблицу facebook.accounts.engagement
добавить раздел (batch_date = ’2019–01–01 ')
местоположение s3: // production / facebook / account / engagement / batch_date = 2019–01–01 / ’;

Теперь вместо 3 это добавит только 1 ключ раздела в метаданные, т.е. batch_date.

Более того, структура папок s3 / Blob / GCS во многом зависит от того, какой тип запроса вы используете для внешней таблицы. Если вы выполняете запрос ежедневно, тогда лучше использовать batch_date = YYYY-MM-DD, где каждый раздел должен иметь размер не менее 50–100 МБ, но не более 2 ГБ. Если вы запрашиваете почасово, то ГГГГ / ММ / ДД / ЧЧ. Потому что, если вы запрашиваете почасово, а ваша структура имеет ежедневный ГГГГ / ММ / ДД, то раздел не может быть добавлен до завершения дня. И если вы ежедневно запрашиваете почасовую разбивку, даже если файлы огромного размера, это может быть излишним, однако полезно делать это ежечасно, потому что в будущем аналитик захочет почасовой анализ, поскольку генерируемые данные огромны в 1. час. Таким образом, это ежедневные или почасовые разделы, но они не могут быть еженедельными или ежемесячными, потому что аналитик не хочет ждать месяц или неделю, чтобы получить новые данные.

Заметка: Удаление и добавление одних и тех же разделов (с обновленным файлом) является дорогостоящим, поскольку Redshift Spectrum или Athena выставляют счета за количество отсканированных данных.

Максимальное количество разделов, которое может иметь внешняя таблица, составляет 20 000, иначе это новая таблица.

Размер и количество перегородок

До сих пор мы разбивали данные на batch_date, но если вы используете Redshift, Spark или любой из подобных инструментов, вы можете выгрузить файл параллельно. Таким образом, вопрос в том, сколько файлов в одном разделе является оптимальным и какой должен быть идеальный размер раздела.

Данные раздела могут быть размером от 1 МБ до 10 ГБ, но желательно, чтобы размер раздела был не менее 50-100 МБ или больше, иначе чтение и анализ во внешней таблице займут много времени по сравнению с неразделенными данными.

Если общий размер ваших данных меньше, чем 10Gbs, тогда разделение вообще не требуется. В этом случае, поскольку данные не велики, вы можете иметь все файлы в одном каталоге, поскольку детализация структуры каталогов также снижает производительность. Но суть в том, что старайтесь сохранять количество файлов ниже 100, иначе запросы снова будут занимать много времени, так как он должен найти файл, открыть и прочитать его, что занимает больше времени, чем обработка результатов.

Заворачивать

Итак, выясните, какой уровень потребления данных (МБ / день) имеет ваш источник данных. Как правило, начинайте думать о разделах, когда ваша скорость загрузки превышает 500 МБ / день, и стремитесь к такой схеме разделов, где размер разделов составляет около 100 МБ-2 ГБ. Если данные имеют компонент времени, то сделайте так, чтобы ваш ключ раздела и затем на основе запросов решали, нужен ли раздел по дням или по часам

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

Вот часть 2:https://towardsdatascience.com/parquet-conversion-in-aws-using-airflow-part-2-8898029c49db


Гагандип Сингх - инженер данных - Австралийская радиовещательная корпорация (ABC) | LinkedIn

Присоединяйтесь к LinkedIn Gagandeep работал над проектами, включающими структурированные и неструктурированные данные следующих доменов и…

www.linkedin.com

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map