Использование объектов MOB в HBase

Обзор

Введение

Объекты среднего размера (Medium-sized object, MOB) — это тип данных, хранящихся в таблицах HBase, с порядком размера от 100 КБ до 10 МБ и более. Примерами таких объектов являются файлы изображений, документов, архивов и другие бинарные файлы.

Технически, HBase способен работать со значениями любых размеров, но объекты крупнее 100 КБ могут и будут отрицательно влиять на производительность во время записи данных из MemStore в HFile: разделения регионов (region split) и сжатия (HFile compaction) неизбежно приведут к дублированию информации (write amplification). Чтобы избежать этого, можно определить семейства столбцов, содержащие крупные объекты в своих ячейках, как столбцы MOB. Ячейки, которые должны хранить MOB, будут хранить лишь указатели на настоящие файлы. Эти файлы, в свою очередь, хранятся в специальных MOB HFile, которые могут располагаться в любом заданном месте (HDFS или нет).

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

Архитектура

Изначально все данные, записываеме в HBase впервые, хранятся в WAL и MemStore. Когда MemStore, соответствующий семейству столбцов MOB, наполняется — он создает два HFile. Значения ячеек, меньшие заданного порога, записываются в обычный HFile. Значения ячеек большего или равного размера записываются в специальный MOB HFile, и одновременно с этим указатели на расположение этих значений записываются в соответствующие ячейки (ячейки указателей MOB) обычного HFile. После окончания записи из MemStore и закрытия соответствующего обычного HFile сервер регионов добавляет к нему метаданные. Эти метаданные содержат список всех MOB HFile, на которые имеются указатели в обычном HFile.

Значение ячейки указателя MOB состоит из двух частей: размер MOB и имя соответствующего MOB HFile. Она также имеет две метки: первая сообщает о том, что ячейка содержит указатель MOB, а вторая содержит пространство имен и название таблицы для MOB HFile. Эти метки могут помочь при поиске ячеек указателей MOB и для оптимизации способа обнаружения значений в MOB HFile, особенно после нескольких процедур снятия снепшота HBase. Эти метки по умолчанию не пересылаются с помощью RPC, поскольку они доступны лишь со стороны серверов HBase.

После создания или сжатия MOB HFile размещаются в специальном месте внутри корневой директории HBase в соответствии с их пространством имен, названием таблицы, логическим регионом MOB и названием семейства столбцов. Пример такого пути: /hbase/mobdir/data/default/table_with_mobs/463b0c18d2eb1a65b4b940837d6d0a08/mob_column/, где:

  • hbase — корневая директория HBase;

  • mobdir/data — подкаталог по умолчанию для MOB HFile;

  • default — название пространства имен;

  • table_with_mobs — имя таблицы;

  • 463b0c18d2eb1a65b4b940837d6d0a08 — идентификатор логического региона;

  • mob_column — имя семейства столбцов.

Обслуживание

Обслуживание MOB HFile выполняется регулярными рутинами (chores) на master-сервере HBase и серверах регионов. Они отвечают за соблюдение срока жизни (TTL) семейств столбцов и за сжатие HFile. Когда MOB HFile становится неактуальным после процедуры сжатия, рутина перемещает его в архив точно так же, как это происходит с обычными HFile. Регионы MOB независимы от обычных регионов, поэтому они используют то же расположение хранения архива. Пример пути к такому расположению: /hbase/archive/data/default/table_with_mobs/463b0c18d2eb1a65b4b940837d6d0a08/mob_column/.

Если существует снепшот таблицы, для которой включено использование MOB (или клон такого снепшота), то MOB HFile будут оставаться в архиве столько, сколько от них потребуют эти снепшоты. Рутины очистки удаляют MOB HFile из архива когда необходимость в них исчезает.

Сжатие

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

Если значения в ячейках MOB часто подвергаются изменениям или удалению, то это может привести к избыточному расходу пространства. Чтобы удалить MOB HFile и освободить пространство, необходимо убедиться, что никакие ячейки не содержат указателей на него, а его текущие значения должны быть записаны в новый MOB HFile. Также, если файловая система накладывает ограничение на максимальное количество содержащихся в ней файлов (например, HDFS), то даже если значения в ячейках MOB не подвергаются изменениям или удалению вовсе, MOB HFile будут накапливаться и потребуют сжатия.

Использование

Конфигурация столбцов MOB

В командной оболочке HBase shell за обозначение семейства столбцов MOB отвечают два параметра:

  • IS_MOB — логический параметр, определяющий, могут ли значения в ячейках столбцов являться MOB.

  • MOB_THRESHOLD — целочисленный параметр, указывающий количество байт, начиная с которого значение считается MOB.

Параметр MOB_THRESHOLD является необязательным. Если его не задавать — используется значение по умолчанию 102400 (100 КБ).

Пример команды в HBase shell для создания новой таблицы с семейством столбцов, предназначенным для хранения MOB:

create 'table_with_mobs', {NAME => 'mob_column', IS_MOB => true, MOB_THRESHOLD => 204800}

В этом примере создается таблица table_with_mobs с семейством столбцов mob_column для хранения MOB. Все значения размером более 200 КБ в этом семействе столбцов будут обрабатываться как MOB.

Пример команды в HBase shell для добавления нового семейства столбцов, предназначенного для хранения MOB:

alter 'table_with_mobs', {NAME => 'anoter_mob_column', IS_MOB => true, MOB_THRESHOLD => 153600}

В этом примере к таблице table_with_mobs добавляется семейство столбцов anoter_mob_column. Оно также предназначено для хранения MOB, а в качестве порога устанавливается размер 150 КБ.

Пример фрагмента кода для Java API, задающего семейство столбцов MOB:

HColumnDescriptor mob_column = new HColumnDescriptor("f");
mob_column.setMobEnabled(true);
mob_column.setMobThreshold(102400L);

В этом примере создается семейство столбцов mob_column для хранения MOB с порогом по умолчанию 100 КБ.

Конфигурация политики сжатия

Специальная рутина на master-сервере HBase периодически запускает процедуру полного сжатия как для обычных HFile, так и для MOB HFile. По умолчанию она выполняется раз в неделю, но это расписание можно изменить:

  1. Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.

  2. Перейдите в раздел Services → HBase → Primary configuration и активируйте переключатель Show advanced.

  3. Откройте секцию настроек Custom hbase-site.xml и нажмите Add property.

  4. В поле имени параметра введите hbase.mob.compaction.chore.period. В качестве значения параметра укажите периодичность в секундах. Например, сутки — 86400, месяц — 2592000. Нажмите Apply.

  5. Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.

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

  1. Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.

  2. Перейдите в раздел Services → HBase → Primary configuration и активируйте переключатель Show advanced.

  3. Откройте секцию настроек Custom hbase-site.xml и нажмите Add property.

  4. В поле имени параметра введите hbase.mob.major.compaction.region.batch.size. В качестве значения параметра укажите целочисленное ограничение. Ноль означает поведение рутины по умолчанию (все регионы работают одновременно). Нажмите Apply.

  5. Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.

Конфигурация политики архивации

Специальная рутина на master-сервере HBase периодически запускает процедуру архивации для MOB HFile, когда необходимость в них исчезает. MOB HFile отправляется в архив в двух случаях:

  • он старше времени жизни своего семейства столбцов;

  • нет обычных HFile ни в одном регионе, которые бы содержали указатели на него.

По умолчанию эта рутина выполняется раз в день. Этого достаточно в большинстве случаев. Однако если семейства столбцов MOB обновляются достаточно часто или имеют короткое время жизни, что приводит к частым сжатиям, может потребоваться изменение расписания этой рутины:

  1. Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.

  2. Перейдите в раздел Services → HBase → Primary configuration и активируйте переключатель Show advanced.

  3. Откройте секцию настроек Custom hbase-site.xml и нажмите Add property.

  4. В поле имени параметра введите hbase.master.mob.cleaner.period. В качестве значения параметра укажите периодичность в секундах. Нажмите Apply.

  5. Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.

Оптимизация

Конфигурация кеша MOB

Количество MOB HFile может быть велико по сравнению с обычными HFile, и поэтому они не всегда бывают открыты для чтения. Кеш открытых MOB HFile держит открытыми те из них, доступ к которым выполнялся позднее всего (кеш LRU). Можно настроить следующие параметры:

  • Размер кеша — ограничение на количество кешируемых обработчиков открытых файлов. Большой размер кеша может улучшить производительность, уменьшая количество повторных открытий и закрытий файлов. Слишком большой размер кеша может привести к ошибке.

  • Период вытеснения — тайм-аут для неиспользуемого открытого файла, после которого он закрывается и удаляется из кеша.

  • Фактор вытеснения — коэффициент от 0 до 1, определяющий, сколько файлов должно остаться в кеше при превышении его размера. При достижении ограничения на размер кеша общее количество обработчиков в нем умножается на этот коэффициент, и полученное количество наиболее используемых остается в кеше, а остальные вытесняются.

Чтобы добавить эти параметры, выполните следующее:

  1. Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.

  2. Перейдите в раздел Services → HBase → Primary configuration и активируйте переключатель Show advanced.

  3. Откройте секцию настроек Custom hbase-site.xml и нажмите Add property.

    Для задания одного или нескольких требуемых параметров используйте следующие значения:

    • Размер кеша — в поле имени параметра введите hbase.mob.file.cache.size. В качестве значения параметра укажите целочисленное ограничение. Значение по умолчанию — 1000.

    • Период вытеснения — в поле имени параметра введите hbase.mob.cache.evict.period. В качестве значения параметра укажите целочисленное значение в секундах. Значение по умолчанию — 3600 (один час).

    • Фактор вытеснения — в поле имени параметра введите hbase.mob.cache.evict.remain.ratio. В качестве значения параметра укажите дробный коэффициент от 0.0f до 1.0f. Значение по умолчанию — 0.5f.

  4. Нажмите Apply.

  5. Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.

Ручное сжатие

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

major_compact 'table_with_mobs'
major_compact 'table_with_mobs', 'mob_column'

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

Пример того же запроса в Java API:

Admin.majorCompact(table_with_mobs, mob_column);
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней