Introduktion
Apache HBase Medium Object Storage (MOB)-funktionen introducerades av HBASE-11339. Den här funktionen förbättrar läs- och skrivåtkomst med låg latens för medelstora värden (helst från 100K till 10MB baserat på våra testresultat), vilket gör den väl lämpad för lagring av dokument, bilder och andra medelstora objekt [1]. Apache HBase MOB-funktionen uppnår denna förbättring genom att separera IO-sökvägar för filreferenser och MOB-objekt, tillämpa olika komprimeringspolicyer på MOB och därmed minska skrivförstärkningen som skapas av HBases komprimeringar. MOB-objekten lagras i en speciell region, som kallas MOB-regionen. MOB-objekt för en tabell lagras i MOB-regionen som MOB-filer, vilket innebär att det kommer att finnas massor av MOB-filer i denna region. Se figur 1 från [1] för Apache HBase MOB-arkitektur.
Figur 1 Apache HBase MOB-arkitektur
Inledningsvis är MOB-filer relativt små (mindre än 1 eller 2 HDFS-block). För att förbättra Apache HDFS-effektiviteten slås MOB-filer med jämna mellanrum samman till större filer via en operation som kallas MOB-komprimering , som är oberoende av den normala packningsprocessen. Den ursprungliga versionen av MOB-komprimering skriver om flera MOB-filer från en viss dag till större MOB-filer för den dagen. Låt oss använda exempelfillistan nedan för att göra detta tydligare. Tabell t1 har två regioner (r1, r2), den har en kolumnfamilj (f1) och MOB aktiverad. Du kan se att det finns två prefix; D279186428a75016b17e4df5ea43d080 motsvarar hashvärdet för startnyckeln för region r1 och D41d8cd98f00b204e9800998ecf8427e till hashvärdet för startnyckeln för region r2. För region r1 finns det två MOB-filer vardera den 1/1/2016 och 1/2/2016, och för region r2 finns det 3 MOB-filer den 1/1/2016 under MOB-region, vilket är /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
Efter MOB-komprimering komprimeras två MOB-filer den 1/1/2016 och 1/2/2016 för region r1 till en fil för varje dag. Tre MOB-filer den 1/1/2016 för region r2 komprimeras till en fil.
D279186428a75016b17e4df5ea43d08020160101 f49a9d9713ab2fb4a8b825485f6a8acf
D279186428a75016b17e4df5ea43d08020160102 bc9176d09424e49a9d9065caf9713ab2
D41d8cd98f00b204e9800998ecf8427e20160101 d9cb0954af623c2345f1b241887721e3
Eftersom endast MOB-filer från samma dag för en region kan komprimeras tillsammans, kommer minimigränsen för MOB-filer under den enda MOB-regionkatalogen för en specifik familj under ett år att vara 365 x antalet regioner. Med 1000 regioner, om 10 år, kommer det att finnas 365 x 1000 x 10, 3,65 miljoner filer efter MOB-komprimering, och det fortsätter att växa! Tyvärr har Apache HDFS en minnesbegränsad gräns för antalet filer under en katalog [2]. Efter att antalet MOB-filer överskrider denna HDFS-gräns är MOB-tabellen inte skrivbar längre. Det högsta tillåtna antalet filer under en katalog för Apache HDFS är 1 miljon. För 1 000 regioner kommer den att nå denna gräns om cirka tre år. Med fler regioner kommer den att nå gränsen snabbare.
HBASE-16981 introducerar veckovisa och månatliga Aggregeringspolicyer för MOB-komprimeringspartitioner för att förbättra detta MOB-filräkneskalningsproblem med faktorer på 7 respektive ~30.
Design av vecko- och månatlig MOB-komprimeringspartitionspolicy (HBASE-16981)
Grundidén med HBASE-16981 är att komprimera MOB-filer på en kalendervecka eller en kalendermånad till färre, större filer. Kalenderveckan definieras av ISO 8601, den börjar på måndag och slutar på söndag. Normalt, med veckopolicy, kommer det efter MOB-komprimering att finnas en fil per vecka per region; med månatlig policy, efter MOB-komprimering kommer det att finnas en fil per månad per region. Antalet MOB-filer under MOB-regionkatalogen för en specifik familj under ett år kommer att reduceras till 52 x antalet regioner med veckopolicy och 12 x antalet regioner med månadspolicy. Detta minskar avsevärt antalet MOB-filer efter komprimering.
Det ursprungliga föreslagna tillvägagångssättet
När MOB-komprimering sker, väljer och aggregerar HBase master MOB-filer inom en kalendermånad eller en kalendervecka till färre, större filer. Beroende på hur ofta MOB-komprimering sker, är det möjligt att filer komprimeras flera gånger. Som ett exempel, låt oss säga att MOB-komprimeringsoperationen sker dagligen med månatlig aggregeringspolicy. På dag 1 komprimerar MOB-komprimering alla filer för dag 1 till en fil. På dag 2 komprimerar MOB-komprimering filen från dag 1 och filer från dag 2 till en ny fil; på dag 3 kommer MOB-komprimering att komprimera filen från dag 2 och filer från dag 3 till en ny fil, det fortsätter till den sista dagen i månaden. I det här fallet komprimeras filer från dag 1 mer än 30 gånger och förstärker därmed mängden skriv-IO med mer än 30x.
Designmålet för Apache HBase MOB är att minska skrivförstärkningen som skapas av MOB-komprimering. Detta naiva tillvägagångssätt besegrar designmålet.
Den slutgiltiga implementerade metoden
För att komma till rätta med bristen i det ursprungliga föreslagna tillvägagångssättet, antas stegvis MOB-komprimering för nya vecko- och månadspolicyer i HBASE-16981. Figur 2 visar hur det fungerar med månadspolicy, det fungerar på liknande sätt för veckopolicy.
Figur 2 Ställ in MOB-komprimering med månadspolicy
Som figur 2 visar sker MOB-komprimering den 15/11/2016. Filer i den aktuella kalenderveckan komprimeras baserat på daglig partition med konfigurerad MOB-tröskel. I figur 2 komprimeras filer för 11/14/2016 tillsammans och filer för 11/15/2016 komprimeras tillsammans. Filer under de senaste kalenderveckorna i den aktuella månaden komprimeras baserat på veckopartition med veckotröskel (configured-MOB-threshold x 7). I figur 2 komprimeras filer från 11/1/2016 till 11/6/2016 och filer från 11/7/2016 till 11/13/2016 komprimeras tillsammans. Filer under de senaste månaderna komprimeras baserat på månatlig partition med månatlig tröskel (configured-MOB-threshold x 28). I figur 2 komprimeras filer från 10/1/2016 till 10/31/2016. Som man kanske märker är den första kalenderveckan i november 2016 från 31/10/2016 till 11/6/2016. Eftersom 10/31/2016 är den senaste månaden, komprimeras filer för den dagen baserat på månatlig partition, detta lämnar bara 6 dagar för veckopartitionen (11/1/2016 ~ 11/6/2016). Efter komprimering finns det 5 filer om MOB-komprimeringströskeln och MOB-komprimeringssatsstorleken är korrekt konfigurerade.
Med denna design går MOB-filer igenom 2-stegs eller 3-stegs komprimering. I varje steg tillämpas en daglig partition, veckopartition eller månadspartition med ökande MOB-komprimeringströskel. MOB-filer komprimeras högst 3 gånger normalt med månadspolicy och högst 2 gånger normalt med veckopolicy under sin livstid.
För mer information om designen, se [3].
Användning
Som standard är MOB-komprimeringspartitionspolicyn daglig. För att tillämpa vecko- eller månadspolicy har ett nytt attribut MOB_COMPACT_PARTITION_POLICY lagts till för MOB-kolumnfamiljen. Användaren kan ställa in detta attribut när en tabell skapas från HBase-skalet.
>create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}
Användaren kan också ändra den befintliga tabellens MOB_COMPACT_PARTITION_POLICY från HBase-skalet.
>alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}
Om policyn ändras från dagligen till veckovis eller månadsvis, eller från veckovis till månadsvis, kommer nästa MOB-komprimering att komprimera MOB-filer som har komprimerats med den tidigare policyn. Om policyn ändras från månadsvis eller veckovis till dagligen, eller från månadsvis till veckovis, kommer de redan komprimerade MOB-filerna med den tidigare policyn inte att komprimeras igen med den nya policyn.
Slutsats
HBASE-16981 löser problem med filnummerskalning med Apache HBase MOB. Den kommer att finnas tillgänglig i Apache HBase 2.0.0-versionen. CDH stöder Apache HBase MOB i CDH 5.4.0+. HBASE-16981 är backporterad och kommer att finnas tillgänglig i CDH 5.11.0.
Bekräftelser
Särskilt tack till Jingcheng Du och Anoop Sam John för hjälp med design och granskning av HBASE-16981, Jonathan Hsieh och Sean Busbey för att de har granskat bloggen.
Referenser
[1] https://cloouderatemp.wpengine.com/blog/2015/06/inside-apache-hbases-new-support-for-mobs/
[2] https://cloouderatemp.wpengine.com/blog/2009/02/the-small-files-problem/
[3] https://issues.apache.org/jira/browse/HBASE-16981