Які плюси та мінуси формату паркету порівняно з іншими форматами?


136

Характеристики паркету Apache:

  • Самоописування
  • Стовпчастий формат
  • Незалежна від мови

У порівнянні з Avro, послідовними файлами, RC-файлами тощо, я хочу переглянути формати. Я вже читав: як працює Impala з форматами файлів Hadoop , вона дає деяку інформацію про формати, але я хотів би знати, як здійснюється доступ до даних та зберігання даних у кожному з цих форматів. Як паркет має перевагу перед іншими?


2
Приємне резюме можна знайти у цій презентації: посилання
Домінік

@ ani-menon Посилання мертва.
Саджад Хоссайн

@SajjadHossain оновлено.
Ані Менон

Відповіді:


282

Я думаю, що основна відмінність, яку я можу описати, стосується форматів, орієнтованих на запис, а також на стовпці. Формати, орієнтовані на запис - це те, до чого ми звикли - текстові файли, розмежовані формати, такі як CSV, TSV. AVRO трохи крутіше, ніж ті, тому що він може змінювати схему з часом, наприклад додавання або видалення стовпців із запису. Інші хитрощі різних форматів (особливо включаючи стиснення) передбачають, чи можна розділити формат - тобто чи можете ви прочитати блок записів з будь-якого місця набору даних і все ще знаєте, що це схема? Але ось детальніше про стовпчикові формати, як Паркет.

Паркет та інші стовпчасті формати вирішують загальну ситуацію Hadoop дуже ефективно. Зазвичай у таблицях (наборах даних) є набагато більше стовпців, ніж можна було б очікувати, у добре розробленій реляційній базі даних - сто чи двісті стовпців не є незвичайним. Це тому, що ми часто використовуємо Hadoop як місце для денормалізації даних із реляційних форматів - так, ви отримуєте безліч повторених значень і багато таблиць, зведених в одну. Але запитів стає набагато простіше, оскільки всі з'єднання відпрацьовані. Є й інші переваги, такі як збереження даних за станом часу. Тож у будь-якому випадку в таблиці є звичайне завантаження стовпчиків.

Скажімо, є 132 стовпчики, і деякі з них - це дійсно довгі текстові поля, кожен різний стовпець один за іншим, і може використовуватись до 10K на запис.

Хоча запит до цих таблиць простий з точки зору SQL, звичайно, що вам потрібно отримати деякий діапазон записів на основі лише декількох сто-плюс стовпців. Наприклад, ви можете зажадати всіх записів у лютому та березні для клієнтів із продажами> 500 доларів.

Для цього у форматі рядків запит повинен буде сканувати кожен запис набору даних. Прочитайте перший рядок, розберіть запис на поля (стовпці) та отримайте стовпці дати та продажу, включіть його у свій результат, якщо він задовольняє умові. Повторіть. Якщо у вас є 10 років (120 місяців) історії, ви читаєте кожен запис, щоб знайти два з цих місяців. Звичайно, це прекрасна можливість використовувати розділ на рік і місяць, але навіть ви читаєте та аналізуєте 10K кожного запису / рядка за ці два місяці, щоб дізнатися, чи продажі клієнта> 500 доларів.

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

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

Але чекай, стає краще. Якщо для вашого запиту потрібно було знати лише ці значення та ще декілька (скажімо, 10 із 132 стовпців) і не хвилювався цей стовпець у посібнику службовців, після того, як він вибрав правильні записи для повернення, він повинен був би перейти лише зараз повернутися до 10 стовпців, необхідних для відображення результатів, ігноруючи інші 122 зі 132 в нашому наборі даних. Знову ми пропускаємо багато читання.

(Примітка. З цієї причини стовпчикові формати - це невдалий вибір при прямих перетвореннях, наприклад, якщо ви об'єднуєте всі дві таблиці в один великий (німецький) набір результатів, який ви зберігаєте як нову таблицю, джерела у будь-якому разі сканується повністю, тому корисності читання не мають великої користі, і оскільки стовпчикові формати повинні більше пам’ятати про те, де знаходиться, вони використовують більше пам’яті, ніж подібний формат рядків).

Ще одна перевага стовпців: дані поширюються навколо. Щоб отримати єдиний запис, ви можете мати 132 працівників, які читають (і записують) дані з / в 132 різних місцях на 132 блоках даних. Так, для паралелізації!

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

Таким чином, ми читаємо набагато менше даних, щоб відповідати на поширені запити, можливо, паралельно читати і писати паралельно, а стиснення, як правило, працює набагато краще.

Стовпчик чудовий, коли ваша сторона вводу велика, а ваш вихід - відфільтрований підмножина: від великої до малої - великої. Не настільки вигідно, коли вхід і вихід приблизно однакові.

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

Сподіваюся, це допоможе відповісти хоча б на частину вашого запитання!


7
Відмінно. Дякую. Це дуже корисне резюме, якого не вистачає у багатьох документах проекту apache .. Ви згадуєте: "невеликі поля ... все в порядку за записом". Припустимо, у мене є проста таблиця userid: long і age: int, і я хочу знайти всіх користувачів у певному віці. Тут у мене дві колонки. Чи потрібно мені вказувати, коли індекс для замовлення, або ВСІ стовпці ефективно індексуються?
user48956

1
Що робити, якщо я використовую паркет для таймерів? Кілька стовпців (100+), у кожному стовпчику є сенсорні дані з різною частотою (від 100 Гц до 0,25 Гц). Це було б розумним рішенням?
guilhermecgs

53

Avro - це рядковий формат зберігання для Hadoop.

Паркет - це формат зберігання даних Hadoop на основі стовпців.

Якщо ваш випадок використання зазвичай сканує або отримує всі поля підряд у кожному запиті, Avro, як правило, є найкращим вибором.

Якщо у вашому наборі даних є багато стовпців, а ваш випадок використання, як правило, передбачає роботу з підмножиною цих стовпців, а не з цілими записами, Паркет оптимізований для такої роботи.

Джерело


26

Відповідь Тома досить детальна та вичерпна, але вас також може зацікавити це нескладне дослідження про Паркет проти Авро, яке було зроблене на Allstate Insurance, узагальнене тут:

"В цілому, Паркет показав або подібні, або кращі результати на кожному тесті [, ніж Avro]. Відмінності в запитах на більшій кількості наборів даних на користь Паркету частково зумовлені результатами стиснення; менше даних для Паркету, ніж у Avro. Avro не працював добре під час обробки всього набору даних, як підозрювали ".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.