Въведение
Функцията Apache HBase Medium Object Storage (MOB) беше въведена от HBASE-11339. Тази функция подобрява достъпа за четене и запис с ниска латентност за стойности със среден размер (в идеалния случай от 100K до 10MB въз основа на резултатите от нашите тестове), което я прави много подходяща за съхранение на документи, изображения и други обекти със среден размер [1]. Функцията Apache HBase MOB постига това подобрение чрез разделяне на IO пътищата за препратки към файлове и MOB обекти, като прилага различни политики за уплътняване към MOB и по този начин намалява усилването при запис, създадено от уплътненията на HBase. MOB обектите се съхраняват в специален регион, наречен MOB регион. MOB обектите за една таблица се съхраняват в MOB региона като MOB файлове, което означава, че ще има много MOB файлове в този регион. Моля, вижте фигура 1 от [1] за архитектурата на Apache HBase MOB.
Фигура 1 Архитектура на Apache HBase MOB
Първоначално MOB файловете са сравнително малки (по-малко от 1 или 2 HDFS блока). За да се подобри ефективността на Apache HDFS, MOB файловете периодично се обединяват в по-големи файлове чрез операция, наречена MOB уплътняване , което е независимо от нормалния процес на уплътняване. Първоначалната версия на MOB уплътняването пренаписва множество MOB файлове от определен ден в по-големи MOB файлове за този ден. Нека използваме примерния списък с файлове по-долу, за да направим това по-ясно. Таблица t1 има два региона (r1, r2), има едно семейство колони (f1) и MOB е активиран. Можете да видите, че има два префикса; D279186428a75016b17e4df5ea43d080 съответства на хеш стойността на началния ключ за регион r1 и D41d8cd98f00b204e9800998ecf8427e на хеш стойността на стартовия ключ за регион r2. За регион r1 има по два MOB файла всеки на 1/1/2016 и 1/2/2016 , а за регион r2, има 3 MOB файла на 1/1/2016 в MOB регион, който е /hbase/data/ mobdir/data/default/t1/78e317a6e78a0fceb27b9fa0cb9dcf5b/f1.
>ls /hbase/data/mobdir/data/default/t1/78e317a6e78a0fceb27b9fa0cb9dcf5b/f1
D279186428a75016b17e4df5ea43d08020160101 f9d9713ab2fb4a8b825485f6a8acfcd5
D279186428a75016b17e4df5ea43d08020160101 af7713ab2fbf4a8abc5135f6a8467ca8
D279186428a75016b17e4df5ea43d08020160102 9013ab2fceda8b825485f6a8acfcd515
D279186428a75016b17e4df5ea43d08020160102 9a7978013ab2fceda8b825485f6a8acf
D41d8cd98f00b204e9800998ecf8427e20160101 fc94af623c2345f1b241887721e32a48
D41d8cd98f00b204e9800998ecf8427e20160101 d0954af623c2345f1b241887721e3259
D41d8cd98f00b204e9800998ecf8427e20160101 439adf4af623c2345f1b241887721e32
След MOB уплътняване, два MOB файла на 1/1/2016 и 1/2/2016 за регион r1 се уплътняват в един файл за всеки ден. Три MOB файла на 01.01.2016 г. за регион r2 са уплътнени в един файл.
D279186428a75016b17e4df5ea43d08020160101 f49a9d9713ab2fb4a8b825485f6a8acf
D279186428a75016b17e4df5ea43d08020160102 bc9176d09424e49a9d9065caf9713ab2
D41d8cd98f00b204e9800998ecf8427e20160101 d9cb0954af623c2345f1b241887721e3
Тъй като само MOB файлове от един и същи ден за регион могат да бъдат уплътнени заедно, минималната граница на MOB файловете в единичната директория на MOB регион за едно конкретно семейство за една година ще бъде 365 x брой региони. С 1000 региона след 10 години ще има 365 x 1000 x 10, 3,65 милиона файла след MOB уплътняване и продължава да расте! За съжаление, Apache HDFS има ограничение на паметта за броя на файловете в една директория [2]. След като броят на MOB файловете надхвърли това ограничение за HDFS, MOB таблицата вече не може да се записва. Максималният брой файлове по подразбиране в една директория за Apache HDFS е 1 милион. За 1000 региона ще достигне това ограничение след около 3 години. С повече региони ще достигне лимита по-бързо.
HBASE-16981 въвежда седмични и месечни политики за агрегиране на дялове за уплътняване на MOB, за да подобри този проблем с мащабирането на броя на MOB файловете с коефициенти съответно 7 или ~30.
Проектиране на седмични и месечни MOB политики за уплътняване на дялове (HBASE-16981)
Основната идея на HBASE-16981 е да се компактират MOB файлове за една календарна седмица или един календарен месец в по-малко, по-големи файлове. Календарната седмица е определена от ISO 8601, започва в понеделник и завършва в неделя. Обикновено, със седмична политика, след MOB уплътняване ще има един файл на седмица за регион; с месечна политика, след MOB уплътняване ще има един файл на месец за регион. Броят на MOB файловете в директорията на регионите MOB за едно конкретно семейство за една година ще бъде намален до 52 x брой региони със седмична политика и 12 x брой региони с месечна политика. Това значително намалява броя на MOB файловете след уплътняване.
Първоначалният предложен подход
Когато се случи MOB уплътняване, HBase master избира и агрегира MOB файлове в рамките на един календарен месец или една календарна седмица в по-малко, по-големи файлове. В зависимост от това колко често се случва уплътняването на MOB, е възможно файловете да бъдат уплътнени няколко пъти. Като пример, да кажем, че операцията за уплътняване на MOB се случва ежедневно с месечна политика за агрегиране. В ден 1, MOB уплътняването уплътнява всички файлове за ден 1 в един файл. На ден 2, MOB уплътняването уплътнява файла от ден 1 и файловете от ден 2 в нов файл; на ден 3, MOB уплътняването ще уплътни файла от ден 2 и файловете от ден 3 в нов файл, продължава до последния ден на месеца. В този случай файловете от ден 1 се уплътняват повече от 30 пъти и по този начин увеличават обема на запис IO с повече от 30x.
Целта на дизайна на Apache HBase MOB е да намали усилването при запис, създадено от уплътняването на MOB. Този наивен подход побеждава целта на дизайна.
Окончателният внедрен подход
За да се преодолее недостатъкът на първоначално предложения подход, е прието поетапно MOB уплътняване за нови седмични и месечни политики в HBASE-16981. Фигура 2 показва как работи с месечната политика, работи по подобен начин за седмичната политика.
Фигура 2 Поетапно уплътняване на MOB с месечна политика
Както показва Фигура 2, MOB уплътняването се случва на 15.11.2016 г. Файловете в текущата календарна седмица се уплътняват въз основа на дневен дял с конфигуриран праг на MOB. На фигура 2 файловете за 14.11.2016 г. са уплътнени заедно, а файловете за 15.11.2016 г. са уплътнени заедно. Файловете през последните календарни седмици на текущия месец се уплътняват въз основа на седмичен дял със седмичен праг (конфигуриран-MOB-праг x 7). На фигура 2 файловете от 1.11.2016 г. до 6.11.2016 г. са уплътнени заедно, а файловете от 7.11.2016 г. до 13.11.2016 г. са уплътнени заедно. Файловете през последните месеци се уплътняват въз основа на месечен дял с месечен праг (конфигуриран-MOB-праг x 28). На фигура 2 файловете от 1.10.2016 г. до 31.10.2016 г. са уплътнени заедно. Както може да се забележи, първата календарна седмица през ноември 2016 г. е от 31.10.2016 г. до 6.11.2016 г. Тъй като 31.10.2016 г. е в последния месец, файловете за този ден се уплътняват въз основа на месечния дял, това остава само 6 дни за седмичния дял (11.1.2016 ~ 6.11.2016). След уплътняването има 5 файла, ако прагът за уплътняване на MOB и размерът на партидата за уплътняване на MOB са конфигурирани по подходящ начин.
С този дизайн MOB файловете преминават през 2-етапно или 3-степенно уплътняване. На всеки етап се прилагат ежедневен дял, седмичен дял или месечен дял с увеличаване на прага на уплътняване на MOB. MOB файловете се уплътняват най-много 3 пъти нормално с месечна политика и най-много 2 пъти нормално със седмична политика през целия им живот.
За повече подробности относно дизайна, моля, вижте [3].
Употреба
По подразбиране политиката на MOB за уплътняване на дялове е ежедневна. За да приложите седмична или месечна политика, има добавен нов атрибут MOB_COMPACT_PARTITION_POLICY за семейство MOB колони. Потребителят може да зададе този атрибут, когато създава таблица от обвивката на HBase.
>create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}
Потребителят може също да промени MOB_COMPACT_PARTITION_POLICY на съществуващата таблица от обвивката на HBase.
>alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}
Ако политиката се промени от ежедневна на седмична или месечна, или от седмична на месечна, следващото MOB уплътняване ще уплътни повторно MOB файловете, които са били уплътнени с предишната политика. Ако политиката се промени от месечна или седмична на ежедневна или от месечна на седмична, вече уплътнените MOB файлове с предишната политика няма да бъдат повторно уплътнени с новата политика.
Заключение
HBASE-16981 решава проблема с мащабирането на номера на файла с Apache HBase MOB. Той ще бъде наличен във версия Apache HBase 2.0.0. CDH поддържа Apache HBase MOB в CDH 5.4.0+. HBASE-16981 е обратно пренесен и ще бъде наличен в CDH 5.11.0.
Поздравления
Специални благодарности на Jingcheng Du и Anoop Sam John за помощта при проектирането и прегледа на HBASE-16981, Jonathan Hsieh и Sean Busbey за прегледа на блога.
Препратки
[1] https://clouderatemp.wpengine.com/blog/2015/06/inside-apache-hbases-new-support-for-mobs/
[2] https://clouderatemp.wpengine.com/blog/2009/02/the-small-files-problem/
[3] https://issues.apache.org/jira/browse/HBASE-16981