HBase
 sql >> Datenbank >  >> NoSQL >> HBase

Einführung in Apache HBase Medium Object Storage (MOB)-Komprimierungspartitionsrichtlinien

Einführung

Die Funktion Apache HBase Medium Object Storage (MOB) wurde von HBASE-11339 eingeführt. Diese Funktion verbessert den Lese- und Schreibzugriff mit geringer Latenz für mittelgroße Werte (idealerweise von 100 KB bis 10 MB, basierend auf unseren Testergebnissen), wodurch sie sich gut zum Speichern von Dokumenten, Bildern und anderen mittelgroßen Objekten eignet [1]. Die Apache HBase MOB-Funktion erreicht diese Verbesserung, indem sie IO-Pfade für Dateireferenzen und MOB-Objekte trennt, unterschiedliche Komprimierungsrichtlinien auf MOBs anwendet und so die durch HBases Komprimierungen erzeugte Schreibverstärkung reduziert. Die MOB-Objekte werden in einer speziellen Region gespeichert, die als MOB-Region bezeichnet wird. MOB-Objekte für eine Tabelle werden in der MOB-Region als MOB-Dateien gespeichert, was bedeutet, dass es in dieser Region viele MOB-Dateien geben wird. Siehe Abbildung 1 von [1] für die Apache HBase MOB-Architektur.

Abbildung 1 Apache HBase MOB-Architektur

Anfangs sind MOB-Dateien relativ klein (weniger als 1 oder 2 HDFS-Blöcke). Um die Effizienz von Apache HDFS zu verbessern, werden MOB-Dateien regelmäßig über einen Vorgang namens MOB-Komprimierung zu größeren Dateien zusammengeführt , die vom normalen Verdichtungsprozess unabhängig ist. Die ursprüngliche Version der MOB-Komprimierung schreibt die mehreren MOB-Dateien eines bestimmten Tages in größere MOB-Dateien für diesen Tag um. Lassen Sie uns die Beispieldateiliste unten verwenden, um dies klarer zu machen. Tabelle t1 hat zwei Regionen (r1, r2), sie hat eine Spaltenfamilie (f1) und MOB ist aktiviert. Sie können sehen, dass es zwei Präfixe gibt; D279186428a75016b17e4df5ea43d080 entspricht dem Hashwert des Startschlüssels für die Region r1 und D41d8cd98f00b204e9800998ecf8427e dem Hashwert des Startschlüssels für die Region r2. Für Region r1 gibt es jeweils zwei MOB-Dateien am 1.1.2016 und 1.2.2016 und für Region r2 gibt es 3 MOB-Dateien am 1.1.2016 unter der MOB-Region, die /hbase/data/ ist. 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

Nach der MOB-Komprimierung werden zwei MOB-Dateien am 1.1.2016 und 1.2.2016 für die Region r1 in eine Datei für jeden Tag komprimiert. Drei MOB-Dateien vom 1.1.2016 für die Region r2 werden zu einer Datei komprimiert.

D279186428a75016b17e4df5ea43d08020160101 f49a9d9713ab2fb4a8b825485f6a8acf

D279186428a75016b17e4df5ea43d08020160102 bc9176d09424e49a9d9065caf9713ab2

D41d8cd98f00b204e9800998ecf8427e20160101 d9cb0954af623c2345f1b241887721e3

Da nur MOB-Dateien vom selben Tag für eine Region zusammen komprimiert werden können, beträgt die Mindestgrenze von MOB-Dateien unter dem einzelnen MOB-Regionsverzeichnis für eine bestimmte Familie in einem Jahr 365 x Anzahl von Regionen. Bei 1000 Regionen wird es in 10 Jahren nach der MOB-Komprimierung 365 x 1000 x 10, 3,65 Millionen Dateien geben, und es werden immer mehr! Leider hat Apache HDFS ein speicherbeschränktes Limit für die Anzahl der Dateien in einem Verzeichnis [2]. Nachdem die Anzahl der MOB-Dateien dieses HDFS-Limit überschreitet, ist die MOB-Tabelle nicht mehr beschreibbar. Die standardmäßige maximale Anzahl von Dateien in einem Verzeichnis für Apache HDFS beträgt 1 Million. Bei 1.000 Regionen wird diese Grenze in etwa 3 Jahren erreicht. Mit mehr Regionen wird das Limit schneller erreicht.

HBASE-16981 führt wöchentliche und monatliche Richtlinien zur Aggregation von MOB-Komprimierungspartitionen ein, um dieses Skalierungsproblem der MOB-Dateianzahl um Faktoren von 7 bzw. ~30 zu verbessern.

Design von wöchentlichen und monatlichen MOB-Komprimierungspartitionsrichtlinien (HBASE-16981)

Die Grundidee von HBASE-16981 besteht darin, MOB-Dateien in einer Kalenderwoche oder einem Kalendermonat in weniger, größere Dateien zu komprimieren. Die Kalenderwoche ist durch ISO 8601 definiert, sie beginnt am Montag und endet am Sonntag. Normalerweise gibt es bei einer wöchentlichen Richtlinie nach der MOB-Komprimierung eine Datei pro Woche und Region; Bei einer monatlichen Richtlinie gibt es nach der MOB-Komprimierung eine Datei pro Monat und Region. Die Anzahl der MOB-Dateien im MOB-Regionsverzeichnis für eine bestimmte Familie in einem Jahr wird auf das 52-fache der Anzahl von Regionen mit wöchentlicher Richtlinie und das 12-fache der Anzahl von Regionen mit monatlicher Richtlinie reduziert. Dadurch wird die Anzahl der MOB-Dateien nach der Komprimierung erheblich reduziert.

Der ursprünglich vorgeschlagene Ansatz

Bei der MOB-Komprimierung wählt der HBase-Master MOB-Dateien aus und fasst sie innerhalb eines Kalendermonats oder einer Kalenderwoche in weniger, größere Dateien zusammen. Je nachdem, wie oft die MOB-Komprimierung stattfindet, ist es möglich, dass Dateien mehrfach komprimiert werden. Nehmen wir als Beispiel an, dass der MOB-Komprimierungsvorgang täglich mit einer monatlichen Aggregationsrichtlinie stattfindet. Am Tag 1 komprimiert die MOB-Komprimierung alle Dateien für Tag 1 in eine Datei. Am Tag 2 komprimiert die MOB-Komprimierung die Datei von Tag 1 und Dateien von Tag 2 in eine neue Datei; Am Tag 3 komprimiert die MOB-Komprimierung die Datei von Tag 2 und die Dateien von Tag 3 in eine neue Datei. Sie wird bis zum letzten Tag des Monats fortgesetzt. In diesem Fall werden Dateien von Tag 1 mehr als 30-mal komprimiert und damit die Menge an Schreib-IO um mehr als das 30-fache verstärkt.

Das Designziel von Apache HBase MOB ist es, die durch MOB-Komprimierung erzeugte Schreibverstärkung zu reduzieren. Dieser naive Ansatz macht das Designziel zunichte.

Der endgültig implementierte Ansatz

Um den Mangel des ursprünglich vorgeschlagenen Ansatzes zu überwinden, wird in HBASE-16981 eine gestufte MOB-Komprimierung für neue wöchentliche und monatliche Richtlinien übernommen. Abbildung 2 zeigt, wie es mit der monatlichen Police funktioniert, es funktioniert ähnlich mit der wöchentlichen Police.

Abbildung 2:Staging-MOB-Komprimierung mit monatlicher Richtlinie

Wie Abbildung 2 zeigt, findet die MOB-Verdichtung am 15.11.2016 statt. Dateien in der aktuellen Kalenderwoche werden basierend auf der täglichen Partition mit konfiguriertem MOB-Schwellenwert komprimiert. In Abbildung 2 werden Dateien für den 14.11.2016 zusammen komprimiert, und Dateien für den 15.11.2016 werden zusammen komprimiert. Dateien in den vergangenen Kalenderwochen des aktuellen Monats werden basierend auf einer wöchentlichen Partition mit wöchentlichem Schwellenwert (konfigurierter MOB-Schwellenwert x 7) komprimiert. In Abbildung 2 werden Dateien vom 1.11.2016 bis 6.11.2016 zusammen komprimiert und Dateien vom 7.11.2016 bis 13.11.2016 werden zusammen komprimiert. Dateien in den vergangenen Monaten werden basierend auf der monatlichen Partition mit monatlichem Schwellenwert (konfigurierter MOB-Schwellenwert x 28) komprimiert. In Abbildung 2 sind Dateien vom 1.10.2016 bis 31.10.2016 zusammen komprimiert. Wie man vielleicht bemerkt, geht die erste Kalenderwoche im November 2016 vom 31.10.2016 bis 6.11.2016. Da der 31.10.2016 im vergangenen Monat liegt, werden die Dateien für diesen Tag basierend auf der monatlichen Partition komprimiert, sodass nur 6 Tage für die wöchentliche Partition übrig bleiben (1.11.2016 ~ 6.11.2016). Nach der Komprimierung gibt es 5 Dateien, wenn der MOB-Komprimierungsschwellenwert und die MOB-Komprimierungsstapelgröße entsprechend konfiguriert sind.

Bei diesem Design durchlaufen MOB-Dateien zwei- oder dreistufige Komprimierungen. In jeder Phase wird eine tägliche Partition, wöchentliche Partition oder monatliche Partition mit zunehmendem MOB-Komprimierungsschwellenwert angewendet. MOB-Dateien werden normalerweise höchstens 3 Mal mit einer monatlichen Richtlinie und höchstens 2 Mal normalerweise mit einer wöchentlichen Richtlinie in ihrer Lebensdauer komprimiert.

Weitere Details zum Design finden Sie unter [3].

Verwendung

Standardmäßig ist die Partitionsrichtlinie für die MOB-Komprimierung täglich. Um eine wöchentliche oder monatliche Richtlinie anzuwenden, wurde ein neues Attribut MOB_COMPACT_PARTITION_POLICY für die MOB-Spaltenfamilie hinzugefügt. Der Benutzer kann dieses Attribut beim Erstellen einer Tabelle aus der HBase-Shell festlegen.

>create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}

Der Benutzer kann auch die MOB_COMPACT_PARTITION_POLICY der vorhandenen Tabelle über die HBase-Shell ändern.

>alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}

Wenn sich die Richtlinie von täglich zu wöchentlich oder monatlich oder von wöchentlich zu monatlich ändert, wird die nächste MOB-Komprimierung MOB-Dateien erneut komprimieren, die mit der vorherigen Richtlinie komprimiert wurden. Wenn die Richtlinie von monatlich oder wöchentlich auf täglich oder von monatlich auf wöchentlich geändert wird, werden die bereits komprimierten MOB-Dateien mit der vorherigen Richtlinie nicht erneut mit der neuen Richtlinie komprimiert.

Schlussfolgerung

HBASE-16981 löst das Skalierungsproblem der Dateinummer mit Apache HBase MOB. Es wird in der Version Apache HBase 2.0.0 verfügbar sein. CDH unterstützt Apache HBase MOB in CDH 5.4.0+. HBASE-16981 wurde zurückportiert und wird in CDH 5.11.0 verfügbar sein.

Danksagungen

Besonderer Dank gilt Jingcheng Du und Anoop Sam John für die Hilfe beim Design und der Überprüfung von HBASE-16981, Jonathan Hsieh und Sean Busbey für die Überprüfung des Blogs.

Referenzen

[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