Эффективное хранение ежедневных дампов в Hadoop HDFS

Я считаю, что общая схема использования Hadoop - это создание "озера данных" путем загрузки регулярных (например, ежедневных) моментальных снимков данных из операционных систем. Для многих систем скорость изменения изо дня в день обычно составляет менее 5% строк (и даже при обновлении строки могут изменяться только несколько полей).

Вопрос: Как можно структурировать такие исторические данные в HDFS, чтобы они были экономичны в использовании пространства и эффективны для доступа.

Конечно, ответ будет зависеть от того, как данные обычно доступны. На нашем кластере Hadoop:

  • Большинство заданий только читают и обрабатывают самую последнюю версию данных
  • Несколько рабочих мест обрабатывают период исторических данных (например, 1 - 3 месяца)
  • Несколько заданий обрабатывают все доступные исторические данные

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

Я знаю несколько вариантов, ни один из которых не кажется вполне удовлетворительным:

  1. Сохраняйте каждый полный дамп независимо как новый подкаталог. Это наиболее очевидный дизайн, простой и очень совместимый с парадигмой MapReduce. Я уверен, что некоторые люди используют этот подход, но мне интересно, как они оправдывают стоимость хранения? Предположим, что 1 ТБ загружается каждый день, тогда это 365 ТБ, добавляемых в кластер за год в основном дублированных данных. Я знаю, что в наши дни диски дешевы, но большинство разработчиков бюджета привыкли к расширению инфраструктуры пропорционально росту бизнеса, а не линейному росту со временем.

  2. Храните только отличия (дельта) от предыдущего дня. Это естественный выбор, когда исходные системы предпочитают отправлять обновления в форме дельт (образ мыслей, который, похоже, датируется временем, когда данные передавались между системами в виде компакт-дисков). Это более экономно, но сложнее получить правильные данные (например, как вы представляете удаление?), И, что еще хуже, это подразумевает необходимость для потребителей сканировать всю историю в стиле "поиска событий", чтобы получить в текущем состоянии системы.

  3. Сохраните каждую версию строки один раз, с начальной и конечной датой. Известный такими терминами, как "временные данные", этот шаблон очень часто появляется в хранилищах данных и, в более общем случае, в реляционной базе данных, когда необходимо хранить исторические значения. Когда строка изменится, обновите предыдущую версию, чтобы установить "дату окончания", а затем вставьте новую версию с сегодняшним днем ​​в качестве "даты начала". К сожалению, это не очень хорошо подходит для парадигмы Hadoop, где предпочтительны наборы данных только для добавления и отсутствует собственная концепция обновления строки (хотя этого можно достичь, перезаписав существующие файлы данных). Этот подход требует довольно сложной логики для загрузки данных, но по общему признанию может быть довольно удобно использовать данные с этой структурой.

(Стоит отметить, что все, что требуется, - это одно особенно изменчивое поле, которое меняется каждый день, чтобы последние опускались до той же эффективности использования пространства, что и вариант 1).

Итак... есть ли другой вариант, который сочетает в себе эффективность пространства с простотой использования?

1 ответ

Я бы предложил вариант 3, который учитывает только добавочную природу HDFS.

Вместо одного набора данных мы оставляем два с различными видами информации, которые хранятся отдельно:

  1. История строк с истекшим сроком, скорее всего, разделена по дате окончания (возможно, ежемесячно). К нему добавляются только строки, когда становятся известны их конечные даты.
  2. Коллекция снимков за определенные дни, включая, по крайней мере, самый последний день, вероятнее всего разделенные по дате снимка. Новые снимки можно добавлять каждый день, а старые снимки можно удалять через пару дней, поскольку их можно восстановить из текущего снимка и истории просроченных записей.

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

Pro: в соответствии с дополнением только природа HDFS.

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

Pro: Запросы, использующие историю, могут аналогичным образом выполняться безопасно, если они явно дают ограничение на последнюю "дату окончания", которая исключает любые последующие добавления строк с истекшим сроком действия во время их работы.

Con: Это не просто "обновление" или "перезапись" каждый день. На практике в HDFS это, как правило, должно быть реализовано посредством копирования и фильтрации в любом случае, так что на самом деле это не обман.

Против: Многие запросы должны объединить два набора данных. Чтобы облегчить это, мы можем создать представления или аналогичные, которые соответствующим образом объединяют два, чтобы создать нечто, похожее на вариант 3.

Con: Поиск последнего снимка требует поиска правильного раздела. Это может быть облегчено, если иметь представление, которое "переворачивается" на последний снимок каждый раз, когда доступен новый.

Другие вопросы по тегам