Úvod
Apache HBase je Hadoop open-source, distribuovaný, verzovaný správce úložiště vhodný pro náhodné , čtení/zápis v reálném čase přístup.
Počkej počkej? náhodný přístup pro čtení/zápis v reálném čase?
Jak je to možné? Není Hadoop jen systém sekvenčního čtení/zápisu a dávkového zpracování?
Ano, mluvíme o stejné věci a v následujících několika odstavcích vám vysvětlím, jak HBase dosahuje náhodného I/O, jak ukládá data a jak se vyvíjí formát HFile HBase.
Formáty I/O souborů Apache Hadoop
Hadoop je dodáván s formátem souboru SequenceFile[1], který můžete použít k připojení vašich párů klíč/hodnota, ale vzhledem k možnosti pouze připojit hdfs formát souboru neumožňuje úpravu nebo odstranění vložené hodnoty. Jedinou povolenou operací je připojení, a pokud chcete vyhledat zadaný klíč, musíte soubor číst, dokud klíč nenajdete.
Jak vidíte, jste nuceni postupovat podle vzoru sekvenčního čtení/zápisu... ale jak je možné nad tím postavit náhodný systém přístupu pro čtení/zápis s nízkou latencí, jako je HBase?
Aby vám pomohl vyřešit tento problém, Hadoop má jiný formát souboru, nazvaný MapFile[1], rozšíření SequenceFile. MapFile je ve skutečnosti adresář, který obsahuje dva SequenceFile:datový soubor „/data“ a soubor indexu „/index“. MapFile vám umožňuje připojit seřazené páry klíč/hodnota a každých N klíčů (kde N je konfigurovatelný interval) uloží klíč a offset do indexu. To umožňuje poměrně rychlé vyhledávání, protože místo skenování všech záznamů skenujete index, který má méně záznamů. Jakmile najdete svůj blok, můžete přejít do skutečného datového souboru.
MapFile je pěkný, protože můžete rychle vyhledat páry klíč/hodnota, ale stále existují dva problémy:
- Jak mohu smazat nebo nahradit pár klíč/hodnota?
- Když můj vstup není seřazen, nemohu použít MapFile.
HBase &MapFile
Klíč HBase se skládá z:klíče řádku, skupiny sloupců, kvalifikátoru sloupce, časového razítka a typu.
Chcete-li vyřešit problém s mazáním párů klíč/hodnota, myšlenkou je použít pole „typ“ k označení klíče jako odstraněného (značky náhrobku). Řešení problému nahrazování párů klíč/hodnota je jen otázkou výběru pozdějšího časového razítka (správná hodnota je blízko konce souboru, append pouze znamená, že poslední vložené je blízko konce).
Abychom vyřešili problém „neuspořádaného“ klíče, uchováváme poslední přidané páry klíč–hodnota v paměti. Když dosáhnete prahové hodnoty, HBase ji vyprázdní do MapFile. Tímto způsobem nakonec přidáte seřazené páry klíč/hodnota do MapFile.
HBase dělá přesně toto[2]:když přidáte hodnotu pomocí table.put(), váš klíč/hodnota se přidá do MemStore (pod kapotou MemStore je seřazená ConcurrentSkipListMap). Když je dosaženo prahové hodnoty pro jednotlivé paměťové úložiště (hbase.hregion.memstore.flush.size) nebo RegionServer využívá příliš mnoho paměti pro paměťová úložiště (hbase.regionserver.global.memstore.upperLimit), data se vyprázdní na disk jako nový mapový soubor. .
Výsledkem každého vyprázdnění je nový MapFile, což znamená, že pro nalezení klíče musíte hledat ve více než jednom souboru. To vyžaduje více zdrojů a je potenciálně pomalejší.
Pokaždé, když je vydáno získání nebo skenování, HBase prohledá každý soubor, aby našel výsledek, aby se zabránilo přeskakování mezi příliš mnoha soubory, existuje vlákno, které zjistí, kdy jste dosáhli určitého počtu souborů (hbase.hstore.compaction .max). Poté se je pokusí sloučit dohromady v procesu zvaném komprimace, který v podstatě vytvoří nový velký soubor jako výsledek sloučení souborů.
HBase má dva typy komprimace:jeden se nazývá „malé zhuštění“, který pouze sloučí dva nebo více malých souborů do jednoho, a druhý se nazývá „hlavní zhutnění“, který vyzvedne všechny soubory v oblasti, sloučí je a provede určité vyčištění. Při velké komprimaci jsou odstraněné páry klíč/hodnota odstraněny, tento nový soubor neobsahuje značky náhrobků a všechny duplicitní páry klíč/hodnota (operace nahrazení hodnoty) jsou odstraněny.
Až do verze 0.20 používal HBase k ukládání dat formát MapFile, ale ve verzi 0.20 byl představen nový MapFile specifický pro HBase (HBASE-61).
HFfile v1
V HBase 0.20 je MapFile nahrazen HFile:implementace specifického mapového souboru pro HBase. Myšlenka je docela podobná MapFile, ale přidává více funkcí než jen prostý soubor klíč/hodnota. Funkce, jako je podpora metadat a indexu, jsou nyní uchovávány ve stejném souboru.
Datové bloky obsahují skutečný klíč/hodnoty jako MapFile. Pro každou „operaci zavírání bloku“ je do indexu přidán první klíč a index je zapsán na HFile close.
Formát HFile také přidává dva další typy bloků „metadata“:Meta a FileInfo. Tyto dva bloky klíč/hodnota jsou zapsány při zavření souboru.
Blok Meta je navržen tak, aby udržel velké množství dat pomocí svého klíče jako řetězce, zatímco FileInfo je jednoduchá mapa preferovaná pro malé informace s klíči a hodnotami, které jsou oba bajtové. StoreFile Regionserver používá Meta-Blocks k uložení Bloom Filteru a FileInfo pro Max SequenceId, hlavní komprimační klíč a informace o časovém rozsahu. Tato informace je užitečná, abyste se vyhnuli čtení souboru, pokud není šance, že je přítomen klíč (Bloom Filter), pokud je soubor příliš starý (Max SequenceId) nebo pokud je soubor příliš nový (Timerange) na to, aby obsahoval to, co hledáme. pro.
HFfile v2
V HBase 0.92 byl formát HFile trochu změněn (HBASE-3857), aby se zlepšil výkon při ukládání velkého množství dat. Jedním z hlavních problémů s HFile v1 je, že musíte načíst všechny monolitické indexy a velké Bloomovy filtry do paměti, a k vyřešení tohoto problému v2 zavádí víceúrovňové indexy a blokový Bloom Filter. Výsledkem je, že HFile v2 nabízí lepší rychlost, paměť a využití mezipaměti.
Hlavním rysem této v2 jsou „inline bloky“, myšlenkou je rozbít index a Bloom Filter na blok, místo toho, aby byl v paměti celý index a Bloom Filter celého souboru. Tímto způsobem můžete mít v paměti RAM přesně to, co potřebujete.
Protože se index přesune na úroveň bloku, máte víceúrovňový index, což znamená, že každý blok má svůj vlastní index (index listu). Poslední klíč každého bloku je uchován pro vytvoření meziproduktu/indexu, díky kterému bude víceúrovňový index b+strom podobný.
Záhlaví bloku nyní obsahuje některé informace:Pole „Block Magic“ bylo nahrazeno polem „Block Type“, které popisuje obsah bloku „Data“, Leaf-Index, Bloom, Metadata, Root-Index atd. Také tři byla přidána pole (komprimovaná/nekomprimovaná velikost a posun předchozího bloku), aby bylo možné rychle přetáčet zpět a vpřed.
Kódování bloků dat
Vzhledem k tomu, že klíče jsou tříděné a obvykle velmi podobné, je možné navrhnout lepší kompresi, než jaké dokáže obecný algoritmus.
HBASE-4218 se pokusil tento problém vyřešit a v HBase 0.94 si můžete vybrat mezi několika různými algoritmy:Prefix a Diff Encoding.
Hlavní myšlenkou kódování prefixů je uložit společný prefix pouze jednou, protože řádky jsou seřazeny a začátek je obvykle stejný.
Kódování rozdílů posouvá tento koncept dále. Místo toho, aby byl klíč považován za neprůhlednou sekvenci bajtů, kodér rozdílů rozdělí každé pole klíče, aby lépe komprimoval každou část. To znamená, že rodina sloupců je uložena jednou. Pokud jsou délka klíče, délka hodnoty a typ stejné jako předchozí řádek, pole je vynecháno. Také pro zvýšenou kompresi je časové razítko uloženo jako rozdíl oproti předchozímu.
Pamatujte, že tato funkce je ve výchozím nastavení vypnutá, protože zápis a skenování jsou pomalejší, ale více dat se ukládá do mezipaměti. Chcete-li tuto funkci povolit, můžete nastavit DATA_BLOCK_ENCODING =PREFIX | ROZDÍL | FAST_DIFF v informacích o tabulce.
HFfile v3
HBASE-5313 obsahuje návrh na restrukturalizaci rozvržení souborů HF za účelem zlepšení komprese:
- Zabalte všechny klíče dohromady na začátku bloku a všechny hodnoty dohromady na konci bloku. Tímto způsobem můžete ke kompresi klíče a hodnot použít dva různé algoritmy.
- Časová razítka komprimujte pomocí XOR s první hodnotou a místo dlouhého použijte VInt.
Také se zkoumá sloupcový formát nebo sloupcové kódování, podívejte se na AVRO-806, kde najdete sloupcový formát souboru od Douga Cuttinga.
Jak můžete vidět, trendem evoluce je více si uvědomovat, co soubor obsahuje, získat lepší kompresi nebo lepší povědomí o umístění, což se promítne do menšího množství dat pro zápis/čtení z disku. Méně I/O znamená vyšší rychlost!
[1] https://clouderatemp.wpengine.com/blog/2011/01/hadoop-io-sequence-map-set-array-bloommap-files/
[2] https://clouderatemp.wpengine. com/blog/2012/06/hbase-write-path/