Introduktion
Apache HBase Medium Object Storage (MOB)-funktionen blev introduceret af HBASE-11339. Denne funktion forbedrer læse- og skriveadgang med lav forsinkelse for værdier af moderat størrelse (ideelt fra 100K til 10 MB baseret på vores testresultater), hvilket gør den velegnet til lagring af dokumenter, billeder og andre objekter af moderat størrelse [1]. Apache HBase MOB-funktionen opnår denne forbedring ved at adskille IO-stier for filreferencer og MOB-objekter, anvende forskellige komprimeringspolitikker på MOB'er og dermed reducere skriveforstærkning skabt af HBase's komprimeringer. MOB-objekterne er gemt i en speciel region, kaldet MOB-regionen. MOB-objekter for én tabel gemmes i MOB-regionen som MOB-filer, hvilket betyder, at der vil være masser af MOB-filer i denne region. Se venligst figur 1 fra [1] for Apache HBase MOB-arkitektur.
Figur 1 Apache HBase MOB-arkitektur
I starten er MOB-filer relativt små (mindre end 1 eller 2 HDFS-blokke). For at forbedre Apache HDFS-effektiviteten flettes MOB-filer med jævne mellemrum til større filer via en operation kaldet MOB-komprimering , som er uafhængig af den normale komprimeringsproces. Den oprindelige version af MOB-komprimering omskriver de flere MOB-filer fra en bestemt dag til større MOB-filer for den dag. Lad os bruge eksempelfillisten nedenfor for at gøre dette klarere. Tabel t1 har to områder (r1, r2), den har en søjlefamilie (f1), og MOB aktiveret. Du kan se, at der er to præfikser; D279186428a75016b17e4df5ea43d080 svarer til hashværdien af startnøglen for region r1 og D41d8cd98f00b204e9800998ecf8427e til hashværdien af startnøglen for region r2. For region r1 er der to MOB-filer hver den 1/1/2016 og 1/2/2016, og for region r2 er der 3 MOB-filer den 1/1/2016 under MOB region, som er /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 komprimeres to MOB-filer den 1/1/2016 og 1/2/2016 for region r1 til én fil for hver dag. Tre MOB-filer den 1/1/2016 for region r2 er komprimeret til én fil.
D279186428a75016b17e4df5ea43d08020160101 f49a9d9713ab2fb4a8b825485f6a8acf
D279186428a75016b17e4df5ea43d08020160102 bc9176d09424e49a9d9065caf9713ab2
D41d8cd98f00b204e9800998ecf8427e20160101 d9cb0954af623c2345f1b241887721e3
Da kun MOB-filer fra den samme dag for en region kan komprimeres sammen, vil minimumsgrænsen for MOB-filer under den enkelte MOB-regionbibliotek for en specifik familie på et år være 365 x antallet af regioner. Med 1000 regioner vil der om 10 år være 365 x 1000 x 10, 3,65 millioner filer efter MOB-komprimering, og det bliver ved med at vokse! Desværre har Apache HDFS en hukommelsesbegrænset grænse for antallet af filer under en mappe [2]. Efter antallet af MOB-filer overstiger denne HDFS-grænse, er MOB-tabellen ikke længere skrivbar. Standard maksimalt antal filer under én mappe for Apache HDFS er 1 million. For 1.000 regioner vil den nå denne grænse om cirka 3 år. Med flere regioner vil den nå grænsen hurtigere.
HBASE-16981 introducerer ugentlige og månedlige Aggregeringspolitikker for MOB-komprimering af partitioner for at forbedre dette MOB-filantal skaleringsproblem med faktorer på henholdsvis 7 eller ~30.
Design af ugentlige og månedlige MOB-komprimeringspartitionspolitikker (HBASE-16981)
Den grundlæggende idé med HBASE-16981 er at komprimere MOB-filer på en kalenderuge eller en kalendermåned til færre, større filer. Kalenderugen er defineret af ISO 8601, den starter mandag og slutter søndag. Normalt med ugentlig politik vil der efter MOB-komprimering være én fil om ugen pr. region; med månedlig politik vil der efter MOB-komprimering være én fil pr. måned pr. region. Antallet af MOB-filer under MOB-regionbiblioteket for en specifik familie på et år vil blive reduceret til 52 x antallet af regioner med ugentlig politik og 12 x antallet af regioner med månedlig politik. Dette reducerer i høj grad antallet af MOB-filer efter komprimering.
Den oprindelige foreslåede tilgang
Når MOB-komprimering sker, udvælger og samler HBase-master MOB-filer inden for en kalendermåned eller en kalenderuge til færre, større filer. Afhængigt af hvor ofte MOB-komprimering sker, er det muligt, at filer komprimeres flere gange. Lad os som et eksempel sige, at MOB-komprimeringsoperationen sker dagligt med månedlig aggregeringspolitik. På dag 1 komprimerer MOB-komprimering alle filer for dag 1 til én fil. På dag 2 komprimerer MOB-komprimering filen fra dag 1 og filer fra dag 2 til en ny fil; på dag 3 vil MOB-komprimering komprimere fil fra dag 2 og filer fra dag 3 til en ny fil, det fortsætter indtil den sidste dag i måneden. I dette tilfælde komprimeres filer fra dag 1 mere end 30 gange og forstærker dermed mængden af skrive-IO med mere end 30x.
Designmålet med Apache HBase MOB er at reducere skriveforstærkning skabt af MOB-komprimering. Denne naive tilgang besejrer designmålet.
Den endelige implementerede tilgang
For at overvinde manglen ved den oprindelige foreslåede tilgang, er trinvis MOB-komprimering vedtaget for nye ugentlige og månedlige politikker i HBASE-16981. Figur 2 viser, hvordan det fungerer med månedlig politik, det fungerer på samme måde for ugentlig politik.
Figur 2 Iscenesættelse af MOB-komprimering med månedlig politik
Som figur 2 viser, sker MOB-komprimering den 15.11.2016. Filer i den aktuelle kalenderuge komprimeres baseret på daglig partition med konfigureret MOB-tærskel. I figur 2 er filer for 14/11/2016 komprimeret sammen, og filer for 15/11/2016 er komprimeret sammen. Filer i de seneste kalenderuger i den aktuelle måned komprimeres baseret på ugentlig partition med ugentlig tærskel (konfigureret-MOB-tærskel x 7). I figur 2 er filer fra 1/11/2016 til 11/6/2016 komprimeret sammen, og filer fra 11/7/2016 til 13/11/2016 er komprimeret sammen. Filer i de seneste måneder er komprimeret baseret på månedlig partition med månedlig tærskel (konfigureret-MOB-tærskel x 28). I figur 2 er filer fra 10/1/2016 til 31/10/2016 komprimeret sammen. Som man måske bemærker, er den første kalenderuge i november 2016 fra 31.10.2016 til 6.11.2016. Da 31/10/2016 er i den seneste måned, komprimeres filer for den dag baseret på månedlig partition, dette efterlader kun 6 dage for den ugentlige partition (11/1/2016 ~ 11/6/2016). Efter komprimering er der 5 filer, hvis MOB-komprimeringstærskel og MOB-komprimeringsbatchstørrelse er konfigureret korrekt.
Med dette design gennemgår MOB-filer 2-trins eller 3-trins komprimering. På hvert trin anvendes en daglig partition, ugentlig partition eller månedlig partition med stigende MOB-komprimeringstærskel. MOB-filer komprimeres højst 3 gange normalt med månedlig politik og højst 2 gange normalt med ugentlig politik i deres levetid.
For flere detaljer om designet, se venligst [3].
Brug
Som standard er MOB-komprimeringspartitionspolitikken daglig. For at anvende ugentlig eller månedlig politik er der tilføjet en ny attribut MOB_COMPACT_PARTITION_POLICY for MOB-kolonnefamilien. Brugeren kan indstille denne egenskab, når du opretter en tabel fra HBase-skallen.
>create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}
Brugeren kan også ændre den eksisterende tabels MOB_COMPACT_PARTITION_POLICY fra HBase-skallen.
>alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}
Hvis politikken ændres fra daglig til ugentlig eller månedlig, eller fra ugentlig til månedlig, vil den næste MOB-komprimering komprimere MOB-filer, der er blevet komprimeret med den tidligere politik. Hvis politikken ændres fra månedlig eller ugentlig til daglig, eller fra månedlig til ugentlig, vil de allerede komprimerede MOB-filer med den tidligere politik ikke blive komprimeret igen med den nye politik.
Konklusion
HBASE-16981 løser problem med filnummerskalering med Apache HBase MOB. Den vil være tilgængelig i Apache HBase 2.0.0-udgivelsen. CDH understøtter Apache HBase MOB i CDH 5.4.0+. HBASE-16981 er backporteret og vil være tilgængelig i CDH 5.11.0.
Anerkendelser
Særlig tak til Jingcheng Du og Anoop Sam John for hjælp til design og anmeldelse af HBASE-16981, Jonathan Hsieh og Sean Busbey for at anmelde bloggen.
Referencer
[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