{"id":55302,"date":"2020-01-17T00:00:00","date_gmt":"2020-01-16T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/teoriya-i-praktika-ispolzovaniya-hbase"},"modified":"2020-02-18T14:03:24","modified_gmt":"2020-02-18T11:03:24","slug":"teoriya-i-praktika-ispolzovaniya-hbase","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","title":{"rendered":"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Dobr\u00fd den! Jmenuji se Danil Lipovoj, n\u00e1\u0161 t\u00fdm ve Sbertechu za\u010dal pou\u017e\u00edvat HBase jako \u00falo\u017ei\u0161t\u011b provozn\u00edch dat. B\u011bhem jeho studia jsme nashrom\u00e1\u017edili zku\u0161enosti, kter\u00e9 jsme cht\u011bli systematizovat a popsat (douf\u00e1me, \u017ee to bude pro mnoh\u00e9 u\u017eite\u010dn\u00e9). V\u0161echny n\u00ed\u017ee uveden\u00e9 experimenty byly prov\u00e1d\u011bny s verzemi HBase 1.2.0-cdh5.14.2 a 2.0.0-cdh6.0.0-beta1. <\/p>\n<ol>\n<li>Obecn\u00e1 architektura <\/li>\n<li>Z\u00e1pis dat do HBASE<\/li>\n<li>\u010cten\u00ed dat z HBASE<\/li>\n<li>Mezipam\u011b\u0165 dat<\/li>\n<li>Hromadn\u00e9 zpracov\u00e1n\u00ed dat MultiGet\/MultiPut<\/li>\n<li>Strategie rozd\u011blen\u00ed tabulek na oblasti (splittov\u00e1n\u00ed)<\/li>\n<li>Odolnost v\u016f\u010di chyb\u00e1m, kompakce a lokalita dat<\/li>\n<li>Nastaven\u00ed a v\u00fdkon<\/li>\n<li>Z\u00e1t\u011b\u017eov\u00e9 testov\u00e1n\u00ed<\/li>\n<li>Z\u00e1v\u011bry<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Obecn\u00e1 architektura<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30800d8a48de4c52ff1650a4f1dec4c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZ\u00e1lo\u017en\u00ed Master monitoruje heartbeat aktivn\u00edho na uzlu ZooKeeper a v p\u0159\u00edpad\u011b jeho v\u00fdpadku p\u0159eb\u00edr\u00e1 funkce Mistra. <\/p>\n<h2>2. Z\u00e1pis dat do HBASE<\/h2>\n<p>\nNejprve se pod\u00edv\u00e1me na nejjednodu\u0161\u0161\u00ed p\u0159\u00edpad \u2013 z\u00e1pis objektu kl\u00ed\u010d-hodnota do ur\u010dit\u00e9 tabulky pomoc\u00ed put(rowkey). Klient nejprve mus\u00ed zjistit, kde se nach\u00e1z\u00ed ko\u0159enov\u00fd region server (Root Region Server \u2014 RRS), kter\u00fd uchov\u00e1v\u00e1 tabulku hbase:meta. Tyto informace z\u00edsk\u00e1v\u00e1 od ZooKeeper. Pot\u00e9 se obrac\u00ed na RRS a \u010dte tabulku hbase:meta, ze kter\u00e9 z\u00edsk\u00e1v\u00e1 informace o tom, kter\u00fd RegionServer (RS) odpov\u00edd\u00e1 za uchov\u00e1v\u00e1n\u00ed dat pro zadan\u00fd kl\u00ed\u010d rowkey v zaj\u00edmav\u00e9 tabulce. Za \u00fa\u010delem dal\u0161\u00edho pou\u017eit\u00ed je meta-tabulka cachov\u00e1na klientem, a tak jsou n\u00e1sleduj\u00edc\u00ed dotazy rychlej\u0161\u00ed, p\u0159\u00edmo k RS.<\/p>\n<p>Pot\u00e9 RS, po p\u0159ijet\u00ed po\u017eadavku, nejprve zap\u00ed\u0161e jeho do WriteAheadLog (WAL), co\u017e je nutn\u00e9 pro obnoven\u00ed v p\u0159\u00edpad\u011b p\u00e1du. Pot\u00e9 ukl\u00e1d\u00e1 data do MemStore. To je buffer v pam\u011bti, kter\u00fd obsahuje se\u0159azenou sadu kl\u00ed\u010d\u016f z tohoto regionu. Tabulka m\u016f\u017ee b\u00fdt rozd\u011blena na oblasti (partice), z nich\u017e ka\u017ed\u00e1 obsahuje nep\u0159ekr\u00fdvaj\u00edc\u00ed se sadu kl\u00ed\u010d\u016f. To umo\u017e\u0148uje um\u00edstit oblasti na r\u016fzn\u00e9 servery a dos\u00e1hnout tak vy\u0161\u0161\u00ed v\u00fdkonnosti. I kdy\u017e je tento v\u00fdrok z\u0159ejm\u00fd, pozd\u011bji uvid\u00edme, \u017ee to nefunguje ve v\u0161ech p\u0159\u00edpadech.<\/p>\n<p>Po um\u00edst\u011bn\u00ed z\u00e1znamu do MemStore obdr\u017e\u00ed klient odpov\u011b\u010f, \u017ee z\u00e1znam byl \u00fasp\u011b\u0161n\u011b ulo\u017een. Ve skute\u010dnosti se v\u0161ak ukl\u00e1d\u00e1 pouze v bufferu a na disk se dostane teprve po uplynut\u00ed ur\u010dit\u00e9ho \u010dasov\u00e9ho intervalu nebo p\u0159i napln\u011bn\u00ed nov\u00fdmi daty. <\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/10f4d5d600a20882690f5cc81322bc41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nP\u0159i prov\u00e1d\u011bn\u00ed operace \u201eSmazat\u201c nedoch\u00e1z\u00ed k fyzick\u00e9mu odstran\u011bn\u00ed dat. Ta jsou pouze ozna\u010dena jako smazan\u00e1 a samotn\u00e9 zni\u010den\u00ed nast\u00e1v\u00e1 v okam\u017eiku zavol\u00e1n\u00ed funkce major compact, o kter\u00e9 je podrobn\u011bji pojedn\u00e1no v bodu 7.<\/p>\n<p>Soubory ve form\u00e1tu HFile se hromad\u00ed v HDFS a \u010das od \u010dasu se spou\u0161t\u00ed proces minor compact, kter\u00fd jednodu\u0161e spojuje mal\u00e9 soubory do v\u011bt\u0161\u00edch, ani\u017e by n\u011bco odstra\u0148oval. V pr\u016fb\u011bhu \u010dasu to p\u0159er\u016fst\u00e1 v probl\u00e9m, kter\u00fd se projevuje pouze p\u0159i \u010dten\u00ed dat (k tomu se vr\u00e1t\u00edme pozd\u011bji). <\/p>\n<p>Krom\u011b v\u00fd\u0161e uveden\u00e9ho procesu na\u010d\u00edt\u00e1n\u00ed existuje mnohem efektivn\u011bj\u0161\u00ed procedura, kter\u00e1 p\u0159edstavuje asi nejsiln\u011bj\u0161\u00ed str\u00e1nku t\u00e9to datab\u00e1ze \u2013 BulkLoad. Ta spo\u010d\u00edv\u00e1 v tom, \u017ee si sami vytv\u00e1\u0159\u00edme HFiles a ukl\u00e1d\u00e1me je na disk, co\u017e n\u00e1m umo\u017e\u0148uje vynikaj\u00edc\u00ed \u0161k\u00e1lovatelnost a dosahovat velmi slu\u0161n\u00fdch rychlost\u00ed. V podstat\u011b je zde omezen\u00edm nikoliv HBase, ale mo\u017enosti hardwaru. N\u00ed\u017ee jsou uvedeny v\u00fdsledky na\u010d\u00edt\u00e1n\u00ed na clusteru slo\u017een\u00e9m z 16 RegionServers a 16 NodeManager YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 vl\u00e1ken), verze HBase 1.2.0-cdh5.14.2. <\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/4e4452b216eda3269a364ea97c49120f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZde je vid\u011bt, \u017ee zvy\u0161ov\u00e1n\u00edm po\u010dtu parti\u00ed (region\u016f) v tabulce, stejn\u011b jako executor\u016f Spark, z\u00edsk\u00e1v\u00e1me n\u00e1r\u016fst rychlosti na\u010d\u00edt\u00e1n\u00ed. Tak\u00e9 rychlost z\u00e1vis\u00ed na objemu z\u00e1pisu. Velk\u00e9 bloky p\u0159in\u00e1\u0161ej\u00ed n\u00e1r\u016fst v m\u011b\u0159en\u00ed MB\/s, mal\u00e9 v po\u010dtu vlo\u017een\u00fdch z\u00e1znam\u016f za jednotku \u010dasu, p\u0159i jinak stejn\u00fdch podm\u00ednk\u00e1ch. <\/p>\n<p>Tak\u00e9 m\u016f\u017eeme spustit na\u010d\u00edt\u00e1n\u00ed do dvou tabulek sou\u010dasn\u011b a z\u00edskat zdvojen\u00ed rychlosti. N\u00ed\u017ee lze vid\u011bt, \u017ee z\u00e1pis blok\u016f 10 KB najednou do dvou tabulek prob\u00edh\u00e1 rychlost\u00ed kolem 600 MB\/s do ka\u017ed\u00e9 (celkem 1275 MB\/s), co\u017e odpov\u00edd\u00e1 rychlosti z\u00e1pisu do jedn\u00e9 tabulky 623 MB\/s (viz \u010d. 11 v\u00fd\u0161e).<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9f1b4fc0c80b797111494d400e9ce332.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDruh\u00e1 relace se z\u00e1pisy o velikosti 50 KB ukazuje, \u017ee rychlost na\u010d\u00edt\u00e1n\u00ed ji\u017e neroste v\u00fdrazn\u011b, co\u017e nazna\u010duje bl\u00ed\u017e\u00edc\u00ed se k limitn\u00edm hodnot\u00e1m. Je t\u0159eba m\u00edt na pam\u011bti, \u017ee na samotn\u00e9m HBASE zde prakticky nevznik\u00e1 z\u00e1t\u011b\u017e, v\u0161e, co od n\u011bj vy\u017eaduje, je nejprve vr\u00e1tit data z hbase:meta, a pot\u00e9 po vlo\u017een\u00ed HFiles vypr\u00e1zdnit data BlockCache a ulo\u017eit buffer MemStore na disk, pokud nen\u00ed pr\u00e1zdn\u00fd.<\/p>\n<h2>3. \u010cten\u00ed dat z HBASE<\/h2>\n<p>\nPokud p\u0159edpokl\u00e1d\u00e1me, \u017ee v\u0161echny informace z hbase:meta m\u00e1 klient ji\u017e k dispozici (viz bod 2), pak dotaz ihned zam\u00ed\u0159\u00ed na ten RS, kde je ulo\u017een\u00fd po\u017eadovan\u00fd kl\u00ed\u010d. Nejprve se prov\u00e1d\u00ed hled\u00e1n\u00ed v MemCache. Bez ohledu na to, zda tam data jsou \u010di nikoliv, je hled\u00e1n\u00ed tak\u00e9 prov\u00e1d\u011bno v bloku BlockCache a v p\u0159\u00edpad\u011b pot\u0159eby v HFiles. Pokud jsou data nalezena v souboru, jsou ulo\u017eena do BlockCache a p\u0159i dal\u0161\u00edm dotazu budou vr\u00e1cena rychleji. Hled\u00e1n\u00ed v HFile prob\u00edh\u00e1 d\u00edky pou\u017eit\u00ed Bloomova filtru relativn\u011b rychle, tzn. po na\u010dten\u00ed mal\u00e9ho mno\u017estv\u00ed dat okam\u017eit\u011b ur\u010d\u00ed, zda tento soubor obsahuje po\u017eadovan\u00fd kl\u00ed\u010d, a pokud ne, p\u0159ech\u00e1z\u00ed na dal\u0161\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a21b1b825a84cfd02507ec334e9452fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPo z\u00edsk\u00e1n\u00ed dat z t\u011bchto t\u0159\u00ed zdroj\u016f RS vytv\u00e1\u0159\u00ed odpov\u011b\u010f. M\u016f\u017ee nap\u0159\u00edklad okam\u017eit\u011b p\u0159edat n\u011bkolik nalezen\u00fdch verz\u00ed objektu, pokud klient po\u017eadoval verze.<\/p>\n<h2>4. Ke\u0161ov\u00e1n\u00ed dat<\/h2>\n<p>\nPam\u011b\u0165ov\u00e9 buffery MemStore a BlockCache zab\u00edraj\u00ed a\u017e 80 % vyhrazen\u00e9 on-heap pam\u011bti RS (zbytek je rezervov\u00e1n pro servisn\u00ed \u00fakoly RS). Pokud je typick\u00e9 pou\u017eit\u00ed takov\u00e9, \u017ee procesy zapisuj\u00ed a okam\u017eit\u011b \u010dtou tato stejn\u00e1 data, m\u00e1 smysl sn\u00ed\u017eit BlockCache a zv\u00fd\u0161it MemStore, proto\u017ee p\u0159i z\u00e1pisu data do cache na \u010dten\u00ed nepadaj\u00ed, tak\u017ee pou\u017e\u00edv\u00e1n\u00ed BlockCache bude m\u00e9n\u011b \u010dast\u00e9. Buffer BlockCache se skl\u00e1d\u00e1 ze dvou \u010d\u00e1st\u00ed: LruBlockCache (v\u017edy on-heap) a BucketCache (obvykle off-heap nebo na SSD). BucketCache by m\u011bl b\u00fdt pou\u017eit, kdy\u017e je velmi vysok\u00fd po\u010det dotaz\u016f na \u010dten\u00ed a ta se nevejdou do LruBlockCache, co\u017e vede k aktivn\u00edmu provozu Garbage Collector. Z\u00e1rove\u0148 nen\u00ed re\u00e1ln\u011b mo\u017en\u00e9 o\u010dek\u00e1vat radik\u00e1ln\u00ed n\u00e1r\u016fst v\u00fdkonu z pou\u017e\u00edv\u00e1n\u00ed cache na \u010dten\u00ed, nicm\u00e9n\u011b k tomu se je\u0161t\u011b vr\u00e1t\u00edme v bod\u011b 8.<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/17d7791a998dd7da747cb7089dce1f10.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBlockCache je jeden pro cel\u00fd RS, zat\u00edmco MemStore je pro ka\u017edou tabulku zvl\u00e1\u0161tn\u00ed (po jednom na ka\u017ed\u00fd Column Family).<\/p>\n<p>Jak <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.cloudera.com\/blog\/2012\/06\/hbase-write-path\/\">je pops\u00e1no<\/a><\/noindex> Teoreticky, p\u0159i z\u00e1pisu data do cache nepadaj\u00ed a skute\u010dn\u011b jsou takov\u00e9 parametry CACHE_DATA_ON_WRITE pro tabulku a \u201eCache DATA on Write\u201c pro RS nastaveny na false. Nicm\u00e9n\u011b v praxi, pokud zap\u00ed\u0161eme data do MemStore, pot\u00e9 je vypr\u00e1zdn\u00edme na disk (t\u00edmto zp\u016fsobem), n\u00e1sledn\u011b odstran\u00edme vznikl\u00fd soubor, p\u0159i vykon\u00e1v\u00e1n\u00ed dotazu get \u00fasp\u011b\u0161n\u011b z\u00edsk\u00e1me data. Nav\u00edc, i kdy\u017e zcela vypneme BlockCache a napln\u00edme tabulku nov\u00fdmi daty, pak dos\u00e1hneme vypr\u00e1zdn\u011bn\u00ed MemStore na disk, pokud je odstran\u00edme a po\u017e\u00e1d\u00e1me z jin\u00e9 relace, data se stejn\u011b n\u011bjak\u00fdm zp\u016fsobem z\u00edskaj\u00ed. Tak\u017ee HBase uchov\u00e1v\u00e1 nejen data, ale tak\u00e9 tajemn\u00e9 z\u00e1hady.<\/p>\n<pre><code class=\"bash\">hbase(main):001:0&gt; create 'ns:magic', 'cf'\nCreated table ns:magic\nTook 1.1533 seconds\nhbase(main):002:0&gt; put 'ns:magic', 'key1', 'cf:c', 'try_to_delete_me'\nTook 0.2610 seconds\nhbase(main):003:0&gt; flush 'ns:magic'\nTook 0.6161 seconds\nhdfs dfs -mv \/data\/hbase\/data\/ns\/magic\/* \/tmp\/trash\nhbase(main):002:0&gt; get 'ns:magic', 'key1'\n cf:c      timestamp=1534440690218, value=try_to_delete_me\n<\/code><\/pre>\n<p>\nParametr \u201eCache DATA on Read\u201c je nastaven na false. Pokud m\u00e1te n\u011bjak\u00e9 n\u00e1pady, v\u00edt\u00e1me va\u0161e koment\u00e1\u0159e.<\/p>\n<h2>5. Hromadn\u00e9 zpracov\u00e1n\u00ed dat MultiGet\/MultiPut<\/h2>\n<p>\nZpracov\u00e1n\u00ed jednotliv\u00fdch po\u017eadavk\u016f (Get\/Put\/Delete) je pom\u011brn\u011b n\u00e1kladn\u00e1 operace, proto byste je m\u011bli co nejv\u00edce sdru\u017eovat do seznamu, co\u017e umo\u017e\u0148uje dos\u00e1hnout zna\u010dn\u00e9ho zv\u00fd\u0161en\u00ed v\u00fdkonu. To plat\u00ed zejm\u00e9na pro z\u00e1pis, ale p\u0159i \u010dten\u00ed existuje n\u00e1sleduj\u00edc\u00ed \u00faskal\u00ed. Na grafu n\u00ed\u017ee je uveden \u010das \u010dten\u00ed 50 000 z\u00e1znam\u016f z MemStore. \u010cten\u00ed prob\u00edhalo v jednom vl\u00e1knu a na vodorovn\u00e9 ose je uveden po\u010det kl\u00ed\u010d\u016f v po\u017eadavku. Zde je vid\u011bt, \u017ee p\u0159i zv\u00fd\u0161en\u00ed na tis\u00edc kl\u00ed\u010d\u016f v jednom po\u017eadavku kles\u00e1 doba vykon\u00e1n\u00ed, tj. rychlost se zvy\u0161uje. Ov\u0161em p\u0159i zapnut\u00e9m v\u00fdchoz\u00edm re\u017eimu MSLAB po tomto prahu za\u010d\u00edn\u00e1 radik\u00e1ln\u00ed pokles v\u00fdkonu, p\u0159i\u010dem\u017e \u010d\u00edm v\u011bt\u0161\u00ed je objem dat v z\u00e1znamu, t\u00edm v\u00edce roste doba zpracov\u00e1n\u00ed. <\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/42d3a77d66770a7fed03f83fecdca470.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTesty byly prov\u00e1d\u011bny na virtu\u00e1ln\u00edm stroji, 8 jader, verze HBase 2.0.0-cdh6.0.0-beta1.<\/p>\n<p>Re\u017eim MSLAB slou\u017e\u00ed ke sn\u00ed\u017een\u00ed fragmentace haldy, kter\u00e1 vznik\u00e1 m\u00edsen\u00edm dat nov\u00fdch a star\u00fdch generac\u00ed. Jako \u0159e\u0161en\u00ed probl\u00e9mu p\u0159i aktivaci MSLAB se data umis\u0165uj\u00ed do relativn\u011b mal\u00fdch bun\u011bk (chunk) a zpracov\u00e1vaj\u00ed se po d\u00e1vk\u00e1ch. V d\u016fsledku toho, kdy\u017e objem po\u017eadovan\u00e9ho bal\u00ed\u010dku dat p\u0159ekro\u010d\u00ed vyhrazenou velikost, dojde k radik\u00e1ln\u00edmu poklesu v\u00fdkonu. Na druhou stranu, vypnut\u00ed tohoto re\u017eimu je tak\u00e9 ne\u017e\u00e1douc\u00ed, proto\u017ee to povede k z\u00e1stav\u00e1m kv\u016fli GC v obdob\u00edch intenzivn\u00ed pr\u00e1ce s daty. Dobr\u00e9 \u0159e\u0161en\u00ed je zv\u00fd\u0161en\u00ed objem\u016f bun\u011bk, kdy\u017e doch\u00e1z\u00ed k aktivn\u00edmu z\u00e1pisu p\u0159es put sou\u010dasn\u011b s \u010dten\u00edm. Je t\u0159eba poznamenat, \u017ee probl\u00e9m nevznik\u00e1, pokud po z\u00e1pisu provedete p\u0159\u00edkaz flush, kter\u00fd ukl\u00e1d\u00e1 MemStore na disk, nebo pokud provedete na\u010dten\u00ed pomoc\u00ed BulkLoad. V tabulce n\u00ed\u017ee je uvedeno, \u017ee dotazy z MemStore s v\u011bt\u0161\u00edm objemem dat (a stejn\u00fdm mno\u017estv\u00edm) vedou k zpomalen\u00ed. Nicm\u00e9n\u011b zv\u00fd\u0161en\u00edm velikosti chunksize se doba zpracov\u00e1n\u00ed vrac\u00ed na normu.<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/0076215bd171257548f8a4c4d4229ba0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKrom\u011b zv\u00fd\u0161en\u00ed chunksize pom\u00e1h\u00e1 d\u011blen\u00ed dat podle region\u016f, tedy rozd\u011blen\u00ed tabulek. To zp\u016fsobuje, \u017ee na ka\u017ed\u00fd region p\u0159ich\u00e1z\u00ed men\u0161\u00ed po\u010det dotaz\u016f a pokud jsou um\u00edst\u011bny do bun\u011bk, odezva z\u016fst\u00e1v\u00e1 dobr\u00e1.<\/p>\n<h2>6. Strategie rozd\u011blen\u00ed tabulek na regiony (splitting)<\/h2>\n<p>\nJeliko\u017e HBase je \u00falo\u017ei\u0161t\u011b kl\u00ed\u010d-hodnota a partitioning se prov\u00e1d\u00ed podle kl\u00ed\u010de, je velmi d\u016fle\u017eit\u00e9 rozd\u011blovat data rovnom\u011brn\u011b mezi v\u0161echny regiony. Nap\u0159\u00edklad rozd\u011blen\u00ed takov\u00e9 tabulky na t\u0159i \u010d\u00e1sti povede k tomu, \u017ee data budou rozd\u011blena do t\u0159\u00ed region\u016f:<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a811ae81e77b48dbf28ed86dbdc35739.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u011bkdy to vede k v\u00fdrazn\u00e9mu zpomalen\u00ed, pokud budou pozd\u011bji na\u010d\u00edtan\u00e9 data v\u011bt\u0161inou obsahovat long hodnoty, kter\u00e9 za\u010d\u00ednaj\u00ed stejnou \u010d\u00edslic\u00ed, nap\u0159\u00edklad:<\/p>\n<p>1000001<br \/>\n1000002<br \/>\n\u2026<br \/>\n1100003<\/p>\n<p>Jeliko\u017e jsou kl\u00ed\u010de ukl\u00e1d\u00e1ny jako pole byt\u016f, v\u0161echna budou za\u010d\u00ednat stejn\u011b a vztahovat se k regionu #1 ukl\u00e1daj\u00edc\u00edmu tuto oblast kl\u00ed\u010d\u016f. Existuje n\u011bkolik strategi\u00ed rozd\u011blen\u00ed:<\/p>\n<p>HexStringSplit \u2013 P\u0159ev\u00e1d\u00ed kl\u00ed\u010d na \u0159et\u011bzec s hexadecim\u00e1ln\u00edm k\u00f3dov\u00e1n\u00edm v rozsahu \u201e00000000\u201c =&gt; \u201eFFFFFFFF\u201c a vypl\u0148uje zleva nulami.<\/p>\n<p>UniformSplit \u2013 P\u0159ev\u00e1d\u00ed kl\u00ed\u010d na pole byt\u016f s hexadecim\u00e1ln\u00edm k\u00f3dov\u00e1n\u00edm v rozsahu \u201e00\u201c =&gt; \u201eFF\u201c a vypl\u0148uje zprava nulami.<\/p>\n<p>Krom\u011b toho lze specifikovat libovoln\u00fd rozsah nebo sadu kl\u00ed\u010d\u016f pro rozd\u011blen\u00ed a nastavit automatick\u00e9 d\u011blen\u00ed. Av\u0161ak jedn\u00edm z nejjednodu\u0161\u0161\u00edch a nej\u00fa\u010dinn\u011bj\u0161\u00edch p\u0159\u00edstup\u016f je UniformSplit a pou\u017eit\u00ed koncatenace hashe, nap\u0159\u00edklad nejvy\u0161\u0161\u00ed dvojice byt\u016f od spu\u0161t\u011bn\u00ed kl\u00ed\u010de pomoc\u00ed funkce CRC32(rowkey) a vlastn\u011b rowkey:<\/p>\n<p>hash + rowkey<\/p>\n<p>V\u0161echny data budou rovnom\u011brn\u011b rozlo\u017eena mezi regiony. P\u0159i \u010dten\u00ed se prvn\u00edch dva byty jednodu\u0161e zahod\u00ed a z\u016fstane p\u016fvodn\u00ed kl\u00ed\u010d. Tak\u00e9 RS kontroluje mno\u017estv\u00ed dat a kl\u00ed\u010d\u016f v regionu a p\u0159i p\u0159ekro\u010den\u00ed limit\u016f je automaticky rozd\u011bl\u00ed na \u010d\u00e1sti. <\/p>\n<h2>7. Odolnost v\u016f\u010di poruch\u00e1m a lokalita dat<\/h2>\n<p>\nJeliko\u017e ka\u017ed\u00fd soubor kl\u00ed\u010d\u016f odpov\u00edd\u00e1 pouze jednomu regionu, \u0159e\u0161en\u00edm probl\u00e9m\u016f spojen\u00fdch s p\u00e1dy RS nebo jejich vy\u0159azov\u00e1n\u00edm z provozu je ukl\u00e1d\u00e1n\u00ed v\u0161ech pot\u0159ebn\u00fdch dat do HDFS. P\u0159i p\u00e1du RS to master zjist\u00ed prost\u0159ednictv\u00edm nedostatku heartbeat na uzlu ZooKeeper. Pot\u00e9 p\u0159i\u0159ad\u00ed obsluhovan\u00fd region jin\u00e9mu RS a proto\u017ee HFiles jsou ulo\u017eeny v distribuovan\u00e9m souborov\u00e9m syst\u00e9mu, nov\u00fd majitel je vy\u010dte a pokra\u010duje v obsluze dat. Nicm\u00e9n\u011b, proto\u017ee \u010d\u00e1st dat m\u016f\u017ee b\u00fdt v MemStore a nestihla se dostat do HFiles, pro obnoven\u00ed historie operac\u00ed se pou\u017e\u00edv\u00e1 WAL, kter\u00fd je tak\u00e9 ulo\u017een v HDFS. Po aplikaci zm\u011bn je RS schopen odpov\u00eddat na dotazy, nicm\u00e9n\u011b p\u0159est\u011bhov\u00e1n\u00ed vede k tomu, \u017ee \u010d\u00e1st dat a procesy, kter\u00e9 je obsluhuj\u00ed, se nach\u00e1zej\u00ed na r\u016fzn\u00fdch uzlech, co\u017e znamen\u00e1, \u017ee se sni\u017euje lokalita. <\/p>\n<p>\u0158e\u0161en\u00edm probl\u00e9mu je major compaction \u2013 tento proces p\u0159esouv\u00e1 soubory na ty uzly, kter\u00e9 jsou za n\u011b zodpov\u011bdn\u00e9 (tam, kde se nach\u00e1zej\u00ed jejich regiony), co\u017e m\u00e1 za n\u00e1sledek prudk\u00fd n\u00e1r\u016fst zat\u00ed\u017een\u00ed s\u00edt\u011b a disk\u016f b\u011bhem t\u00e9to procedury. V budoucnu v\u0161ak bude p\u0159\u00edstup k dat\u016fm znateln\u011b urychlen. Krom\u011b toho major_compaction prov\u00e1d\u00ed slou\u010den\u00ed v\u0161ech HFiles do jednoho souboru v r\u00e1mci regionu a tak\u00e9 \u010dist\u00ed data podle nastaven\u00ed tabulky. Nap\u0159\u00edklad lze ur\u010dit po\u010det verz\u00ed objektu, kter\u00e9 je t\u0159eba uchov\u00e1vat, nebo jeho \u017eivotnost, po jej\u00edm\u017e uplynut\u00ed je objekt fyzicky smaz\u00e1n.<\/p>\n<p>Tento proces m\u016f\u017ee m\u00edt velmi pozitivn\u00ed vliv na v\u00fdkon HBase. Na obr\u00e1zku n\u00ed\u017ee je vid\u011bt, jak se zhor\u0161ila v\u00fdkonnost v d\u016fsledku aktivn\u00edho z\u00e1pisu dat. M\u016f\u017eeme vid\u011bt, jak do jedn\u00e9 tabulky zapisovalo 40 vl\u00e1ken a 40 vl\u00e1ken sou\u010dasn\u011b \u010detlo data. P\u00ed\u0161\u00edc\u00ed vl\u00e1kna generuj\u00ed st\u00e1le v\u00edce a v\u00edce HFiles, kter\u00e9 jsou \u010dteny jin\u00fdmi vl\u00e1kny. V d\u016fsledku toho je t\u0159eba st\u00e1le v\u00edce dat smazat z pam\u011bti a nakonec za\u010dne fungovat GC, kter\u00fd t\u00e9m\u011b\u0159 paralyzuje celou pr\u00e1ci. Spu\u0161t\u011bn\u00ed major compaction vedlo k vy\u010di\u0161t\u011bn\u00ed nahromad\u011bn\u00fdch dat a obnoven\u00ed v\u00fdkonu.<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/6c93b2c10c197663785d3de0bb185481.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTest byl proveden na 3 DataNode a 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 vl\u00e1ken). Verze HBase 1.2.0-cdh5.14.2<\/p>\n<p>Je t\u0159eba poznamenat, \u017ee major compaction byla provedena na '\u017eiv\u00e9' tabulce, do kter\u00e9 se aktivn\u011b zapisovala a \u010detla data. V s\u00edti se objevovalo tvrzen\u00ed, \u017ee to m\u016f\u017ee v\u00e9st k nespr\u00e1vn\u00fdm odpov\u011bd\u00edm p\u0159i \u010dten\u00ed dat. Pro ov\u011b\u0159en\u00ed byl spu\u0161t\u011bn proces, kter\u00fd generoval nov\u00e1 data a zapisoval je do tabulky. Po \u010dem\u017e se okam\u017eit\u011b \u010detlo a porovn\u00e1valo, zda z\u00edskan\u00e1 hodnota souhlas\u00ed s t\u00edm, co bylo zaps\u00e1no. B\u011bhem pr\u00e1ce tohoto procesu se major compaction spustil asi 200kr\u00e1t a nebyla zaznamen\u00e1na \u017e\u00e1dn\u00e1 selh\u00e1n\u00ed. Problematika se pravd\u011bpodobn\u011b projevuje vz\u00e1cn\u011b a pouze b\u011bhem vysok\u00e9ho zat\u00ed\u017een\u00ed, proto je v\u00edce bezpe\u010dn\u00e9 pl\u00e1novan\u011b zastavit procesy z\u00e1pisu a \u010dten\u00ed a prov\u00e9st vy\u010di\u0161t\u011bn\u00ed, aby se p\u0159ede\u0161lo takov\u00fdm v\u00fdpadk\u016fm GC.<\/p>\n<p>Tak\u00e9 major compaction neovliv\u0148uje stav MemStore, pro jeho vypr\u00e1zdn\u011bn\u00ed na disk a kompakci je pot\u0159eba pou\u017e\u00edt flush (connection.getAdmin().flush(TableName.valueOf(tblName))).<\/p>\n<h2>8. Nastaven\u00ed a v\u00fdkon<\/h2>\n<p>\nJak ji\u017e bylo \u0159e\u010deno, nejv\u011bt\u0161\u00ed \u00fasp\u011bch HBase dosahuje tam, kde nemus\u00ed nic d\u011blat, p\u0159i prov\u00e1d\u011bn\u00ed BulkLoad. Nicm\u00e9n\u011b to plat\u00ed pro v\u011bt\u0161inu syst\u00e9m\u016f a lid\u00ed. Tento n\u00e1stroj je sp\u00ed\u0161e ur\u010den pro hromadn\u00e9 ukl\u00e1d\u00e1n\u00ed dat ve velk\u00fdch bloc\u00edch, zat\u00edmco pokud proces vy\u017eaduje prov\u00e1d\u011bn\u00ed mnoha konkuren\u010dn\u00edch \u010dtec\u00edch a zapisovac\u00edch po\u017eadavk\u016f, pou\u017e\u00edvaj\u00ed se v\u00fd\u0161e popsan\u00e9 p\u0159\u00edkazy Get a Put. Pro stanoven\u00ed optim\u00e1ln\u00edch parametr\u016f byly provedeny spu\u0161t\u011bn\u00ed p\u0159i r\u016fzn\u00fdch kombinac\u00edch parametr\u016f tabulek a nastaven\u00ed:<\/p>\n<ul>\n<li>Bylo spu\u0161t\u011bno 10 vl\u00e1ken sou\u010dasn\u011b 3kr\u00e1t za sebou (nazveme to blok vl\u00e1ken). <\/li>\n<li>Doba pr\u00e1ce v\u0161ech vl\u00e1ken v bloku byla pr\u016fm\u011brov\u00e1na a p\u0159edstavovala v\u00fdsledn\u00fd v\u00fdsledek pr\u00e1ce bloku.<\/li>\n<li>V\u0161echna vl\u00e1kna pracovala se stejnou tabulkou. <\/li>\n<li>P\u0159ed ka\u017ed\u00fdm spu\u0161t\u011bn\u00edm bloku vl\u00e1ken byla provedena major compaction.<\/li>\n<li>Ka\u017ed\u00fd blok vykon\u00e1val pouze jednu z n\u00e1sleduj\u00edc\u00edch operac\u00ed: <\/li>\n<\/ul>\n<p>\n \u2014 Put<br \/>\n \u2014 Get<br \/>\n \u2014 Get+Put<\/p>\n<ul>\n<li>Ka\u017ed\u00fd blok vykonal 50 000 opakov\u00e1n\u00ed sv\u00e9 operace.<\/li>\n<li>Velikost z\u00e1znamu v bloku byla 100 bajt\u016f, 1000 bajt\u016f nebo 10000 bajt\u016f (n\u00e1hodn\u011b).<\/li>\n<li>Bloky byly spou\u0161t\u011bny s r\u016fzn\u00fdm po\u010dtem po\u017eadovan\u00fdch kl\u00ed\u010d\u016f (bu\u010f jeden kl\u00ed\u010d nebo 10).<\/li>\n<li>Bloky byly spou\u0161t\u011bny p\u0159i r\u016fzn\u00fdch nastaven\u00edch tabulky. Byly zm\u011bn\u011bny parametry:<\/li>\n<\/ul>\n<p>\n \u2014 BlockCache = zapnuto nebo vypnuto<br \/>\n \u2014 BlockSize = 65 kB nebo 16 kB<br \/>\n \u2014 Partice = 1, 5 nebo 30<br \/>\n \u2014 MSLAB = zapnuto nebo vypnuto<\/p>\n<p>Tak blok vypad\u00e1 takto:<\/p>\n<p>a. MSLAB re\u017eim byl zapnut\u00fd\/vypnut\u00fd.<br \/>\nb. Byla vytvo\u0159ena tabulka, pro kterou byly nastaveny n\u00e1sleduj\u00edc\u00ed parametry: BlockCache = true\/none, BlockSize = 65\/16 Kb, Po\u010det partition = 1\/5\/30. <br \/>\nc. Bylo nastaveno GZ komprese.<br \/>\nd. Byl spu\u0161t\u011bn 10 vl\u00e1ken sou\u010dasn\u011b prov\u00e1d\u011bj\u00edc\u00edch 1\/10 operac\u00ed put\/get\/get+put v t\u00e9to tabulce se z\u00e1znamy o velikosti 100\/1000\/10000 byt\u016f, p\u0159i\u010dem\u017e bylo provedeno 50 000 dotaz\u016f v \u0159ad\u011b (kl\u00ed\u010de byly n\u00e1hodn\u00e9).<br \/>\ne. Bod d byl zopakov\u00e1n t\u0159ikr\u00e1t.<br \/>\nf. \u010cas b\u011bhu v\u0161ech vl\u00e1ken byl pr\u016fm\u011brov\u00e1n. <\/p>\n<p>Byly zkontrolov\u00e1ny v\u0161echny mo\u017en\u00e9 kombinace. P\u0159edv\u00eddateln\u011b, p\u0159i zvy\u0161ov\u00e1n\u00ed velikosti z\u00e1znamu doch\u00e1z\u00ed ke zpomalen\u00ed nebo \u017ee vypnut\u00ed cache zp\u016fsob\u00ed zpo\u017ed\u011bn\u00ed. Nicm\u00e9n\u011b c\u00edlem bylo pochopit m\u00edru a v\u00fdznam vlivu ka\u017ed\u00e9ho parametru, tak\u017ee shrom\u00e1\u017ed\u011bn\u00e1 data byla p\u0159ed\u00e1na funkci line\u00e1rn\u00ed regrese, co\u017e umo\u017e\u0148uje posoudit spolehlivost pomoc\u00ed t-statistiky. N\u00ed\u017ee jsou uvedeny v\u00fdsledky pr\u00e1ce blok\u016f prov\u00e1d\u011bj\u00edc\u00edch operace Put. Cel\u00fd soubor kombinac\u00ed 2*2*3*2*3 = 144 variant + 72, proto\u017ee n\u011bkter\u00e9 byly provedeny dvakr\u00e1t. Celkem tedy 216 spu\u0161t\u011bn\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/7a13c7a9b3ff1859976800f5d45cd51b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTestov\u00e1n\u00ed prob\u00edhalo na mini-klastri slo\u017een\u00e9m ze 3 DataNode a 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 vl\u00e1ken). Verze HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Nejvy\u0161\u0161\u00ed rychlost vkl\u00e1d\u00e1n\u00ed 3.7 sekundy byla dosa\u017eena p\u0159i vypnut\u00e9m re\u017eimu MSLAB, na tabulce s jednou partition, s zapnut\u00fdm BlockCache, BlockSize = 16, z\u00e1znamy o velikosti 100 byt\u016f po 10 kusech v bal\u00ed\u010dku.<br \/>\nNejni\u017e\u0161\u00ed rychlost vkl\u00e1d\u00e1n\u00ed 82.8 sekundy byla dosa\u017eena p\u0159i zapnut\u00e9m re\u017eimu MSLAB, na tabulce s jednou partition, s zapnut\u00fdm BlockCache, BlockSize = 16, z\u00e1znamy o velikosti 10000 byt\u016f po 1 kuse.<\/p>\n<p>Nyn\u00ed se pod\u00edvejme na model. Vid\u00edme dobrou kvalitu modelu podle R2, ale je zcela jasn\u00e9, \u017ee extrapolace je zde kontraindikov\u00e1na. Skute\u010dn\u00e9 chov\u00e1n\u00ed syst\u00e9mu p\u0159i zm\u011bn\u011b parametr\u016f nebude line\u00e1rn\u00ed, tento model nen\u00ed ur\u010den pro progn\u00f3zy, ale pro pochopen\u00ed, co se stalo v r\u00e1mci stanoven\u00fdch parametr\u016f. Nap\u0159\u00edklad zde vid\u00edme podle krit\u00e9ria Student, \u017ee pro operaci Put nemaj\u00ed parametry BlockSize a BlockCache v\u00fdznam (co\u017e je celkem p\u0159edv\u00eddateln\u00e9):<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/2fb65d1809d53f2b47f4f8829a9efc65.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZv\u00fd\u0161en\u00ed po\u010dtu partition\u016f sice vedlo k poklesu v\u00fdkonu, co\u017e je pom\u011brn\u011b p\u0159ekvapiv\u00e9 (u\u017e jsme uv\u00e1d\u011bli pozitivn\u00ed vliv zv\u00fd\u0161en\u00ed po\u010dtu partition\u016f p\u0159i BulkLoad), p\u0159esto je to vysv\u011btliteln\u00e9. Za prv\u00e9, zpracov\u00e1n\u00ed mus\u00ed vytv\u00e1\u0159et dotazy na 30 region\u016f m\u00edsto jednoho, p\u0159i\u010dem\u017e objem dat nen\u00ed tak velk\u00fd, aby to p\u0159ineslo v\u00fdhodu. Za druh\u00e9, celkov\u00fd \u010das pr\u00e1ce je ur\u010den nejpomalej\u0161\u00edm RS a proto\u017ee je po\u010det DataNode men\u0161\u00ed ne\u017e po\u010det RS, \u010d\u00e1st region\u016f m\u00e1 nulovou lokalitu. A nyn\u00ed se pod\u00edvejme na p\u011btici l\u00eddr\u016f:<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8ad7e832879156eaa96e630458405cdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNyn\u00ed zhodnot\u00edme v\u00fdsledky proveden\u00ed blok\u016f Get:<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8a5dd45422c74e8815011d7e9b805ccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPo\u010det partition\u016f ztratil v\u00fdznam, co\u017e pravd\u011bpodobn\u011b vysv\u011btluje, \u017ee data se dob\u0159e ukl\u00e1daj\u00ed do cache a cache pro \u010dten\u00ed je nejv\u00fdznamn\u011bj\u0161\u00edm (statisticky) parametrem. Samoz\u0159ejm\u011b, \u017ee zv\u00fd\u0161en\u00ed mno\u017estv\u00ed zpr\u00e1v v dotazu je tak\u00e9 velmi u\u017eite\u010dn\u00e9 pro v\u00fdkon. Nejlep\u0161\u00ed v\u00fdsledky:<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9d237f9fdbeaf5412daec2fc2fa24b01.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA nakonec se pod\u00edv\u00e1me na model bloku, kter\u00fd nejprve provedl get a pot\u00e9 put:<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/75137207a4a69acccad036882794094b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZde jsou v\u0161echny parametry v\u00fdznamn\u00e9. A v\u00fdsledky l\u00eddr\u016f:<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/c166933d81e86f36958e3af58297f876.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>9. Z\u00e1t\u011b\u017eov\u00e9 testov\u00e1n\u00ed<\/h2>\n<p>\nA nakonec spust\u00edme p\u0159im\u011b\u0159enou z\u00e1t\u011b\u017e, ale v\u017edy je zaj\u00edmav\u011bj\u0161\u00ed, kdy\u017e je s \u010d\u00edm srovn\u00e1vat. Na webu DataStax \u2013 kl\u00ed\u010dov\u00e9ho v\u00fdvoj\u00e1\u0159e Cassandry, je <noindex><a rel=\"nofollow\" href=\"https:\/\/www.datastax.com\/wp-content\/themes\/datastax-2014-08\/files\/NoSQL_Benchmarks_EndPoint.pdf\">v\u00fdsledky<\/a><\/noindex> NT n\u011bkolika NoSQL \u00falo\u017ei\u0161\u0165, v\u010detn\u011b HBase verze 0.98.6-1. Nahr\u00e1v\u00e1n\u00ed prob\u00edhalo 40 vl\u00e1kny, velikost dat 100 byt\u016f, disky SSD. V\u00fdsledky testov\u00e1n\u00ed operac\u00ed Read-Modify-Write uk\u00e1zaly takov\u00e9 v\u00fdsledky.<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/521e9dff60f462e6dabebc1234e028be.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Pokud jsem dob\u0159e pochopil, \u010dten\u00ed prob\u00edhalo po bloc\u00edch po 100 z\u00e1znamech a pro 16 uzl\u016f HBase test DataStax uk\u00e1zal v\u00fdkon 10 tis\u00edc operac\u00ed za sekundu. <\/p>\n<p>Je dob\u0159e, \u017ee v na\u0161em clusteru je tak\u00e9 16 uzl\u016f, ale nen\u00ed to p\u0159\u00edli\u0161 \u201edobr\u00e9\u201c, \u017ee ka\u017ed\u00fd m\u00e1 64 jader (vl\u00e1ken), zat\u00edmco v testu DataStax m\u011bl ka\u017ed\u00fd pouze 4. Na druhou stranu maj\u00ed SSD disky, zat\u00edmco my m\u00e1me HDD a nov\u011bj\u0161\u00ed verzi HBase, a vyt\u00ed\u017een\u00ed CPU b\u011bhem z\u00e1t\u011b\u017ee se prakticky nezvy\u0161ovalo (vizu\u00e1ln\u011b o 5-10 procent). Nicm\u00e9n\u011b se pokus\u00edme spustit na t\u00e9to konfiguraci. Nastaven\u00ed tabulek je v\u00fdchoz\u00ed, \u010dten\u00ed je prov\u00e1d\u011bno v rozsahu kl\u00ed\u010d\u016f od 0 do 50 milion\u016f n\u00e1hodn\u011b (tj. v podstat\u011b poka\u017ed\u00e9 nov\u00e9). V tabulce je 50 milion\u016f z\u00e1znam\u016f, rozd\u011blen\u00fdch na 64 parti\u00ed. Kl\u00ed\u010de jsou has\u030cov\u00e1ny pomoc\u00ed crc32. Nastaven\u00ed tabulek jsou v\u00fdchoz\u00ed, MSLAB je zapnuto. Spust\u00edme 40 vl\u00e1ken, ka\u017ed\u00e9 vl\u00e1kno \u010dte sadu 100 n\u00e1hodn\u00fdch kl\u00ed\u010d\u016f a okam\u017eit\u011b zapisuje vygenerovan\u00fdch 100 byt\u016f zp\u011bt podle t\u011bchto kl\u00ed\u010d\u016f. <\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/776490f01121cc434135f733311b7722.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n St\u00e1nek: 16 DataNode a 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 vl\u00e1ken). Verze HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Pr\u016fm\u011brn\u00fd v\u00fdsledek se bl\u00ed\u017e\u00ed 40 tis\u00edc operac\u00ed za sekundu, co\u017e je v\u00fdrazn\u011b lep\u0161\u00ed ne\u017e v testu DataStax. V experiment\u00e1ln\u00edch podm\u00ednk\u00e1ch je v\u0161ak mo\u017en\u00e9 n\u011bkolik zm\u011bn. Je velmi nepravd\u011bpodobn\u00e9, \u017ee by ve\u0161ker\u00e1 pr\u00e1ce prob\u00edhala v\u00fdhradn\u011b s jednou tabulkou, stejn\u011b jako pouze s unik\u00e1tn\u00edmi kl\u00ed\u010di. P\u0159edpokl\u00e1dejme, \u017ee existuje n\u011bjak\u00e1 \u201ehork\u00e1\u201c sada kl\u00ed\u010d\u016f, kter\u00e1 generuje hlavn\u00ed z\u00e1t\u011b\u017e. Proto se pokus\u00edme vytvo\u0159it z\u00e1t\u011b\u017e s v\u011bt\u0161\u00edmi z\u00e1znamy (10 KB), tak\u00e9 po 100, do 4 r\u016fzn\u00fdch tabulek a omez\u00edme rozsah dotazovan\u00fdch kl\u00ed\u010d\u016f na 50 tis\u00edc. Na grafu n\u00ed\u017ee je zobrazeno spu\u0161t\u011bn\u00ed 40 vl\u00e1ken, ka\u017ed\u00e9 vl\u00e1kno \u010dte sadu 100 kl\u00ed\u010d\u016f a okam\u017eit\u011b zapisuje n\u00e1hodn\u00e9 10 KB podle t\u011bchto kl\u00ed\u010d\u016f zp\u011bt. <\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30d29f1b98663e3c07cb2be20e93876a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSt\u00e1nek: 16 DataNode a 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 vl\u00e1ken). Verze HBase 1.2.0-cdh5.14.2.<\/p>\n<p>B\u011bhem z\u00e1t\u011b\u017ee se n\u011bkolikr\u00e1t spou\u0161t\u011bla major compaction, jak bylo uvedeno v\u00fd\u0161e, bez tohoto postupu by v\u00fdkon postupn\u011b degradoval, av\u0161ak b\u011bhem prov\u00e1d\u011bn\u00ed tak\u00e9 vznik\u00e1 dodate\u010dn\u00e1 z\u00e1t\u011b\u017e. Poklesy jsou zp\u016fsobeny r\u016fzn\u00fdmi d\u016fvody. N\u011bkdy vl\u00e1kna dokon\u010dila svou pr\u00e1ci a zat\u00edmco se restartovala, do\u0161lo k prodlev\u011b, n\u011bkdy extern\u00ed aplikace vytv\u00e1\u0159ely z\u00e1t\u011b\u017e na cluster.<\/p>\n<p>\u010cten\u00ed a okam\u017eit\u00e9 zapisov\u00e1n\u00ed je jedn\u00edm z nejn\u00e1ro\u010dn\u011bj\u0161\u00edch sc\u00e9n\u00e1\u0159\u016f pro HBase. Pokud se pou\u017e\u00edvaj\u00ed pouze mal\u00e9 PUT po\u017eadavky, nap\u0159\u00edklad o velikosti 100 byt\u016f, a skupinuj\u00ed se do blok\u016f po 10\u201350 tis\u00edc\u00edch, lze dos\u00e1hnout stovek tis\u00edc operac\u00ed za sekundu a podobn\u011b to plat\u00ed i pro po\u017eadavky pouze na \u010dten\u00ed. Je t\u0159eba zd\u016fraznit, \u017ee v\u00fdsledky jsou radik\u00e1ln\u011b lep\u0161\u00ed ne\u017e ty, kter\u00e9 z\u00edskal DataStax, p\u0159edev\u0161\u00edm d\u00edky blokov\u00fdm po\u017eadavk\u016fm po 50 tis\u00edc\u00edch.<\/p>\n<p><img decoding=\"async\" alt=\"Teorie a praxe pou\u017e\u00edv\u00e1n\u00ed HBase\" src=\"\/wp-content\/uploads\/2020\/01\/412bda50a55093224169f048ea2f863a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSt\u00e1nek: 16 DataNode a 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 vl\u00e1ken). Verze HBase 1.2.0-cdh5.14.2.<\/p>\n<h2>10. Z\u00e1v\u011bry<\/h2>\n<p>\nTento syst\u00e9m se d\u00e1 pom\u011brn\u011b flexibiln\u011b nastavit, av\u0161ak vliv velk\u00e9ho mno\u017estv\u00ed parametr\u016f st\u00e1le z\u016fst\u00e1v\u00e1 nezn\u00e1m\u00fd. N\u011bkter\u00e9 z nich byly testov\u00e1ny, ale nebyly zahrnuty do kone\u010dn\u00e9 sady test\u016f. Nap\u0159\u00edklad p\u0159edb\u011b\u017en\u00e9 experimenty uk\u00e1zaly malou v\u00fdznamnost parametru DATA_BLOCK_ENCODING, kter\u00fd k\u00f3duje informace za pou\u017eit\u00ed hodnot z okoln\u00edch bun\u011bk, co\u017e je celkem logick\u00e9 pro data generovan\u00e1 n\u00e1hodn\u011b. V p\u0159\u00edpad\u011b pou\u017eit\u00ed velk\u00e9ho mno\u017estv\u00ed opakuj\u00edc\u00edch se objekt\u016f m\u016f\u017ee b\u00fdt zisk zna\u010dn\u00fd. Obecn\u011b lze \u0159\u00edci, \u017ee HBase p\u016fsob\u00ed jako velmi seri\u00f3zn\u00ed a promy\u0161len\u00e1 datab\u00e1ze, kter\u00e1 m\u016f\u017ee b\u00fdt p\u0159i operac\u00edch s velk\u00fdmi bloky dat dostate\u010dn\u011b v\u00fdkonn\u00e1. Zvl\u00e1\u0161\u0165 pokud existuje mo\u017enost rozlo\u017eit \u010dasov\u00e9 procesy \u010dten\u00ed a z\u00e1pisu.<\/p>\n<p>Pokud m\u00e1te pocit, \u017ee n\u011bco nen\u00ed dostate\u010dn\u011b podrobn\u011b vysv\u011btleno, r\u00e1d se pod\u011bl\u00edm o v\u00edce informac\u00ed. Nab\u00edz\u00edme mo\u017enost sd\u00edlet sv\u00e9 zku\u0161enosti nebo diskutovat, pokud nesouhlas\u00edte s n\u011b\u010d\u00edm.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sberbank\/blog\/420425\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u043d\u0438\u043b \u041b\u0438\u043f\u043e\u0432\u043e\u0439, \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0421\u0431\u0435\u0440\u0442\u0435\u0445\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HBase \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0445\u043e\u0434\u0435 \u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c (\u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e). \u0412\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 HBase 1.2.0-cdh5.14.2 \u0438 2.0.0-cdh6.0.0-beta1. \u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 HBASE \u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 HBASE [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55302","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u043d\u0438\u043b \u041b\u0438\u043f\u043e\u0432\u043e\u0439, \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0421\u0431\u0435\u0440\u0442\u0435\u0445\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HBase \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f HBase | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u043d\u0438\u043b \u041b\u0438\u043f\u043e\u0432\u043e\u0439, \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0421\u0431\u0435\u0440\u0442\u0435\u0445\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HBase \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-16T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:24+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Teorie a praxe pou\u017eit\u00ed HBase | ProHoster","description":"Dobr\u00fd den! Jmenuji se Danil Lipovoj, n\u00e1\u0161 t\u00fdm ve Sbertechu za\u010dal pou\u017e\u00edvat HBase jako \u00falo\u017ei\u0161t\u011b opera\u010dn\u00edch dat.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f HBase | ProHoster","og:description":"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u043d\u0438\u043b \u041b\u0438\u043f\u043e\u0432\u043e\u0439, \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0421\u0431\u0435\u0440\u0442\u0435\u0445\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HBase \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-16T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55302","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:46:28","updated":"2022-09-28 08:11:41","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/55302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=55302"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/55302\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=55302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=55302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=55302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}