{"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\/ro\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","title":{"rendered":"Teoria \u0219i practica utiliz\u0103rii HBase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bun\u0103 ziua! M\u0103 numesc Danil Lipovoy, echipa noastr\u0103 de la Sbertech a \u00eenceput s\u0103 foloseasc\u0103 HBase ca stocare pentru datele opera\u021bionale. \u00cen timpul studierii sale, am acumulat experien\u021b\u0103 pe care am dorit s\u0103 o sistematiz\u0103m \u0219i s\u0103 o descriem (sper\u0103m c\u0103 va fi util\u0103 multora). Toate experimentele de mai jos au fost efectuate cu versiunile HBase 1.2.0-cdh5.14.2 \u0219i 2.0.0-cdh6.0.0-beta1. <\/p>\n<ol>\n<li>Arhitectura general\u0103 <\/li>\n<li>Scrierea datelor \u00een HBASE<\/li>\n<li>Citirea datelor din HBASE<\/li>\n<li>Cache-ul de date<\/li>\n<li>Procesarea \u00een lot a datelor MultiGet\/MultiPut<\/li>\n<li>Strategia de fragmentare a tabelelor \u00een regiuni (splitting)<\/li>\n<li>Toleran\u021ba la erori, compactarea \u0219i localitatea datelor<\/li>\n<li>Configur\u0103ri \u0219i performan\u021b\u0103<\/li>\n<li>Testare de \u00eenc\u0103rcare<\/li>\n<li>Conclusions<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Arhitectura general\u0103<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30800d8a48de4c52ff1650a4f1dec4c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMasterul de rezerv\u0103 ascult\u0103 heartbeat-ul masterului activ pe nodul ZooKeeper \u0219i, \u00een cazul dispari\u021biei acestuia, preia func\u021biile masterului. <\/p>\n<h2>2. Scrierea datelor \u00een HBASE<\/h2>\n<p>\nMai \u00eent\u00e2i, s\u0103 lu\u0103m \u00een considerare cel mai simplu caz \u2013 scrierea unui obiect cheie-valoare \u00eentr-o anumit\u0103 tabel\u0103 folosind put(rowkey). Clientul trebuie s\u0103 afle mai \u00eent\u00e2i unde se afl\u0103 serverul de regiune r\u0103d\u0103cin\u0103 (Root Region Server \u2014 RRS), care stocheaz\u0103 tabela hbase:meta. Informa\u021bia aceasta o ob\u021bine de la ZooKeeper. Apoi se adreseaz\u0103 RRS-ului \u0219i cite\u0219te tabela hbase:meta, din care extrage informa\u021bia despre care RegionServer (RS) este responsabil pentru stocarea datelor pentru cheia rowkey dat\u0103 \u00een tabela care \u00eel intereseaz\u0103. \u00cen scopul utiliz\u0103rii ulterioare, tabela meta este cached de c\u0103tre client \u0219i, prin urmare, apelurile urm\u0103toare se desf\u0103\u0219oar\u0103 mai rapid, direct c\u0103tre RS.<\/p>\n<p>Apoi, RS-ul, primind cererea, mai \u00eent\u00e2i o scrie \u00een WriteAheadLog (WAL), ceea ce este necesar pentru recuperare \u00een caz de c\u0103dere. Apoi, datele sunt salvate \u00een MemStore. Acesta este un buffer \u00een memorie care con\u021bine un set ordonat de chei ale acestei regiuni. Tabela poate fi divizat\u0103 \u00een regiuni (parti\u021bii), fiecare av\u00e2nd un set de chei ne\u00eencruci\u0219at. Acest lucru permite ca, plas\u00e2nd regiunile pe servere diferite, s\u0103 se ob\u021bin\u0103 o performan\u021b\u0103 mai bun\u0103. Cu toate acestea, \u00een ciuda eviden\u021bei acestei afirma\u021bii, vom vedea mai departe c\u0103 nu func\u021bioneaz\u0103 \u00een toate cazurile.<\/p>\n<p>Dup\u0103 ce \u00eenregistrarea a fost plasat\u0103 \u00een MemStore, clientului i se returneaz\u0103 un r\u0103spuns c\u0103 \u00eenregistrarea a fost salvat\u0103 cu succes. Aceasta este, de fapt, stocat\u0103 doar \u00een buffer \u0219i va ajunge pe disc doar dup\u0103 ce va trece un anumit interval de timp sau c\u00e2nd va fi umplut cu date noi. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/10f4d5d600a20882690f5cc81322bc41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAt the execution of the 'Delete' operation, physical data deletion does not occur. They are simply marked as deleted, while the actual destruction takes place at the moment the major compact function is called, which is described in detail in section 7.<\/p>\n<p>Files in HFile format accumulate in HDFS, and from time to time, a minor compact process is triggered, which merely merges small files into larger ones without deleting anything. Over time, this turns into a problem that only manifests during data reading (we will return to this shortly). <\/p>\n<p>In addition to the loading process mentioned above, there is a much more efficient procedure, which arguably represents the strongest aspect of this database \u2013 BulkLoad. This involves manually creating HFiles and placing them on the disk, which allows for excellent scalability and achieving quite impressive speeds. Essentially, the limitation here is not HBase, but the hardware capabilities. Below are the loading results on a cluster consisting of 16 RegionServers and 16 NodeManager YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 threads), HBase version 1.2.0-cdh5.14.2. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/4e4452b216eda3269a364ea97c49120f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHere, it is evident that increasing the number of partitions (regions) in the table, as well as Spark executors, results in an increase in loading speed. Speed also depends on the volume of the write operation. Large blocks yield increases measured in MB\/sec, while small ones increase the number of inserted records per unit of time, with other factors being equal. <\/p>\n<p>It is also possible to initiate loading into two tables simultaneously, which can double the speed. Below it is shown that writing 10 KB blocks simultaneously into two tables occurs at a speed of around 600 MB\/sec each (totaling 1275 MB\/sec), which corresponds to the writing speed into one table of 623 MB\/sec (see No. 11 above).<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9f1b4fc0c80b797111494d400e9ce332.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHowever, the second run with 50 KB records shows that the loading speed increases only slightly, indicating that we are approaching the limits. It should be noted that there is practically no load on HBASE itself; all that is required from it is to first deliver data from hbase:meta, and after placing HFiles, flush the BlockCache data and save the MemStore buffer to disk, if it is not empty.<\/p>\n<h2>3. Reading data from HBASE<\/h2>\n<p>\nDac\u0103 presupunem c\u0103 toat\u0103 informa\u021bia din hbase:meta este deja disponibil\u0103 clientului (vezi p. 2), atunci cererea se trimite direct c\u0103tre RS-ul unde este stocat cheia dorit\u0103. Mai \u00eent\u00e2i, c\u0103utarea se desf\u0103\u0219oar\u0103 \u00een MemCache. Indiferent dac\u0103 datele sunt disponibile sau nu, c\u0103utarea se efectueaz\u0103 \u0219i \u00een bufferul BlockCache \u0219i, dac\u0103 este necesar, \u00een HFiles. Dac\u0103 datele sunt g\u0103site \u00een fi\u0219ier, ele sunt plasate \u00een BlockCache \u0219i la urm\u0103toarea cerere vor fi returnate mai repede. C\u0103utarea \u00een HFile se desf\u0103\u0219oar\u0103 relativ rapid datorit\u0103 utiliz\u0103rii filtrului Bloom, adic\u0103, citind un volum mic de date, se determin\u0103 imediat dac\u0103 acest fi\u0219ier con\u021bine cheia dorit\u0103 \u0219i, dac\u0103 nu, se trece la urm\u0103torul.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a21b1b825a84cfd02507ec334e9452fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDup\u0103 ob\u021binerea datelor din aceste trei surse, RS-ul formeaz\u0103 un r\u0103spuns. \u00cen special, poate transmite mai multe versiuni g\u0103site ale obiectului, dac\u0103 clientul a solicitat versionare.<\/p>\n<h2>4. Cache-ul de date<\/h2>\n<p>\nBuffer-ele MemStore \u0219i BlockCache ocup\u0103 p\u00e2n\u0103 la 80% din memoria on-heap alocat\u0103 pentru RS (restul este rezervat pentru sarcini de servicii ale RS-ului). Dac\u0103 modul tipic de utilizare este c\u0103 procesele scriu \u0219i citesc imediat aceste date, are sens s\u0103 se reduc\u0103 BlockCache \u0219i s\u0103 se creasc\u0103 MemStore, av\u00e2nd \u00een vedere c\u0103, la scriere, datele nu ajung \u00een cache-ul de citire, astfel utilizarea BlockCache-ului va fi mai rar\u0103. Buffer-ul BlockCache este compus din dou\u0103 p\u0103r\u021bi: LruBlockCache (\u00eentotdeauna on-heap) \u0219i BucketCache (de obicei off-heap sau pe SSD). Este recomandat s\u0103 utiliza\u021bi BucketCache atunci c\u00e2nd exist\u0103 foarte multe cereri de citire \u0219i acestea nu se \u00eencadreaz\u0103 \u00een LruBlockCache, ceea ce duce la o activitate intens\u0103 a Garbage Collector-ului. Totu\u0219i, nu ar trebui s\u0103 a\u0219tepta\u021bi o cre\u0219tere radical\u0103 a performan\u021bei din utilizarea cache-ului de citire, dar la acest subiect ne vom \u00eentoarce \u00een p. 8.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/17d7791a998dd7da747cb7089dce1f10.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBlockCache-ul este comun pentru \u00eentreg RS-ul, iar MemStore-ul este specific fiec\u0103rei tabele (c\u00e2te unul pentru fiecare Column Family).<\/p>\n<p>Cum <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.cloudera.com\/blog\/2012\/06\/hbase-write-path\/\">este descris<\/a><\/noindex> Teoretic, la scriere, datele nu ajung \u00een cache \u0219i \u00eentr-adev\u0103r, parametrii CACHE_DATA_ON_WRITE pentru tabel\u0103 \u0219i \u201eCache DATA on Write\u201d pentru RS sunt seta\u021bi pe false. Cu toate acestea, \u00een practic\u0103, dac\u0103 scrie\u021bi date \u00een MemStore, apoi le salva\u021bi pe disc (astfel cur\u0103\u021b\u00e2ndu-l), apoi \u0219terge\u021bi fi\u0219ierul rezultat, atunci, efectu\u00e2nd o cerere get, vom ob\u021bine cu succes datele. Chiar \u0219i dac\u0103 dezactiva\u021bi complet BlockCache \u0219i umple\u021bi tabelul cu date noi, apoi reu\u0219i\u021bi s\u0103 salva\u021bi MemStore-ul pe disc, s\u0103 le \u0219terge\u021bi \u0219i s\u0103 solicita\u021bi dintr-o alt\u0103 sesiune, acestea vor fi extrase totu\u0219i din undeva. A\u0219adar, HBase stocheaz\u0103 nu doar date, ci \u0219i mistere fascinante.<\/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>\nParametrul \u201eCache DATA on Read\u201d este setat pe false. Dac\u0103 ave\u021bi sugestii, v\u0103 rug\u0103m s\u0103 le discuta\u021bi \u00een comentarii.<\/p>\n<h2>5. Procesarea \u00een loturi a datelor MultiGet\/MultiPut<\/h2>\n<p>\nProcesarea cererilor individuale (Get\/Put\/Delete) este o opera\u021biune destul de costisitoare, a\u0219a c\u0103 ar trebui s\u0103 le combin\u0103m, dac\u0103 este posibil, \u00eentr-o List sau List, ceea ce permite ob\u021binerea unui c\u00e2\u0219tig semnificativ de performan\u021b\u0103. Acest lucru este deosebit de important \u00een cazul opera\u021biunilor de scriere, iar \u00een ceea ce prive\u0219te citirea, exist\u0103 un alt obstacol. \u00cen graficul de mai jos este prezentat timpul necesar pentru citirea a 50.000 de \u00eenregistr\u0103ri din MemStore. Citirea a fost efectuat\u0103 pe un singur fir, iar pe axa orizontal\u0103 este ar\u0103tat num\u0103rul de chei \u00een cerere. Se poate observa c\u0103, atunci c\u00e2nd num\u0103rul de chei \u00eentr-o cerere ajunge la o mie, timpul de execu\u021bie scade, adic\u0103 viteza cre\u0219te. Cu toate acestea, \u00een modul MSLAB activat implicit, dup\u0103 acest prag, performan\u021ba \u00eencepe s\u0103 scad\u0103 dramatic, iar cu c\u00e2t volumul de date din \u00eenregistrare este mai mare, cu at\u00e2t timpul de execu\u021bie este mai mare. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/42d3a77d66770a7fed03f83fecdca470.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeste au fost efectuate pe o ma\u0219in\u0103 virtual\u0103, cu 8 nuclee, versiunea HBase 2.0.0-cdh6.0.0-beta1.<\/p>\n<p>Modul MSLAB este destinat reducerii fragment\u0103rii heap-ului, care apare din amestecarea datelor din genera\u021bii noi \u0219i vechi. Ca solu\u021bie, atunci c\u00e2nd MSLAB este activat, datele sunt plasate \u00een celule relativ mici (chunk) \u0219i sunt procesate pe por\u021biuni. Drept rezultat, atunci c\u00e2nd volumul datelor solicitate dep\u0103\u0219e\u0219te dimensiunea alocat\u0103, performan\u021ba scade brusc. Pe de alt\u0103 parte, dezactivarea acestui mod nu este de asemenea de dorit, deoarece va duce la opriri din cauza GC \u00een momentele de munc\u0103 intens\u0103 cu datele. O solu\u021bie bun\u0103 este cre\u0219terea dimensiunilor celulei, \u00een cazul unei scrieri active prin put simultan cu citirea. Este de men\u021bionat c\u0103 problema nu apare dac\u0103 dup\u0103 scriere se execut\u0103 comanda flush, care descarc\u0103 MemStore pe disc sau dac\u0103 se efectueaz\u0103 \u00eenc\u0103rcarea prin BulkLoad. \u00cen tabelul de mai jos se arat\u0103 c\u0103 cererile din MemStore pentru date de volum mai mare (\u0219i acela\u0219i num\u0103r) duc la \u00eencetinire. Cu toate acestea, cresc\u00e2nd chunksize, timpul de procesare revine la normal.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/0076215bd171257548f8a4c4d4229ba0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPe l\u00e2ng\u0103 cre\u0219terea chunksize, ajut\u0103 \u0219i divizarea datelor pe regiuni, adic\u0103 splitarea tabelelor. Acest lucru face ca pentru fiecare regiune s\u0103 vin\u0103 un num\u0103r mai mic de cereri \u0219i, dac\u0103 acestea sunt plasate \u00een celule, r\u0103spunsul r\u0103m\u00e2ne bun.<\/p>\n<h2>6. Strategia de divizare a tabelelor pe regiuni (splitare)<\/h2>\n<p>\nDeoarece HBase este o stocare de tip key-value \u0219i partizionarea se face pe cheie, este extrem de important s\u0103 se \u00eempart\u0103 datele uniform pe toate regiunile. De exemplu, partionarea unei astfel de tabele \u00een trei p\u0103r\u021bi va duce la faptul c\u0103 datele vor fi \u00eemp\u0103r\u021bite \u00een trei regiuni:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a811ae81e77b48dbf28ed86dbdc35739.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUneori, aceasta duce la o \u00eencetinire brusc\u0103, dac\u0103 datele ulterior \u00eenc\u0103rcate vor avea, de exemplu, valori de tip long care \u00een mare parte \u00eencep cu aceea\u0219i cifr\u0103, de exemplu:<\/p>\n<p>1000001<br \/>\n1000002<br \/>\n\u2026<br \/>\n1100003<\/p>\n<p>Deoarece cheile sunt stocate sub forma unui array de bytes, toate acestea vor \u00eencepe la fel \u0219i vor apar\u021bine acelea\u0219i regiuni #1 care stocheaz\u0103 acest interval de chei. Exist\u0103 mai multe strategii de divizare:<\/p>\n<p>HexStringSplit \u2013 Transform\u0103 cheia \u00eentr-un \u0219ir cu codificare hexadecimal\u0103 \u00een intervalul \u201e00000000\u201d =&gt; \u201eFFFFFFFF\u201d \u0219i complet\u00e2nd cu zerouri la st\u00e2nga.<\/p>\n<p>UniformSplit \u2013 Transform\u0103 cheia \u00eentr-un array de bytes cu codificare hexadecimal\u0103 \u00een intervalul \u201e00\u201d =&gt; \u201eFF\u201d \u0219i complet\u00e2nd cu zerouri la dreapta.<\/p>\n<p>\u00cen plus, se poate specifica orice interval sau set de chei pentru divizare \u0219i se poate activa autosplitarea. Totu\u0219i, una dintre cele mai simple \u0219i eficiente abord\u0103ri este UniformSplit \u0219i utilizarea concaten\u0103rii hash-ului, de exemplu, prima pereche de bytes din rularea cheii prin func\u021bia CRC32(rowkey) \u0219i cheia rowkey propriu-zis\u0103:<\/p>\n<p>hash + rowkey<\/p>\n<p>Atunci toate datele vor fi distribuite uniform pe regiuni. La citire, primii doi bytes sunt pur \u0219i simplu elimina\u021bi \u0219i r\u0103m\u00e2ne cheia original\u0103. De asemenea, RS controleaz\u0103 cantitatea de date \u0219i chei din regiune \u0219i, \u00een cazul dep\u0103\u0219irii limitelor, le \u00eemp\u0103r\u021beste automat \u00een p\u0103r\u021bi. <\/p>\n<h2>7. Toleran\u021ba la erori \u0219i localizarea datelor<\/h2>\n<p>\nDat fiecare set de chei este responsabil pentru o singur\u0103 regiune, solu\u021bia problemelor legate de pr\u0103bu\u0219irile RS sau de externalizarea acestora este stocarea tuturor datelor necesare \u00een HDFS. Atunci c\u00e2nd RS cedeaz\u0103, masterul detecteaz\u0103 acest lucru prin absen\u021ba heartbeat-ului pe nodul ZooKeeper. Acesta nume\u0219te o regiune alternativ\u0103 unui alt RS \u0219i, deoarece HFiles sunt stocate \u00een sistemul de fi\u0219iere distribuit, noul proprietar le cite\u0219te \u0219i continu\u0103 s\u0103 serveasc\u0103 datele. Totu\u0219i, deoarece o parte din date poate fi \u00een MemStore \u0219i nu a ajuns s\u0103 fie transferat\u0103 \u00een HFiles, pentru a restaura istoricul opera\u021biunilor se utilizeaz\u0103 WAL, care sunt de asemenea stocate \u00een HDFS. Dup\u0103 aplicarea modific\u0103rilor, RS-ul este capabil s\u0103 r\u0103spund\u0103 la cereri, \u00eens\u0103 migrarea duce la faptul c\u0103 o parte din date \u0219i procesele care le servesc se afl\u0103 pe noduri diferite, adic\u0103 localitatea scade. <\/p>\n<p>Solu\u021bia problemei este major compaction \u2013 aceast\u0103 procedur\u0103 mut\u0103 fi\u0219ierele pe nodurile care le gestioneaz\u0103 (acolo unde sunt situate regiunile lor), rezult\u00e2nd \u00eentr-o \u00eenc\u0103rcare brusc\u0103 a re\u021belei \u0219i discurilor \u00een timpul acestei proceduri. Cu toate acestea, accesul la date devine semnificativ mai rapid ulterior. \u00cen plus, major_compaction realizeaz\u0103 combinarea tuturor HFiles \u00eentr-un singur fi\u0219ier \u00een cadrul regiunii, precum \u0219i cur\u0103\u021barea datelor \u00een func\u021bie de set\u0103rile tabelului. De exemplu, se poate seta num\u0103rul de versiuni ale unui obiect care trebuie p\u0103strat sau timpul s\u0103u de via\u021b\u0103, dup\u0103 expirarea c\u0103ruia obiectul este \u0219ters fizic.<\/p>\n<p>Aceast\u0103 procedur\u0103 poate avea un impact foarte pozitiv asupra func\u021bion\u0103rii HBase. \u00cen imaginea de mai jos se poate observa cum a degenerat performan\u021ba ca urmare a scrierii active de date. Aici se poate observa cum 40 de fire scriu \u00eentr-un singur tabel \u0219i 40 de fire citesc simultan datele. Firele care scriu formeaz\u0103 din ce \u00een ce mai multe HFiles, care sunt citite de celelalte fire. Ca rezultat, din ce \u00een ce mai multe date trebuie \u0219terse din memorie \u0219i, la un moment dat, \u00eencepe s\u0103 func\u021bioneze GC-ul, care practic paralizeaz\u0103 toat\u0103 activitatea. Lansarea major compaction a dus la cur\u0103\u021barea acumul\u0103rilor create \u0219i la restabilirea performan\u021bei.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/6c93b2c10c197663785d3de0bb185481.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTestul a fost efectuat pe 3 DataNode \u0219i 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 fire). Versiunea HBase este 1.2.0-cdh5.14.2<\/p>\n<p>Este important de men\u021bionat c\u0103 lansarea major compaction a fost efectuat\u0103 pe o tabel\u0103 \u201evie\u201d, \u00een care se scriau \u0219i se citeau activ date. \u00cen re\u021bea s-a \u00eent\u00e2lnit afirma\u021bia c\u0103 acest lucru poate duce la un r\u0103spuns incorect atunci c\u00e2nd se citesc date. Pentru verificare, a fost lansat un proces care genera date noi \u0219i le scria \u00een tabel\u0103. Dup\u0103 aceea, datele erau citite imediat \u0219i se verifica dac\u0103 valoarea ob\u021binut\u0103 corespundea cu ceea ce fusese scris. \u00cen timpul desf\u0103\u0219ur\u0103rii acestui proces, major compaction a fost lansat de aproximativ 200 de ori \u0219i nu a fost \u00eenregistrat\u0103 nicio eroare. Este posibil ca problema s\u0103 se manifeste rar \u0219i doar \u00een timpul unei sarcini mari, a\u0219a c\u0103 mai sigur ar fi totu\u0219i s\u0103 se opreasc\u0103 planificat procesele de scriere \u0219i citire \u0219i s\u0103 se efectueze cur\u0103\u021barea, evit\u00e2nd astfel sc\u0103derile GC.<\/p>\n<p>De asemenea, major compaction nu influen\u021beaz\u0103 starea MemStore, pentru a-l scrie pe disc \u0219i a compacta, trebuie utilizat flush (connection.getAdmin().flush(TableName.valueOf(tblName))).<\/p>\n<h2>8. Set\u0103ri \u0219i performan\u021b\u0103<\/h2>\n<p>\nDup\u0103 cum s-a spus, HBase \u00ee\u0219i arat\u0103 cel mai mare succes acolo unde nu trebuie s\u0103 fac\u0103 nimic, \u00een timpul execut\u0103rii BulkLoad. Totu\u0219i, acest lucru se aplic\u0103 majorit\u0103\u021bii sistemelor \u0219i oamenilor. Cu toate acestea, acest instrument este mai potrivit pentru \u00eenc\u0103rcarea masiv\u0103 a datelor \u00een blocuri mari, \u00een timp ce, dac\u0103 procesul necesit\u0103 executarea unui num\u0103r mare de cereri concurente de citire \u0219i scriere, se folosesc comenzile Get \u0219i Put descrise mai sus. Pentru a determina parametrii optimi, au fost efectuate lans\u0103ri cu diferite combina\u021bii de parametri de tabele \u0219i set\u0103ri:<\/p>\n<ul>\n<li>Au fost lansate 10 fire simultan de 3 ori la r\u00e2nd (s\u0103 numim aceasta un bloc de fire). <\/li>\n<li>Timpul de func\u021bionare al tuturor firelor \u00een bloc a fost mediat \u0219i a constituit rezultatul final al blocului.<\/li>\n<li>Toate firele lucrau cu aceea\u0219i tabel\u0103. <\/li>\n<li>\u00cenainte de fiecare lansare a blocului de fire, se efectua o compac\u021bie major\u0103.<\/li>\n<li>Fiecare bloc efectua doar una dintre urm\u0103toarele opera\u021biuni: <\/li>\n<\/ul>\n<p>\n \u2014 Put<br \/>\n \u2014 Get<br \/>\n \u2014 Get+Put<\/p>\n<ul>\n<li>Fiecare bloc efectua 50.000 de repet\u0103ri ale opera\u021biunii sale.<\/li>\n<li>Dimensiunea \u00eenregistr\u0103rii \u00een bloc era de 100 byte, 1000 byte sau 10000 byte (random).<\/li>\n<li>Blocurile erau lansate cu un num\u0103r diferit de chei solicitate (sau o cheie sau 10).<\/li>\n<li>Blocurile erau lansate cu diferite set\u0103ri ale tabelului. Parametrii modificati erau:<\/li>\n<\/ul>\n<p>\n \u2014 BlockCache = activat sau dezactivat<br \/>\n \u2014 BlockSize = 65 KB sau 16 KB<br \/>\n \u2014 Partitii = 1, 5 sau 30<br \/>\n \u2014 MSLAB = activat sau dezactivat<\/p>\n<p>Astfel, blocul arat\u0103 astfel:<\/p>\n<p>a. Modurile MSLAB erau activate\/dezactivate.<br \/>\nb. A fost creat un tabel, pentru care au fost stabilite urm\u0103toarele parametrii: BlockCache = true\/none, BlockSize = 65\/16 Kb, Partitions = 1\/5\/30. <br \/>\nc. A fost setat compresia GZ.<br \/>\nd. Au fost lansate 10 fire de execu\u021bie care efectueaz\u0103 simultan 1\/10 opera\u021biuni put\/get\/get+put pe acest tabel cu \u00eenregistr\u0103ri de 100\/1000\/10000 de bytes, execut\u00e2nd 50.000 de cereri consecutiv (cheile sunt aleatoare).<br \/>\ne. Punctul d a fost repetat de trei ori.<br \/>\nf. Timpul de execu\u021bie al tuturor firelor a fost mediat. <\/p>\n<p>Au fost verificate toate combina\u021biile posibile. Este previzibil c\u0103, pe m\u0103sur\u0103 ce dimensiunea \u00eenregistr\u0103rii cre\u0219te, viteza va sc\u0103dea sau c\u0103 dezactivarea cache-ului va duce la o \u00eencetinire. Cu toate acestea, scopul a fost s\u0103 \u00een\u021belegem gradul \u0219i semnifica\u021bia influen\u021bei fiec\u0103rui parametru, astfel \u00eenc\u00e2t datele colectate au fost introduse \u00een func\u021bia de regresie liniar\u0103, care permite evaluarea fiabilit\u0103\u021bii prin intermediul statisticii t. Mai jos sunt prezentate rezultatele blocurilor care efectueaz\u0103 opera\u021biuni Put. Num\u0103rul total de combina\u021bii 2*2*3*2*3 = 144 variante + 72 deoarece unele au fost executate de dou\u0103 ori. A\u0219adar, \u00een total 216 execu\u021bii:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/7a13c7a9b3ff1859976800f5d45cd51b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTestarea a fost realizat\u0103 pe un mini-cluster format din 3 DataNode \u0219i 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 thread-uri). Versiunea HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Cea mai mare vitez\u0103 de inserare de 3.7 secunde a fost ob\u021binut\u0103 \u00een modul MSLAB dezactivat, pe un tabel cu o singur\u0103 parti\u021bie, cu BlockCache activat, BlockSize = 16, \u00eenregistr\u0103ri de 100 bytes, 10 buc\u0103\u021bi per pachet.<br \/>\nCea mai mic\u0103 vitez\u0103 de inserare de 82.8 secunde a fost ob\u021binut\u0103 \u00een modul MSLAB activat, pe un tabel cu o singur\u0103 parti\u021bie, cu BlockCache activat, BlockSize = 16, \u00eenregistr\u0103ri de 10000 bytes, 1 bucat\u0103 per r\u00e2nd.<\/p>\n<p>Acum s\u0103 ne uit\u0103m la model. Observ\u0103m o calitate bun\u0103 a modelului conform R2, dar este foarte clar c\u0103 extrapolarea este contraindicat\u0103 aici. Comportamentul real al sistemului \u00een func\u021bie de parametrii va fi non-liniar, acest model este necesar nu pentru prognoze, ci pentru a \u00een\u021belege ce s-a \u00eent\u00e2mplat \u00een cadrul parametru-lor specificate. De exemplu, aici vedem c\u0103, conform criteriului Student, pentru opera\u021bia Put, parametrii BlockSize \u0219i BlockCache nu au importan\u021b\u0103 (ceea ce este, \u00een general, destul de previzibil):<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/2fb65d1809d53f2b47f4f8829a9efc65.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCeea ce este surprinz\u0103tor este c\u0103 cre\u0219terea num\u0103rului de parti\u021bii duce la sc\u0103derea performan\u021bei (deja am observat un impact pozitiv al cre\u0219terii num\u0103rului de parti\u021bii \u00een cazul BulkLoad), de\u0219i este explicabil. \u00cen primul r\u00e2nd, pentru procesare este necesar s\u0103 se formeze cereri c\u0103tre 30 de regiuni \u00een loc de una, iar volumul de date nu este suficient pentru a aduce un avantaj. \u00cen al doilea r\u00e2nd, timpul total de execu\u021bie este determinat de cel mai lent RS, iar cum num\u0103rul de DataNode este mai mic dec\u00e2t num\u0103rul de RS, o parte din regiuni au localitate zero. \u0218i acum s\u0103 privim top cinci lideri:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8ad7e832879156eaa96e630458405cdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAcum s\u0103 evalu\u0103m rezultatele execu\u021biei blocurilor Get:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8a5dd45422c74e8815011d7e9b805ccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNum\u0103rul de parti\u021bii \u0219i-a pierdut semnifica\u021bia, ceea ce probabil se explic\u0103 prin faptul c\u0103 datele sunt bine cached, iar cache-ul pentru citiri este parametru cel mai semnificativ (din punct de vedere statistic). Evident, cre\u0219terea num\u0103rului de mesaje \u00een cerere este, de asemenea, foarte benefic\u0103 pentru performan\u021b\u0103. Cele mai bune rezultate:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9d237f9fdbeaf5412daec2fc2fa24b01.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u0218i \u00een sf\u00e2r\u0219it, s\u0103 ne uit\u0103m la modelul blocului care a executat mai \u00eent\u00e2i get, apoi put:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/75137207a4a69acccad036882794094b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAici toate parametrii sunt semnificativi. Iat\u0103 rezultatele liderilor:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/c166933d81e86f36958e3af58297f876.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>9. Testare de stres<\/h2>\n<p>\n\u0218i \u00een sf\u00e2r\u0219it, s\u0103 lans\u0103m o \u00eenc\u0103rcare mai mult sau mai pu\u021bin decent\u0103, dar este \u00eentotdeauna mai interesant c\u00e2nd avem cu ce compara. Pe site-ul DataStax \u2013 dezvoltatorul principal al Cassandra este <noindex><a rel=\"nofollow\" href=\"https:\/\/www.datastax.com\/wp-content\/themes\/datastax-2014-08\/files\/NoSQL_Benchmarks_EndPoint.pdf\">rezultatele<\/a><\/noindex> NT-ul mai multor stoc\u0103ri NoSQL, inclusiv HBase versiunea 0.98.6-1. \u00cenc\u0103rcarea a fost realizat\u0103 cu 40 de fire, dimensiunea datelor de 100 de bi\u021bi, discurile SSD. Rezultatul test\u0103rii opera\u021biunilor Read-Modify-Write a ar\u0103tat urm\u0103toarele rezultate.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/521e9dff60f462e6dabebc1234e028be.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Din c\u00e2te am \u00een\u021beles, citirea a fost realizat\u0103 \u00een blocuri de 100 de \u00eenregistr\u0103ri \u0219i pentru 16 noduri HBase, testul DataStax a ar\u0103tat o performan\u021b\u0103 de 10.000 de opera\u021biuni pe secund\u0103. <\/p>\n<p>Este bine c\u0103 avem \u0219i noi 16 noduri \u00een cluster, dar nu este foarte \"bine\" c\u0103 fiecare are 64 de nuclee (fire), \u00een timp ce \u00een testul DataStax aveau doar 4. Pe de alt\u0103 parte, ei au SSD-uri, iar noi HDD-uri \u0219i o versiune mai nou\u0103 de HBase, iar utilizarea CPU-ului \u00een timpul sarcinilor de lucru nu a crescut semnificativ (vizual cu 5-10 procente). Cu toate acestea, vom \u00eencerca s\u0103 pornim pe aceast\u0103 configura\u021bie. Set\u0103rile tabelului sunt implicite, iar citirea se face \u00een intervalul cheilor de la 0 la 50 de milioane, la \u00eent\u00e2mplare (adic\u0103, \u00een esen\u021b\u0103, de fiecare dat\u0103 nou). \u00cen tabel sunt 50 de milioane de \u00eenregistr\u0103ri, \u00eemp\u0103r\u021bite \u00een 64 de parti\u021bii. Cheile sunt hash-uite pe crc32. Set\u0103rile tabelului sunt implicite, MSLAB este activat. Vom lansa 40 de fire, fiecare citind un set de 100 de chei aleatorii \u0219i imediat scriind 100 de octe\u021bi genera\u021bi \u00eenapoi pe aceste chei. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/776490f01121cc434135f733311b7722.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Stand: 16 DataNode \u0219i 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 fire). Versiunea HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Rezultatul mediu se apropie de 40 de mii de opera\u021biuni pe secund\u0103, ceea ce este semnificativ mai bine dec\u00e2t \u00een testul DataStax. Cu toate acestea, \u00een scopuri experimentale, putem modifica pu\u021bin condi\u021biile. Este destul de pu\u021bin probabil ca toat\u0103 munca s\u0103 fie efectuat\u0103 exclusiv cu o singur\u0103 tabel\u0103 \u0219i doar cu chei unice. S\u0103 presupunem c\u0103 exist\u0103 un set de chei \u201efierbin\u021bi\u201d care genereaz\u0103 majoritatea \u00eenc\u0103rc\u0103turii. Prin urmare, vom \u00eencerca s\u0103 cre\u0103m o \u00eenc\u0103rc\u0103tur\u0103 cu \u00eenregistr\u0103ri mai mari (10 KB), de asemenea, \u00een pachete de 100, \u00een 4 tabele diferite \u0219i limit\u00e2nd intervalul cheilor solicitate la 50 de mii. \u00cen graficul de mai jos, este ar\u0103tat\u0103 lansarea a 40 de fire, fiecare citind un set de 100 de chei \u0219i imediat scriind 10 KB aleatorii \u00eenapoi pe aceste chei. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30d29f1b98663e3c07cb2be20e93876a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNode \u0219i 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 fire). Versiunea HBase 1.2.0-cdh5.14.2.<\/p>\n<p>\u00cen timpul \u00eenc\u0103rc\u0103rii, a fost ini\u021biat de mai multe ori compac\u021bia major\u0103, a\u0219a cum s-a ar\u0103tat mai sus, f\u0103r\u0103 aceast\u0103 procedur\u0103 performan\u021ba va degrada treptat, totu\u0219i, \u00een timpul execu\u021biei apare \u0219i o \u00eenc\u0103rc\u0103tur\u0103 suplimentar\u0103. Sc\u0103derile sunt cauzate de diferite motive. Uneori firele \u00eencetau s\u0103 func\u021bioneze \u0219i, \u00een timp ce erau repornite, ap\u0103rea o pauz\u0103, iar alteori aplica\u021biile externe creau o \u00eenc\u0103rc\u0103tur\u0103 pe cluster.<\/p>\n<p>Citirea \u0219i scrierea imediat\u0103 sunt unul dintre cele mai dificile scenarii de utilizare pentru HBase. Dac\u0103 se efectueaz\u0103 doar cereri de tip put de dimensiuni mici, de exemplu, de 100 de octe\u021bi, grup\u00e2ndu-le \u00een pachete de 10.000-50.000, pot fi ob\u021binute sute de mii de opera\u021biuni pe secund\u0103, iar situa\u021bia este similar\u0103 cu cererile doar de citire. Merit\u0103 men\u021bionat c\u0103 rezultatele sunt radical mai bune dec\u00e2t cele ob\u021binute de DataStax, \u00een mare parte datorit\u0103 cererilor \u00een bloc de 50.000.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria \u0219i practica utiliz\u0103rii HBase\" src=\"\/wp-content\/uploads\/2020\/01\/412bda50a55093224169f048ea2f863a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNode \u0219i 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 fire). Versiunea HBase 1.2.0-cdh5.14.2.<\/p>\n<h2>10. Concluzii<\/h2>\n<p>\nAcest sistem este destul de flexibil \u00een configurare, \u00eens\u0103 influen\u021ba unui num\u0103r mare de parametri r\u0103m\u00e2ne \u00een continuare necunoscut\u0103. O parte dintre ace\u0219tia au fost testa\u021bi, dar nu au fost inclusi \u00een setul de teste rezultat. De exemplu, experimentele preliminare au ar\u0103tat o semnifica\u021bie nesemnificativ\u0103 a parametrului DATA_BLOCK_ENCODING, care codific\u0103 informa\u021bia folosind valori din celulele adiacente, ceea ce este destul de explicabil pentru datele generate aleatoriu. \u00cen cazul utiliz\u0103rii unui num\u0103r mare de obiecte repetitive, c\u00e2\u0219tigul poate fi semnificativ. \u00cen general, se poate spune c\u0103 HBase d\u0103 impresia unei baze de date destul de serioase \u0219i bine g\u00e2ndite, care poate fi suficient de performant\u0103 \u00een opera\u021biuni cu blocuri mari de date. Mai ales dac\u0103 exist\u0103 posibilitatea de a defalca \u00een timp procesele de citire \u0219i scriere.<\/p>\n<p>Dac\u0103 considera\u021bi c\u0103 ceva nu este suficient dezv\u0103luit, sunt gata s\u0103 discut mai \u00een detaliu. V\u0103 propun s\u0103 ne \u00eemp\u0103rt\u0103\u0219im experien\u021bele sau s\u0103 discut\u0103m dac\u0103 nu sunte\u021bi de acord cu ceva.<br \/>\n<br \/>Sursa: <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\/ro\/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=\"ro_RO\" \/>\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\/ro\/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\udd47Teoria \u0219i practica utiliz\u0103rii HBase | ProHoster","description":"Bun\u0103 ziua! M\u0103 numesc Danil Lipovoy, echipa noastr\u0103 de la Sbertech a \u00eenceput s\u0103 utilizeze HBase ca depozit pentru datele opera\u021bionale.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/55302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=55302"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/55302\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=55302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=55302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=55302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}