Использование объектов 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. По умолчанию она выполняется раз в неделю, но это расписание можно изменить:
-
Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.
-
Перейдите в раздел Services → HBase → Primary configuration и активируйте переключатель Show advanced.
-
Откройте секцию настроек Custom hbase-site.xml и нажмите Add property.
-
В поле имени параметра введите
hbase.mob.compaction.chore.period
. В качестве значения параметра укажите периодичность в секундах. Например, сутки —86400
, месяц —2592000
. Нажмите Apply. -
Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.
По умолчанию эта рутина указывает всем регионам выполнять сжатие одновременно и максимально загружает кластер. Можно сбалансировать нагрузку, установив ограничение на количество одновременно выполняемых сжатий в разных регионах:
-
Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.
-
Перейдите в раздел Services → HBase → Primary configuration и активируйте переключатель Show advanced.
-
Откройте секцию настроек Custom hbase-site.xml и нажмите Add property.
-
В поле имени параметра введите
hbase.mob.major.compaction.region.batch.size
. В качестве значения параметра укажите целочисленное ограничение. Ноль означает поведение рутины по умолчанию (все регионы работают одновременно). Нажмите Apply. -
Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.
Конфигурация политики архивации
Специальная рутина на master-сервере HBase периодически запускает процедуру архивации для MOB HFile, когда необходимость в них исчезает. MOB HFile отправляется в архив в двух случаях:
-
он старше времени жизни своего семейства столбцов;
-
нет обычных HFile ни в одном регионе, которые бы содержали указатели на него.
По умолчанию эта рутина выполняется раз в день. Этого достаточно в большинстве случаев. Однако если семейства столбцов MOB обновляются достаточно часто или имеют короткое время жизни, что приводит к частым сжатиям, может потребоваться изменение расписания этой рутины:
-
Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.
-
Перейдите в раздел Services → HBase → Primary configuration и активируйте переключатель Show advanced.
-
Откройте секцию настроек Custom hbase-site.xml и нажмите Add property.
-
В поле имени параметра введите
hbase.master.mob.cleaner.period
. В качестве значения параметра укажите периодичность в секундах. Нажмите Apply. -
Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.
Оптимизация
Конфигурация кеша MOB
Количество MOB HFile может быть велико по сравнению с обычными HFile, и поэтому они не всегда бывают открыты для чтения. Кеш открытых MOB HFile держит открытыми те из них, доступ к которым выполнялся позднее всего (кеш LRU). Можно настроить следующие параметры:
-
Размер кеша — ограничение на количество кешируемых обработчиков открытых файлов. Большой размер кеша может улучшить производительность, уменьшая количество повторных открытий и закрытий файлов. Слишком большой размер кеша может привести к ошибке.
-
Период вытеснения — тайм-аут для неиспользуемого открытого файла, после которого он закрывается и удаляется из кеша.
-
Фактор вытеснения — коэффициент от 0 до 1, определяющий, сколько файлов должно остаться в кеше при превышении его размера. При достижении ограничения на размер кеша общее количество обработчиков в нем умножается на этот коэффициент, и полученное количество наиболее используемых остается в кеше, а остальные вытесняются.
Чтобы добавить эти параметры, выполните следующее:
-
Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.
-
Перейдите в раздел Services → HBase → Primary configuration и активируйте переключатель Show advanced.
-
Откройте секцию настроек 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
.
-
-
Нажмите Apply.
-
Сохраните конфигурацию, нажав 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);