{"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\/da\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","title":{"rendered":"Teori og praksis i brugen af HBase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Goddag! Mit navn er Danil Lipovoy, og vores team i Sbertech er begyndt at bruge HBase som lager til operationelle data. Gennem vores unders\u00f8gelse er der blevet indsamlet erfaring, som vi \u00f8nskede at systematisere og beskrive (vi h\u00e5ber, det vil v\u00e6re nyttigt for mange). Alle de f\u00f8lgende eksperimenter er udf\u00f8rt med versioner af HBase 1.2.0-cdh5.14.2 og 2.0.0-cdh6.0.0-beta1. <\/p>\n<ol>\n<li>Generel Arkitektur <\/li>\n<li>Skrivning af data til HBASE<\/li>\n<li>L\u00e6sning af data fra HBASE<\/li>\n<li>Cachelagring af data<\/li>\n<li>Batchbehandling af data MultiGet\/MultiPut<\/li>\n<li>Strategi for opdeling af tabeller i regioner (splittning)<\/li>\n<li>Fejltolerance, komprimering og datalokalsitet<\/li>\n<li>Indstillinger og ydeevne<\/li>\n<li>Belastningstest<\/li>\n<li>Konklusioner<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Generel Arkitektur<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30800d8a48de4c52ff1650a4f1dec4c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDen backup Master overv\u00e5ger heartbeat fra den aktive p\u00e5 ZooKeeper og p\u00e5tager sig masterens funktioner i tilf\u00e6lde af nedbrud. <\/p>\n<h2>2. Skrivning af data til HBASE<\/h2>\n<p>\nLad os f\u00f8rst se p\u00e5 det enkleste tilf\u00e6lde \u2013 skrivning af et n\u00f8gle-v\u00e6rdi objekt til en given tabel ved hj\u00e6lp af put(rowkey). Klienten skal f\u00f8rst finde ud af, hvor roden region server (Root Region Server \u2014 RRS) er placeret, som opbevarer tabellen hbase:meta. Denne information f\u00e5r han fra ZooKeeper. Derefter henvender han sig til RRS og l\u00e6ser tabellen hbase:meta, hvorfra han udtr\u00e6kker information om, hvilken RegionServer (RS) der ansvarer for opbevaring af dataene for den angivne rowkey i den \u00f8nskede tabel. Af hensyn til videre brug cachelageres meta-tabellen af klienten, og derfor g\u00e5r efterf\u00f8lgende henvendelser hurtigere, direkte til RS.<\/p>\n<p>N\u00e5r RS modtager anmodningen, skriver den f\u00f8rst denne til WriteAheadLog (WAL), som er n\u00f8dvendig for at kunne genskabe ved nedbrud. Derefter gemmer den dataene i MemStore. Dette er en buffer i hukommelsen, som indeholder et sorteret s\u00e6t af n\u00f8gler for denne region. Tabellen kan opdeles i regioner (partitioner), hver af dem indeholder et ikke-overlappende s\u00e6t af n\u00f8gler. Dette g\u00f8r det muligt at opn\u00e5 h\u00f8jere ydeevne ved at placere regionerne p\u00e5 forskellige servere. Men p\u00e5 trods af \u00e5benlyse fordele vil vi se, at dette ikke altid fungerer.<\/p>\n<p>Efter at posten er placeret i MemStore, f\u00e5r klienten et svar om, at posten er gemt succesfuldt. I virkeligheden opbevares den kun i bufferen og vil blive skrevet til disken f\u00f8rst efter en vis tidsperiode eller ved at blive fyldt med nye data. <\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/10f4d5d600a20882690f5cc81322bc41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVed udf\u00f8relse af operationen \u00abDelete\u00bb sker der ikke fysisk sletning af data. De markeres blot som slettede, og selve destruktionen finder sted ved opkald af funktionen major compact, som der st\u00e5r mere om i punkt 7.<\/p>\n<p>Filer i HFile-formatet oplagres i HDFS, og der startes fra tid til anden en minor compact-proces, der blot sammenklemmer sm\u00e5 filer til st\u00f8rre, uden at slette noget. Over tid bliver dette et problem, der kun viser sig ved l\u00e6sning af data (det vender vi tilbage til senere). <\/p>\n<p>Udover den ovenfor beskrevne indl\u00e6sning er der en langt mere effektiv procedure, som m\u00e5ske er den st\u00e6rkeste side ved denne database \u2013 BulkLoad. Det involverer, at vi selv opretter HFiles og placerer dem p\u00e5 disken, hvilket g\u00f8r det muligt at skalere fremragende og opn\u00e5 ganske respektable hastigheder. I bund og grund er begr\u00e6nsningen ikke HBase, men hardware-mulighederne. Nedenfor er resultaterne af indl\u00e6sning p\u00e5 en klynge best\u00e5ende af 16 RegionServers og 16 NodeManager YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 tr\u00e5de), HBase version 1.2.0-cdh5.14.2. <\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/4e4452b216eda3269a364ea97c49120f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHer kan vi se, at ved at \u00f8ge antallet af partitioner (regioner) i tabellen samt Spark-udf\u00f8rere, f\u00e5r vi en stigning i indl\u00e6sningshastigheden. Hastigheden afh\u00e6nger ogs\u00e5 af m\u00e6ngden af data, der skrives. Store blokke giver en stigning m\u00e5lt i MB\/sek, mens sm\u00e5 giver en stigning i antallet af indsatte poster pr. tidsenhed, alt andet lige. <\/p>\n<p>Man kan ogs\u00e5 starte indl\u00e6sningen i to tabeller samtidigt og opn\u00e5 en fordobling af hastigheden. Nedenfor ses det, at skrivning af 10 KB blokke samtidigt i to tabeller sker med en hastighed p\u00e5 omkring 600 MB\/sek til hver (i alt 1275 MB\/sek), hvilket matcher skrivningshastigheden i en enkelt tabel p\u00e5 623 MB\/sek (se nr. 11 ovenfor).<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9f1b4fc0c80b797111494d400e9ce332.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMen den anden k\u00f8rsel med indskrifter p\u00e5 50 KB viser, at indl\u00e6sningshastigheden kun stiger ubetydeligt, hvilket indikerer, at vi n\u00e6rmer os de maksimale v\u00e6rdier. Det skal bem\u00e6rkes, at der ikke praktisk talt skabes belastning p\u00e5 selve HBASE; alt hvad der kr\u00e6ves af den, er f\u00f8rst at sende data fra hbase:meta, og efter placeringen af HFiles, at tilbagel\u00e6gge data fra BlockCache og gemme MemStore-pufferen p\u00e5 disken, hvis den ikke er tom.<\/p>\n<h2>3. L\u00e6sning af data fra HBASE<\/h2>\n<p>\nHvis man antager, at alle oplysninger fra hbase:meta allerede er tilg\u00e6ngelige for kunden (se punkt 2), s\u00e5 sendes foresp\u00f8rgslen straks til den RS, hvor den n\u00f8dvendige n\u00f8gle er gemt. F\u00f8rst udf\u00f8res s\u00f8gningen i MemCache. Uanset om der er data der eller ej, udf\u00f8res s\u00f8gningen ogs\u00e5 i BlockCache-bufferen og om n\u00f8dvendigt i HFiles. Hvis dataene findes i filen, placeres de i BlockCache, og ved n\u00e6ste foresp\u00f8rgsel vil de blive returneret hurtigere. S\u00f8gningen i HFile sker relativt hurtigt takket v\u00e6re brugen af en Bloom-filter, dvs. ved at l\u00e6se et lille datavolumen bestemmer den straks, om denne fil indeholder den n\u00f8dvendige n\u00f8gle, og hvis ikke, g\u00e5r den videre til den n\u00e6ste.<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a21b1b825a84cfd02507ec334e9452fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00e5r RS har modtaget data fra disse tre kilder, danner den et svar. Specifikt kan den straks overf\u00f8re flere fundne versioner af objektet, hvis klienten har anmodet om versionskontrol.<\/p>\n<h2>4. Data caching<\/h2>\n<p>\nMemStore- og BlockCache-bufferne optager op til 80% af den tildelte on-heap hukommelse hos RS (det resterende er reserveret til servicem\u00e6ssige opgaver hos RS). Hvis den typiske brug er s\u00e5dan, at processerne skriver og straks l\u00e6ser disse data, giver det mening at reducere BlockCache og \u00f8ge MemStore, da dataene ved skrivning ikke kommer ind i cache til l\u00e6sning, s\u00e5 brugen af BlockCache vil ske sj\u00e6ldnere. BlockCache-bufferen best\u00e5r af to dele: LruBlockCache (altid on-heap) og BucketCache (normalt off-heap eller p\u00e5 SSD). BucketCache b\u00f8r bruges, n\u00e5r der er mange l\u00e6seanmodninger, og de ikke kan v\u00e6re i LruBlockCache, hvilket f\u00f8rer til aktiv drift af Garbage Collector. Selvom man ikke skal forvente en dramatisk stigning i ydeevnen ved brug af cache til l\u00e6sning, vil vi komme tilbage til dette i punkt 8.<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/17d7791a998dd7da747cb7089dce1f10.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBlockCache er f\u00e6lles for hele RS, mens MemStore er unik for hver tabel (\u00e9n for hver Column Family).<\/p>\n<p>siger <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.cloudera.com\/blog\/2012\/06\/hbase-write-path\/\">beskrevet<\/a><\/noindex> Teoretisk set, n\u00e5r data skrives, kommer de ikke ind i cache, og faktisk er s\u00e5danne parametre CACHE_DATA_ON_WRITE for tabellen og 'Cache DATA on Write' for RS indstillet til false. Men i praksis, hvis man skriver data i MemStore, derefter t\u00f8mer den til disk (derved rydder op), og s\u00e5 sletter den resulterende fil, s\u00e5 vil en get-anmodning stadig give os dataene. Og selvom man helt deaktiverer BlockCache og fylder tabellen med nye data, og derefter opn\u00e5r en t\u00f8mming af MemStore til disk, sletter dem og anmoder fra en anden session, s\u00e5 vil dataene stadig blive hentet fra et eller andet sted. S\u00e5 HBase opbevarer ikke kun data, men ogs\u00e5 g\u00e5defulde mysterier.<\/p>\n<pre><code class=\"bash\">hbase(main):001:0&gt; create 'ns:magic', 'cf'\nOprettet tabel ns:magic\nTog 1.1533 sekunder\nhbase(main):002:0&gt; put 'ns:magic', 'key1', 'cf:c', 'try_to_delete_me'\nTog 0.2610 sekunder\nhbase(main):003:0&gt; flush 'ns:magic'\nTog 0.6161 sekunder\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>\nIndstillingen \"Cache DATA on Read\" er sat til false. Hvis du har ideer, er du velkommen til at diskutere dette i kommentarerne.<\/p>\n<h2>5. Batch behandling af data MultiGet\/MultiPut<\/h2>\n<p>\nBehandling af enkeltanmodninger (Get\/Put\/Delete) er en relativt dyr operation, s\u00e5 de b\u00f8r kombineres i en List, hvilket kan give en betydelig ydelsesfor\u00f8gelse. Dette g\u00e6lder is\u00e6r for skriveoperationer, men ved l\u00e6sning er der en faldgrube. P\u00e5 grafen nedenfor vises tid til at l\u00e6se 50.000 poster fra MemStore. L\u00e6sningen blev udf\u00f8rt i en enkelt tr\u00e5d, og p\u00e5 den vandrette akse vises antallet af n\u00f8gler i anmodningen. Her ses det, at ved at \u00f8ge til tusind n\u00f8gler i \u00e9n anmodning falder udf\u00f8relsestiden, dvs. hastigheden \u00f8ges. Men med den som standard aktiverede MSLAB-tilstand starter der en dramatisk nedgang i ydelsen efter denne t\u00e6rskel, des mere data der er i posterne, jo l\u00e6ngere tid tager det. <\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/42d3a77d66770a7fed03f83fecdca470.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTestene blev udf\u00f8rt p\u00e5 en virtuel maskine, 8 kerner, version HBase 2.0.0-cdh6.0.0-beta1.<\/p>\n<p>MSLAB-tilstand er designet til at mindske fragmenteringen af heapen, som opst\u00e5r p\u00e5 grund af blanding af data fra nye og gamle generationer. Som en l\u00f8sning p\u00e5 problemet placeres data i relativt sm\u00e5 celler (chunk) og behandles i portioner, n\u00e5r MSLAB er aktiveret. Resultatet er, at n\u00e5r m\u00e6ngden i den anmodede datapakke overskrider den tildelte st\u00f8rrelse, falder ydelsen drastisk. P\u00e5 den anden side er det heller ikke \u00f8nskeligt at deaktivere denne tilstand, da det f\u00f8rer til pauser p\u00e5 grund af GC i perioder med intensiv databehandling. En god l\u00f8sning er at \u00f8ge st\u00f8rrelsen af cellerne, n\u00e5r der skrives aktivt via put samtidig med l\u00e6sning. Det er v\u00e6rd at bem\u00e6rke, at problemet ikke opst\u00e5r, hvis man efter skrivning udf\u00f8rer flush-kommandoen, som skyder MemStore til disken, eller hvis der udf\u00f8res indl\u00e6sning via BulkLoad. I tabellen nedenfor vises, at anmodninger fra MemStore med st\u00f8rre data (og samme m\u00e6ngde) f\u00f8rer til nedsat hastighed. Men ved at \u00f8ge chunksize kan vi bringe behandlingstiden tilbage til det normale.<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/0076215bd171257548f8a4c4d4229ba0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUdover at \u00f8ge chunksize hj\u00e6lper det at opdele data efter regioner, dvs. splitting af tabeller. Dette medf\u00f8rer, at f\u00e6rre foresp\u00f8rgsler kommer til hver region, og hvis de placeres i en celle, forbliver responsen god.<\/p>\n<h2>6. Strategi for opdeling af tabeller efter regioner (splitting)<\/h2>\n<p>\nDa HBase er et key-value lager, og partitionering udf\u00f8res efter n\u00f8gle, er det ekstremt vigtigt at fordele data j\u00e6vnt over alle regioner. For eksempel vil partitionering af en s\u00e5dan tabel i tre dele f\u00f8re til, at datae bliver delt i tre regioner:<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a811ae81e77b48dbf28ed86dbdc35739.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDet kan f\u00f8re til en skarpe forsinkelse, hvis de data, der senere bliver indl\u00e6st, for eksempel har lange v\u00e6rdier, der for det meste begynder med det samme ciffer, for eksempel:<\/p>\n<p>1000001<br \/>\n1000002<br \/>\n\u2026<br \/>\n1100003<\/p>\n<p>Da n\u00f8glerne gemmes som en byte-array, vil alle starte ens og h\u00f8re til den region #1, der gemmer dette n\u00f8gleomr\u00e5de. Der er flere opdelingsstrategier:<\/p>\n<p>HexStringSplit \u2013 Konverterer n\u00f8glen til en streng med hexadecimale koder i omr\u00e5det \"00000000\" =&gt; \"FFFFFFFF\" og fylder til venstre med nuller.<\/p>\n<p>UniformSplit \u2013 Konverterer n\u00f8glen til en byte-array med hexadecimale koder i omr\u00e5det \"00\" =&gt; \"FF\" og fylder til h\u00f8jre med nuller.<\/p>\n<p>Derudover kan man angive ethvert omr\u00e5de eller s\u00e6t n\u00f8gler til opdeling og indstille automatisk splitning. Dog er en af de mest enkle og effektive metoder UniformSplit og brugen af hash-katstring, for eksempel det h\u00f8jeste byte-par fra k\u00f8rslen af n\u00f8glen gennem CRC32(rowkey) funktionen og selve rowkey:<\/p>\n<p>hash + rowkey<\/p>\n<p>S\u00e5 vil alle dataene v\u00e6re j\u00e6vnt fordelt over regioner. Ved l\u00e6sning bliver de f\u00f8rste to bytes blot bortkastet, og den oprindelige n\u00f8gle forbliver. Derudover overv\u00e5ger RS m\u00e6ngden af data og n\u00f8gler i regionen, og ved overskridelse af gr\u00e6nserne opdeles den automatisk i dele. <\/p>\n<h2>7. Fejltolerance og lokalitet af data<\/h2>\n<p>\nDa hver n\u00f8glepakke kun er ansvarlig for \u00e9n region, er l\u00f8sningen p\u00e5 problemer relateret til nedbrud af RS eller udfasning at opbevare alle n\u00f8dvendige data i HDFS. Ved nedbrud registrerer masteren dette gennem manglende heartbeat p\u00e5 ZooKeeper-noden. Den tildeler derefter den d\u00e6kkede region til en anden RS, og da HFiles gemmes i det distribuerede filsystem, vil den nye ejer l\u00e6se dem og forts\u00e6tte med at betjene dataene. Men da en del af dataene kan v\u00e6re i MemStore og ikke er n\u00e5et til HFiles, anvendes WAL til at gendanne operationernes historie, som ogs\u00e5 er gemt i HDFS. Efter at \u00e6ndringerne er anvendt, er RS i stand til at svare p\u00e5 foresp\u00f8rgsler, men flytningen medf\u00f8rer, at en del data og de processer, der betjener dem, havner p\u00e5 forskellige noder, hvilket resulterer i nedsat lokalitet. <\/p>\n<p>L\u00f8sningen p\u00e5 problemet er major compaction \u2013 denne procedure flytter filer til de noder, som er ansvarlige for dem (til dem, hvor deres regioner er placeret), hvilket medf\u00f8rer, at belastningen p\u00e5 netv\u00e6rk og diske pludselig stiger under denne procedure. Dog kan adgangen til dataene m\u00e6rkbart accelereres p\u00e5 l\u00e6ngere sigt. Desuden udf\u00f8rer major_compaction en sammenl\u00e6gning af alle HFiles til \u00e9n fil inden for regionen og rydder dataene baseret p\u00e5 tabelindstillingerne. For eksempel kan man angive antallet af versioner af et objekt, der skal bevares, eller dets levetid, efter hvilken objektet fysisk fjernes.<\/p>\n<p>Denne procedure kan have en meget positiv indvirkning p\u00e5 HBase's ydeevne. P\u00e5 billedet nedenfor kan man se, hvordan ydeevnen er blevet degraderet som f\u00f8lge af aktiv dataindsamling. Her kan man se, at der i \u00e9n tabel blev skrevet af 40 tr\u00e5de, mens 40 tr\u00e5de l\u00e6ste data samtidig. De skrivende tr\u00e5de genererer flere og flere HFiles, som bliver l\u00e6st af de andre tr\u00e5de. Som et resultat skal der slettes flere og flere data fra hukommelsen, og til sidst begynder GC at arbejde, hvilket i praksis lammer hele processen. Udf\u00f8relsen af major compaction f\u00f8rte til oprydning af de opst\u00e5ede affald og gendannelse af ydeevnen.<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/6c93b2c10c197663785d3de0bb185481.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTesten blev udf\u00f8rt p\u00e5 3 DataNode og 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 tr\u00e5de). Version HBase 1.2.0-cdh5.14.2<\/p>\n<p>Det skal bem\u00e6rkes, at major compaction blev udf\u00f8rt p\u00e5 en \"live\" tabel, hvor der aktivt blev skrevet og l\u00e6st data. Der har v\u00e6ret p\u00e5stande p\u00e5 nettet om, at dette kan f\u00f8re til forkerte svar ved l\u00e6sning af data. For at teste blev der startet en proces, der genererede nye data og skrev dem til tabellen. Efterf\u00f8lgende blev der straks l\u00e6st og tjekket, om den modtagne v\u00e6rdi stemte overens med det, der var skrevet. Under operationen blev major compaction udf\u00f8rt omkring 200 gange, og der blev ikke registreret nogen nedbrud. M\u00e5ske viser problemet sig sj\u00e6ldent og kun under h\u00f8j belastning, s\u00e5 det er derfor mere sikkert at planm\u00e6ssigt stoppe skrive- og l\u00e6seprocesserne og udf\u00f8re reng\u00f8ring undg\u00e5else af s\u00e5danne GC-dyk.<\/p>\n<p>Desuden p\u00e5virker major compaction ikke tilstanden af MemStore; for at nulstille det til disk og komprimere skal der bruges flush (connection.getAdmin().flush(TableName.valueOf(tblName))).<\/p>\n<h2>8. Indstillinger og ydeevne<\/h2>\n<p>\nSom allerede n\u00e6vnt viser HBase den st\u00f8rste succes, hvor den ikke har noget at g\u00f8re ved udf\u00f8relsen af BulkLoad. Dette g\u00e6lder dog for de fleste systemer og mennesker. Men dette v\u00e6rkt\u00f8j er mere egnet til masseoverf\u00f8rsel af data i store blokke, mens processer, der kr\u00e6ver mange konkurrerende l\u00e6se- og skriveanmodninger, bruger de f\u00f8rn\u00e6vnte Get- og Put-kommandoer. For at bestemme de optimale parametre blev der udf\u00f8rt tests med forskellige kombinationer af tabelparametre og indstillinger:<\/p>\n<ul>\n<li>Der blev k\u00f8rt 10 tr\u00e5de samtidigt 3 gange i tr\u00e6k (vi kalder dette en tr\u00e5dblok). <\/li>\n<li>Tiden for alle tr\u00e5de i blokken blev gennemsnitlig og var det samlede resultat af blokens arbejde.<\/li>\n<li>Alle tr\u00e5de arbejdede med den samme tabel. <\/li>\n<li>F\u00f8r hver k\u00f8rsel af tr\u00e5dblokken blev der udf\u00f8rt en major compaction.<\/li>\n<li>Hver blok udf\u00f8rte kun en af de f\u00f8lgende operationer: <\/li>\n<\/ul>\n<p>\n \u2014 Put<br \/>\n \u2014 Get<br \/>\n \u2014 Get+Put<\/p>\n<ul>\n<li>Hver blok udf\u00f8rte 50.000 gentagelser af sin operation.<\/li>\n<li>St\u00f8rrelsen p\u00e5 optegnelsen i blokken var 100 byte, 1000 byte eller 10.000 byte (random).<\/li>\n<li>Blokke blev k\u00f8rt med varierende antal forespurgte n\u00f8gler (enten en n\u00f8gle eller 10).<\/li>\n<li>Blokke blev k\u00f8rt med forskellige tabelindstillinger. Parametre blev \u00e6ndret:<\/li>\n<\/ul>\n<p>\n \u2014 BlockCache = t\u00e6ndt eller slukket<br \/>\n \u2014 BlockSize = 65 KB eller 16 KB<br \/>\n \u2014 Partitioner = 1, 5 eller 30<br \/>\n \u2014 MSLAB = t\u00e6ndt eller slukket<\/p>\n<p>S\u00e5ledes ser blokken s\u00e5dan ud:<\/p>\n<p>a. MSLAB-tilstand blev t\u00e6ndt\/slukket.<br \/>\nb. Der blev oprettet en tabel med f\u00f8lgende indstillinger: BlockCache = true\/none, BlockSize = 65\/16 Kb, partitioner = 1\/5\/30. <br \/>\nc. GZ-komprimering blev aktiveret.<br \/>\nd. 10 tr\u00e5de blev k\u00f8rt samtidig, der udf\u00f8rte 1\/10 operationer put\/get\/get+put i denne tabel med poster p\u00e5 100\/1000\/10000 byte, hvilket resulterede i 50.000 kontinuerlige foresp\u00f8rgsler (n\u00f8glerne var tilf\u00e6ldige).<br \/>\ne. Punkt d blev gentaget tre gange.<br \/>\nf. Tiden for alle tr\u00e5de blev gennemsnitligt beregnet. <\/p>\n<p>Alle mulige kombinationer blev testet. Det er forudsigeligt, at hastigheden vil falde med st\u00f8rre postst\u00f8rrelse, eller at deaktivering af caching vil f\u00f8re til langsommere hastigheder. Form\u00e5let var imidlertid at forst\u00e5 graden og betydningen af indflydelsen fra hver parameter, s\u00e5 de indsamlede data blev givet til en line\u00e6r regressionsfunktion, der muligg\u00f8r vurdering af p\u00e5lideligheden ved hj\u00e6lp af t-statistik. Nedenfor er resultaterne fra de blokke, der udf\u00f8rte operationer Put. Det samlede antal kombinationer er 2*2*3*2*3 = 144 muligheder + 72, da nogle blev udf\u00f8rt to gange. Derfor i alt 216 k\u00f8rsel:<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/7a13c7a9b3ff1859976800f5d45cd51b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTesten blev udf\u00f8rt p\u00e5 et mini-kluster best\u00e5ende af 3 DataNodes og 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 tr\u00e5de). Version HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Den h\u00f8jeste inds\u00e6ttelseshastighed p\u00e5 3,7 sekunder blev opn\u00e5et med MSLAB tilstand deaktiveret, p\u00e5 en tabel med en partition, med BlockCache aktiveret, BlockSize = 16, optegnelser p\u00e5 100 byte med 10 pr. pakke.<br \/>\nDen laveste inds\u00e6ttelseshastighed p\u00e5 82,8 sekunder blev opn\u00e5et med MSLAB tilstand aktiveret, p\u00e5 en tabel med en partition, med BlockCache aktiveret, BlockSize = 16, optegnelser p\u00e5 10000 byte med 1 pr. stk.<\/p>\n<p>Lad os nu se p\u00e5 modellen. Vi ser en god modelkvalitet if\u00f8lge R2, men det er helt klart, at ekstrapolering her er kontraindiceret. Det reelle systemadf\u00e6rd ved \u00e6ndringer i parametre vil ikke v\u00e6re line\u00e6rt; denne model er ikke til forudsigelser, men til forst\u00e5else af, hvad der skete inden for de angivne parametre. For eksempel ser vi her if\u00f8lge Student-kriteriet, at parametrene BlockSize og BlockCache ikke har betydning for operationen Put (hvilket generelt er ret forudsigeligt):<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/2fb65d1809d53f2b47f4f8829a9efc65.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAt dette at \u00f8ge antallet af partitioner f\u00f8rer til en neds\u00e6ttelse af ydeevnen er noget overraskende (vi har allerede set den positive indflydelse af at \u00f8ge antallet af partitioner ved BulkLoad), selvom det er forst\u00e5eligt. For det f\u00f8rste skal man i behandlingen danne foresp\u00f8rgsler til 30 regioner i stedet for \u00e9n, og datam\u00e6ngden er ikke s\u00e5 stor, at det giver en fordel. For det andet bestemmes den samlede arbejdstid af den langsomste RS, og da antallet af DataNode er mindre end antallet af RS, har nogle regioner nul lokalitet. Lad os s\u00e5 se p\u00e5 top fem:<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8ad7e832879156eaa96e630458405cdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLad os nu vurdere resultaterne af udf\u00f8relsen af Get-blokke:<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8a5dd45422c74e8815011d7e9b805ccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAntallet af partitioner har mistet betydning, hvilket sandsynligvis forklares med, at dataene cachelagres godt, og at cachen til l\u00e6sning er den mest betydningsfulde (statistisk set) parameter. Det er naturligt, at en stigning i antallet af meddelelser i foresp\u00f8rgslen ogs\u00e5 er meget nyttig for ydeevnen. De bedste resultater:<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9d237f9fdbeaf5412daec2fc2fa24b01.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOg lad os endelig se p\u00e5 modellen for blokken, der f\u00f8rst udf\u00f8rte get, og derefter put:<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/75137207a4a69acccad036882794094b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHer er alle parametre betydningsfulde. Og resultaterne af lederne:<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/c166933d81e86f36958e3af58297f876.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>9. Belastningstestning<\/h2>\n<p>\nOg lad os endelig k\u00f8re en nogenlunde anst\u00e6ndig belastning, men det er altid mere interessant, n\u00e5r der er noget at sammenligne med. P\u00e5 DataStax' hjemmeside - den n\u00f8gleudvikler af Cassandra, findes der <noindex><a rel=\"nofollow\" href=\"https:\/\/www.datastax.com\/wp-content\/themes\/datastax-2014-08\/files\/NoSQL_Benchmarks_EndPoint.pdf\">resultater<\/a><\/noindex> MT for en r\u00e6kke NoSQL-lagringssystemer, herunder HBase version 0.98.6-1. Indl\u00e6sningen blev udf\u00f8rt med 40 tr\u00e5de, datast\u00f8rrelsen var 100 bytes, og diskene var SSD. Testresultatet for Read-Modify-Write-operationer viste disse resultater.<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/521e9dff60f462e6dabebc1234e028be.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n S\u00e5 vidt jeg forst\u00e5r, blev l\u00e6sningen udf\u00f8rt i blokke af 100 optegnelser, og for 16 noder viste DataStax-testen for HBase en ydeevne p\u00e5 10.000 operationer per sekund. <\/p>\n<p>Det er heldigt, at vores klynge ogs\u00e5 har 16 noder, men det er ikke s\u00e5 \"heldigt\", at hver har 64 kerner (tr\u00e5de), mens DataStax-testen kun har 4. P\u00e5 den anden side har de SSD-diske, mens vi har HDD'er og en nyere version af HBase, og CPU-udnyttelsen under belastning steg n\u00e6sten ikke m\u00e6rkbart (visuelt med 5-10 procent). Ikke desto mindre vil vi fors\u00f8ge at starte op med denne konfiguration. Tabelindstillingerne er som standard, og l\u00e6sninger udf\u00f8res i intervallet af n\u00f8gler fra 0 til 50 millioner tilf\u00e6ldigt (dvs. i princippet nyt hver gang). Tabelen har 50 millioner poster, opdelt i 64 partitioner. N\u00f8glerne er hashet med crc32. Tabelindstillingerne er standard, MSLAB er aktiveret. 40 tr\u00e5de k\u00f8res, hver tr\u00e5d l\u00e6ser et s\u00e6t p\u00e5 100 tilf\u00e6ldige n\u00f8gler og skriver straks genererede 100 bytes tilbage til disse n\u00f8gler. <\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/776490f01121cc434135f733311b7722.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Stand: 16 DataNode og 16 RS (CPU Xeon E5-2680 v4 @ 2,40 GHz * 64 tr\u00e5de). Version HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Det gennemsnitlige resultat ligger t\u00e6ttere p\u00e5 40.000 operationer pr. sekund, hvilket er v\u00e6sentligt bedre end i DataStax-testen. Men af fors\u00f8gsgrunde kan betingelserne \u00e6ndres lidt. Det er ret usandsynligt, at al arbejdet kun vil blive udf\u00f8rt med \u00e9n tabel, samt kun med unikke n\u00f8gler. Lad os antage, at der er et 'hot' s\u00e6tt af n\u00f8gler, som genererer hovedbelastningen. Derfor vil vi pr\u00f8ve at skabe belastning med st\u00f8rre poster (10 KB), ogs\u00e5 i portioner p\u00e5 100, over 4 forskellige tabeller, og begr\u00e6nse r\u00e6kken af forespurgte n\u00f8gler til 50.000. P\u00e5 grafen nedenfor vises k\u00f8rsel af 40 tr\u00e5de, hver tr\u00e5d l\u00e6ser et s\u00e6t p\u00e5 100 n\u00f8gler og skriver straks tilf\u00e6ldige 10 KB tilbage til disse n\u00f8gler. <\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30d29f1b98663e3c07cb2be20e93876a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNode og 16 RS (CPU Xeon E5-2680 v4 @ 2,40 GHz * 64 tr\u00e5de). Version HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Under belastningen blev major compaction k\u00f8rt flere gange, som vist ovenfor. Uden denne procedure vil ydeevnen gradvist forv\u00e6rres, men der opst\u00e5r ogs\u00e5 ekstra belastning under k\u00f8rslen. Fald i ydeevne skyldes forskellige \u00e5rsager. Nogle gange afsluttede tr\u00e5de deres arbejde, og mens de blev genstartet, opstod der en pause; nogle gange skabte eksterne applikationer belastning p\u00e5 klyngen.<\/p>\n<p>At l\u00e6se og samtidig skrive er et af de mest udfordrende arbejdsscenarier for HBase. Hvis man kun udf\u00f8rer put-anmodninger af lille st\u00f8rrelse, for eksempel p\u00e5 100 byte, ved at samle dem i batches p\u00e5 10-50 tusinde, kan man opn\u00e5 hundredtusind operationer i sekundet, og det samme g\u00e6lder for l\u00e6seanmodninger. Det er v\u00e6rd at bem\u00e6rke, at resultaterne er radikalt bedre end dem, der blev opn\u00e5et af DataStax, is\u00e6r takket v\u00e6re batchanmodningerne p\u00e5 50 tusinde.<\/p>\n<p><img decoding=\"async\" alt=\"Teori og praksis i brugen af HBase\" src=\"\/wp-content\/uploads\/2020\/01\/412bda50a55093224169f048ea2f863a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNode og 16 RS (CPU Xeon E5-2680 v4 @ 2,40 GHz * 64 tr\u00e5de). Version HBase 1.2.0-cdh5.14.2.<\/p>\n<h2>10. Konklusioner<\/h2>\n<p>\nDette system kan konfigureres relativt fleksibelt, men p\u00e5virkningen af et stort antal parametre forbliver stadig ukendt. Nogle af dem er blevet testet, men kom ikke med i det endelige s\u00e6t af tests. For eksempel viste indledende eksperimenter en uv\u00e6sentlig betydning af parameteren DATA_BLOCK_ENCODING, som koder information ved hj\u00e6lp af v\u00e6rdier fra naboceller, hvad der er helt rimeligt for data genereret tilf\u00e6ldigt. I tilf\u00e6lde af en stor m\u00e6ngde tilbagevendende objekter kan gevinsten v\u00e6re betydelig. Generelt kan det siges, at HBase fremst\u00e5r som en ret seri\u00f8s og velovervejet database, som kan v\u00e6re ret effektiv ved operationer med store datablokke. Is\u00e6r hvis der er mulighed for at sprede l\u00e6se- og skriveprocesserne over tid.<\/p>\n<p>Hvis der er noget, du mener ikke er tilstr\u00e6kkeligt udforsket, er jeg klar til at fort\u00e6lle mere. Vi opfordrer til at dele din erfaring eller diskutere, hvis du er uenig i noget.<br \/>\n<br \/>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Teori og praksis i brugen af HBase | ProHoster","description":"Goddag! Mit navn er Danil Lipovoy, vores team i Sbertech er begyndt at bruge HBase som lager til operationelle data.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/55302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=55302"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/55302\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=55302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=55302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=55302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}