Каковы плюсы и минусы паркетного формата по сравнению с другими форматами?


характеристики паркета Apache:

  • самоописанием
  • колончатый формат
  • язык-независимая

по сравнению с Авро, файлы последовательности, RC-файл и т. д. Я хочу обзор форматов. Я уже читал:как Impala работает с форматами файлов Hadoop , это дает некоторое представление о форматах, но я хотел бы знать, как доступ к данным и хранение данных производится в каждом из этих форматов. Насколько паркет имеет преимущество перед другими?

3 78

3 ответа:

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

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

допустим, есть 132 столбца, и некоторые из них действительно длинные текстовые поля, каждый отдельный столбец один за другим и использовать до 10k за запись.

при запросе эти таблицы легко с точки зрения SQL, обычно вы хотите получить некоторый диапазон записей, основанный только на нескольких из этих сотен с лишним столбцов. Например, вам могут понадобиться все записи в феврале и марте для клиентов с продажами > $500.

для этого в формате строки запрос должен будет сканировать каждую запись набора данных. Прочитайте первую строку, разберите запись на поля (столбцы) и получите столбцы дата и продажи, включите его в свой результат, если он удовлетворяет состояние. Повторять. Если у вас есть 10 лет (120 месяцев) истории, Вы читаете каждую запись, чтобы найти 2 из этих месяцев. Конечно, это отличная возможность использовать раздел на год и месяц, но даже в этом случае Вы читаете и анализируете 10K каждой записи/строки за эти два месяца, чтобы узнать, являются ли продажи клиента > $500.

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

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

но подождите, это становится лучше. Если ваш запрос должен был знать только эти значения и еще несколько (скажем, 10 из 132 столбцов) и не заботился об этом столбце справочника сотрудника, как только он выбрал правильные записи для возврата, теперь ему нужно было только вернуться к 10 столбцам, необходимым для отображения результатов, игнорируя другие 122 из 132 в нашем наборе данных. Опять же, мы пропускаем много чтения.

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

еще одно преимущество столбчатого: данные распространяются вокруг. Чтобы получить одну запись, у вас может быть 132 работника, каждый из которых читает (и записывает) данные из / в 132 разных места на 132 блоках данных. Ура для распараллеливания!

а теперь самое главное: алгоритмы сжатия работают намного лучше, когда он может найти повторяющиеся модели. Вы можете сжать AABBBBBBCCCCCCCCCCCCCCCC Как 2A6B16C но ABCABCBCBCBCCCCCCCCCCCCCC не было бы так мало (ну, на самом деле, в этом случае это было бы, но поверьте мне :-) ). Так что еще раз, меньше читать. И писать тоже.

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

Columnar отлично подходит, когда ваша входная сторона большая, а ваш выход-это отфильтрованное подмножество: от большого до маленького. Не так выгодно, когда вход и выходы примерно одинаковы.

но в нашем случае Impala взяла наши старые запросы улья, которые выполнялись за 5, 10, 20 или 30 минут, и закончили большинство за несколько секунд или минуту.

надеюсь, это поможет ответить хотя бы на часть вашего вопроса!

Avro-это формат хранения на основе строк для Hadoop.

Parquet-это формат хранения на основе столбцов для Hadoop.

Если ваш вариант использования обычно сканирует или извлекает все поля в строке в каждом запросе, Avro обычно является лучшим выбором.

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

источник

ответ Тома довольно подробный и исчерпывающий, но вы также можете быть заинтересованы в Это простое исследование о паркете vs Avro сделано на Allstate Insurance, кратко здесь:

"в целом, паркет показал либо аналогичные, либо лучшие результаты по каждому тесту [чем Avro]. Различия в производительности запросов на больших наборах данных в пользу Parquet частично связаны с результатами сжатия; при запросе широкого набора данных Spark должен был читать в 3,5 раза меньше данных для Parquet, чем Авро. Avro не работал хорошо при обработке всего набора данных, как и предполагалось."