{"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\/de\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","title":{"rendered":"Theorie und Praxis der Nutzung von HBase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Guten Tag! Mein Name ist Danil Lipovoy, unser Team bei Sbertech hat begonnen, HBase als Speicher f\u00fcr operationale Daten zu verwenden. Im Laufe der Untersuchung haben wir Erfahrungen gesammelt, die wir systematisieren und beschreiben wollten (wir hoffen, dass viele davon profitieren werden). Alle nachfolgend aufgef\u00fchrten Experimente wurden mit den Versionen HBase 1.2.0-cdh5.14.2 und 2.0.0-cdh6.0.0-beta1 durchgef\u00fchrt. <\/p>\n<ol>\n<li>Allgemeine Architektur <\/li>\n<li>Datenaufnahme in HBASE<\/li>\n<li>Datenlesung aus HBASE<\/li>\n<li>Daten-Caching<\/li>\n<li>Batch-Verarbeitung von Daten MultiGet\/MultiPut<\/li>\n<li>Strategie zur Aufteilung von Tabellen in Regionen (Sharding)<\/li>\n<li>Fehlertoleranz, Kompaktion und Datenlokalit\u00e4t<\/li>\n<li>Einstellungen und Leistung<\/li>\n<li>Lasttest<\/li>\n<li>Das DBMS Tarantool ist ein attraktives, zukunftstr\u00e4chtiges Produkt zur Erstellung von hochbelasteten Anwendungen.<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Allgemeine Architektur<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30800d8a48de4c52ff1650a4f1dec4c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDer Backup-Master h\u00f6rt das Heartbeat des aktiven Masters auf dem ZooKeeper-Knoten und \u00fcbernimmt im Falle eines Ausfalls die Funktionen des Masters. <\/p>\n<h2>2. Datenaufnahme in HBASE<\/h2>\n<p>\nZun\u00e4chst betrachten wir den einfachsten Fall \u2013 das Hinzuf\u00fcgen eines Schl\u00fcssel-Wert-Paares in eine Tabelle mit put(rowkey). Der Client muss zuerst herausfinden, wo sich der Root Region Server (Root Region Server \u2014 RRS) befindet, der die Tabelle hbase:meta speichert. Diese Information erh\u00e4lt er von ZooKeeper. Danach wendet er sich an den RRS und liest die Tabelle hbase:meta, aus der er die Information entnimmt, welcher RegionServer (RS) f\u00fcr die Speicherung der Daten f\u00fcr den angegebenen Schl\u00fcssel rowkey in der gew\u00fcnschten Tabelle verantwortlich ist. F\u00fcr die weitere Verwendung wird die Metadaten-Tabelle im Client zwischengespeichert, sodass nachfolgende Anfragen schneller direkt zum RS gehen.<\/p>\n<p>Nachdem der RS die Anfrage erhalten hat, wird sie zuerst im WriteAheadLog (WAL) aufgezeichnet, was f\u00fcr die Wiederherstellung im Falle eines Fehlers notwendig ist. Dann speichert er die Daten im MemStore. Dies ist ein Puffer im Speicher, der eine sortierte Menge von Schl\u00fcsseln dieser Region enth\u00e4lt. Die Tabelle kann in Regionen (Partitionen) unterteilt werden, von denen jede eine nicht \u00fcberlappende Menge von Schl\u00fcsseln enth\u00e4lt. Das erm\u00f6glicht, die Regionen auf verschiedenen Servern zu platzieren, um eine h\u00f6here Leistung zu erzielen. Dennoch, trotz der Offensichtlichkeit dieser Aussage, werden wir sehen, dass dies nicht in allen F\u00e4llen funktioniert.<\/p>\n<p>Nach der Ablage des Eintrags im MemStore erh\u00e4lt der Client eine R\u00fcckmeldung, dass der Eintrag erfolgreich gespeichert wurde. Tats\u00e4chlich wird er jedoch nur im Puffer gehalten und gelangt erst nach einem bestimmten Zeitintervall oder bei Auff\u00fcllung mit neuen Daten auf die Festplatte. <\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/10f4d5d600a20882690f5cc81322bc41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBei der Durchf\u00fchrung der Operation \u00abDelete\u00bb erfolgt keine physische L\u00f6schung der Daten. Sie werden lediglich als gel\u00f6scht markiert, und die tats\u00e4chliche Zerst\u00f6rung erfolgt zum Zeitpunkt des Aufrufs der Funktion major compact, die im Detail in Punkt 7 beschrieben wird.<\/p>\n<p>Dateien im HFile-Format sammeln sich im HDFS an, und von Zeit zu Zeit wird der Prozess minor compact gestartet, der einfach kleine Dateien zu gr\u00f6\u00dferen zusammenf\u00fcgt, ohne etwas zu l\u00f6schen. Dies wird im Laufe der Zeit zu einem Problem, das sich nur beim Lesen von Daten zeigt (darauf kommen wir sp\u00e4ter zur\u00fcck). <\/p>\n<p>Neben dem oben beschriebenen Ladeprozess gibt es ein viel effizienteres Verfahren, das gewisserma\u00dfen die gr\u00f6\u00dfte St\u00e4rke dieser Datenbank darstellt \u2013 BulkLoad. Dabei erstellen wir selbst HFiles und legen sie auf die Festplatte, was eine hervorragende Skalierbarkeit erm\u00f6glicht und ziemlich anst\u00e4ndige Geschwindigkeiten erreicht. Im Grunde genommen ist die Grenze hier nicht HBase, sondern die M\u00f6glichkeiten der Hardware. Im Folgenden sind die Ladeergebnisse in einem Cluster aufgef\u00fchrt, das aus 16 RegionServers und 16 NodeManagers YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 Threads) besteht, Version HBase 1.2.0-cdh5.14.2. <\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/4e4452b216eda3269a364ea97c49120f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHier ist zu sehen, dass mit zunehmender Anzahl der Partitionen (Regionen) in der Tabelle sowie der Spark-Executor die Ladegeschwindigkeit zunimmt. Die Geschwindigkeit h\u00e4ngt auch vom Umfang der Schreibvorg\u00e4nge ab. Gro\u00dfe Bl\u00f6cke f\u00fchren zu einer Zunahme in MB\/Sekunde, kleine in der Anzahl der pro Zeiteinheit eingef\u00fcgten Datens\u00e4tze, bei gleichen Bedingungen. <\/p>\n<p>Es ist auch m\u00f6glich, die Ladeprozesse in zwei Tabellen gleichzeitig zu starten und somit die Geschwindigkeit zu verdoppeln. Unten ist zu sehen, dass das gleichzeitige Schreiben von 10 KB-Bl\u00f6cken in zwei Tabellen mit etwa 600 MB\/Sekunde in jede Tabelle erfolgt (insgesamt 1275 MB\/Sekunde), was mit der Schreibgeschwindigkeit in eine Tabelle von 623 MB\/Sekunde \u00fcbereinstimmt (siehe Nr. 11 oben).<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9f1b4fc0c80b797111494d400e9ce332.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDer zweite Versuch mit Aufzeichnungen von 50 KB zeigt jedoch, dass die Ladegeschwindigkeit nur noch geringf\u00fcgig steigt, was auf eine Ann\u00e4herung an die Grenzwerte hinweist. Dabei ist zu beachten, dass die Belastung f\u00fcr HBASE hier praktisch nicht entsteht; alles, was von ihm ben\u00f6tigt wird, ist zun\u00e4chst die \u00dcbermittlung der Daten aus hbase:meta, und nach der Ablage der HFiles die Daten im BlockCache zu leeren und den MemStore-Puffer auf die Festplatte zu speichern, falls er nicht leer ist.<\/p>\n<h2>3. Lesen von Daten aus HBASE<\/h2>\n<p>\nWenn man davon ausgeht, dass der gesamte Inhalt aus hbase:meta bereits beim Kunden vorliegt (siehe Punkt 2), dann geht die Anfrage sofort an denjenigen RS, der den ben\u00f6tigten Schl\u00fcssel speichert. Zuerst erfolgt die Suche in MemCache. Unabh\u00e4ngig davon, ob dort Daten vorhanden sind oder nicht, wird die Suche auch im BlockCache durchgef\u00fchrt und, falls n\u00f6tig, in HFiles. Wenn die Daten in der Datei gefunden werden, werden sie im BlockCache abgelegt und bei der n\u00e4chsten Anfrage schneller zur\u00fcckgegeben. Die Suche in HFile erfolgt relativ schnell dank der Verwendung des Bloom-Filters, d.h. durch das Einlesen eines kleinen Datenvolumens kann sofort festgestellt werden, ob diese Datei den ben\u00f6tigten Schl\u00fcssel enth\u00e4lt, und wenn nicht, wird zur n\u00e4chsten \u00fcbergegangen.<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a21b1b825a84cfd02507ec334e9452fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNachdem die Daten aus diesen drei Quellen abgerufen wurden, erstellt der RS eine Antwort. Insbesondere kann er mehrere gefundene Versionen des Objekts \u00fcbermitteln, wenn der Kunde Versionshistorie angefordert hat.<\/p>\n<h2>4. Daten-Caching<\/h2>\n<p>\nDie Puffer MemStore und BlockCache nehmen bis zu 80 % des zugewiesenen On-Heap-Speichers des RS ein (der Rest ist f\u00fcr die Dienstleistungsaufgaben des RS reserviert). Wenn der typische Nutzungsmodus so ist, dass Prozesse diese Daten schreiben und sofort wieder lesen, macht es Sinn, BlockCache zu reduzieren und MemStore zu erh\u00f6hen, da bei der Speicherung die Daten nicht in den Lesecache gelangen. Die Nutzung des BlockCaches w\u00fcrde seltener erfolgen. Der BlockCache-Puffer besteht aus zwei Teilen: LruBlockCache (immer On-Heap) und BucketCache (in der Regel Off-Heap oder auf SSD). BucketCache sollte verwendet werden, wenn es viele Leseanfragen gibt, die nicht in den LruBlockCache passen, was zu einer aktiven Arbeit des Garbage Collectors f\u00fchrt. Dabei ist mit einer radikalen Leistungssteigerung durch die Nutzung des Lesecaches nicht zu rechnen, jedoch werden wir in Punkt 8 noch darauf zur\u00fcckkommen.<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/17d7791a998dd7da747cb7089dce1f10.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDer BlockCache ist f\u00fcr den gesamten RS einheitlich, w\u00e4hrend MemStore f\u00fcr jede Tabelle spezifisch ist (jeweils eines f\u00fcr jede Column Family).<\/p>\n<p>Wie <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.cloudera.com\/blog\/2012\/06\/hbase-write-path\/\">beschrieben<\/a><\/noindex> in der Theorie gelangen Daten beim Schreiben nicht in den Cache, und tats\u00e4chlich sind solche Parameter wie CACHE_DATA_ON_WRITE f\u00fcr die Tabelle und \"Cache DATA on Write\" f\u00fcr den RS auf false gesetzt. In der Praxis jedoch, wenn Daten in MemStore geschrieben, dann auf die Festplatte abgelegt werden (was ihn somit leert), und wenn dann die resultierende Datei gel\u00f6scht wird, erhalten wir beim Ausf\u00fchren einer get-Anfrage erfolgreich die Daten. Selbst wenn wir den BlockCache vollst\u00e4ndig deaktivieren und die Tabelle mit neuen Daten f\u00fcllen, dann MemStore auf die Festplatte zur\u00fccksetzen, diese l\u00f6schen und aus einer anderen Sitzung anfragen, werden die Daten dennoch irgendwoher abgerufen. Somit speichert HBase nicht nur Daten, sondern auch mysteri\u00f6se R\u00e4tsel.<\/p>\n<pre><code class=\"bash\">hbase(main):001:0&gt; create 'ns:magic', 'cf'\nTabelle ns:magic erstellt\nDauer: 1.1533 Sekunden\nhbase(main):002:0&gt; put 'ns:magic', 'key1', 'cf:c', 'versuche_mich_zu_l\u00f6schen'\nDauer: 0.2610 Sekunden\nhbase(main):003:0&gt; flush 'ns:magic'\nDauer: 0.6161 Sekunden\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=versuche_mich_zu_l\u00f6schen\n<\/code><\/pre>\n<p>\nDer Parameter \u201eCache DATA on Read\u201c ist auf false gesetzt. Wenn Sie Ideen haben, sind Sie herzlich eingeladen, dies in den Kommentaren zu diskutieren.<\/p>\n<h2>5. Batch-Datenverarbeitung MultiGet\/MultiPut<\/h2>\n<p>\nDie Verarbeitung einzelner Anfragen (Get\/Put\/Delete) ist eine recht kostenintensive Operation, daher sollten diese nach M\u00f6glichkeit in eine Liste zusammengefasst werden, was eine signifikante Leistungssteigerung erm\u00f6glicht. Dies gilt insbesondere f\u00fcr Schreiboperationen, w\u00e4hrend beim Lesen ein gewisses Problem auftritt. Im Diagramm unten ist die Lesezeit von 50.000 Datens\u00e4tzen aus MemStore dargestellt. Das Lesen erfolgte in einem einzigen Thread, und auf der horizontalen Achse ist die Anzahl der Schl\u00fcssel in der Anfrage angegeben. Hier ist zu sehen, dass die Ausf\u00fchrungszeit bei einer Erh\u00f6hung auf bis zu tausend Schl\u00fcssel in einer Anfrage sinkt, d.h. die Geschwindigkeit steigt. Bei aktivem MSLAB-Modus beginnt jedoch nach diesem Schwellenwert ein drastischer Leistungsabfall, wobei die Arbeitszeit mit dem Datenvolumen im Datensatz steigt. <\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/42d3a77d66770a7fed03f83fecdca470.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Tests wurden auf einer virtuellen Maschine mit 8 Kernen, Version HBase 2.0.0-cdh6.0.0-beta1, durchgef\u00fchrt.<\/p>\n<p>Der MSLAB-Modus soll die Fragmentierung des Heaps reduzieren, die durch die Vermischung neuer und alter Datengenerationen entsteht. Um das Problem zu l\u00f6sen, werden die Daten beim Aktivieren von MSLAB in relativ kleine Zellen (Chunks) platziert und in Portionen verarbeitet. Das Ergebnis ist, dass die Leistung drastisch abnimmt, wenn das Volumen im angeforderten Datenpaket die zugewiesene Gr\u00f6\u00dfe \u00fcberschreitet. Andererseits ist das Deaktivieren dieses Modus ebenfalls unerw\u00fcnscht, da dies zu Pausen aufgrund von GC w\u00e4hrend intensiver Datenverarbeitung f\u00fchrt. Eine gute L\u00f6sung besteht darin, die Chunk-Gr\u00f6\u00dfe zu erh\u00f6hen, wenn gleichzeitig durch put geschrieben wird und gelesen wird. Es ist zu beachten, dass das Problem nicht auftritt, wenn nach dem Schreiben der Befehl flush ausgef\u00fchrt wird, der MemStore auf die Festplatte schreibt, oder wenn der Ladevorgang mit BulkLoad erfolgt. In der folgenden Tabelle ist zu sehen, dass Abfragen aus MemStore mit gr\u00f6\u00dferem Datenvolumen (und gleicher Anzahl) zu einer Verlangsamung f\u00fchren. Durch Erh\u00f6hung der Chunk-Gr\u00f6\u00dfe kann die Verarbeitungszeit jedoch wieder auf den Normalwert zur\u00fcckgef\u00fchrt werden.<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/0076215bd171257548f8a4c4d4229ba0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNeben der Erh\u00f6hung der chunksize hilft die Datenaufteilung nach Regionen, d.h. das Splitten von Tabellen. Dies f\u00fchrt dazu, dass weniger Anfragen pro Region eingehen und wenn diese in einer Zelle untergebracht sind, bleibt die Antwort gut.<\/p>\n<h2>6. Strategie zur Aufteilung von Tabellen in Regionen (Splitting)<\/h2>\n<p>\nDa HBase ein Key-Value-Speicher ist und die Partitionierung nach Schl\u00fcssel erfolgt, ist es \u00e4u\u00dferst wichtig, die Daten gleichm\u00e4\u00dfig auf alle Regionen zu verteilen. Beispielsweise f\u00fchrt die Partitionierung einer solchen Tabelle in drei Teile dazu, dass die Daten auf drei Regionen aufgeteilt werden:<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a811ae81e77b48dbf28ed86dbdc35739.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEs kann vorkommen, dass dies zu einer erheblichen Verlangsamung f\u00fchrt, wenn die sp\u00e4ter hochgeladenen Daten \u00fcberwiegend lange Werte enthalten, die alle mit derselben Ziffer beginnen, z.B.:<\/p>\n<p>1000001<br \/>\n1000002<br \/>\n\u2026<br \/>\n1100003<\/p>\n<p>Da die Schl\u00fcssel als Byte-Array gespeichert werden, beginnen alle gleich und geh\u00f6ren zu einer Region #1, die diesen Schl\u00fcsselbereich speichert. Es gibt mehrere Aufteilungsstrategien:<\/p>\n<p>HexStringSplit \u2013 Wandelt den Schl\u00fcssel in einen String mit hexadezimaler Kodierung im Bereich \u201e00000000\u201c =&gt; \u201eFFFFFFFF\u201c um, und f\u00fcllt ihn links mit Nullen auf.<\/p>\n<p>UniformSplit \u2013 Wandelt den Schl\u00fcssel in ein Byte-Array mit hexadezimaler Kodierung im Bereich \u201e00\u201c =&gt; \u201eFF\u201c um und f\u00fcllt es rechts mit Nullen auf.<\/p>\n<p>Au\u00dferdem kann ein beliebiger Bereich oder Satz von Schl\u00fcsseln f\u00fcr die Aufteilung angegeben und das Autospilitting konfiguriert werden. Eine der einfachsten und effektivsten Methoden ist jedoch UniformSplit und die Verwendung der Verkettung des Hashes, z.B. des vorderen Bytes des Schl\u00fcssels, der durch die Funktion CRC32(rowkey) gejagt wird, und des eigentlichen rowkey:<\/p>\n<p>hash + rowkey<\/p>\n<p>Dann werden alle Daten gleichm\u00e4\u00dfig auf die Regionen verteilt. Beim Lesen werden die ersten beiden Bytes einfach verworfen und der urspr\u00fcngliche Schl\u00fcssel bleibt erhalten. Au\u00dferdem \u00fcberwacht der RS die Menge der Daten und Schl\u00fcssel in der Region und teilt sie automatisch in Teile auf, wenn die Grenzen \u00fcberschritten werden. <\/p>\n<h2>7. Fehlertoleranz und Datenspeicherlokalit\u00e4t<\/h2>\n<p>\nDa jeder Satz von Schl\u00fcsseln nur f\u00fcr eine Region verantwortlich ist, besteht die L\u00f6sung f\u00fcr Probleme, die mit RS-Abst\u00fcrzen oder der Stilllegung verbunden sind, darin, alle erforderlichen Daten in HDFS zu speichern. Bei einem Absturz entdeckt der Master dies durch den fehlenden Heartbeat auf dem ZooKeeper-Knoten. Er weist den verwalteten Region einem anderen RS zu, und da die HFiles in einem verteilten Dateisystem gespeichert sind, liest der neue Besitzer sie ein und setzt die Datenbereitstellung fort. Da jedoch ein Teil der Daten m\u00f6glicherweise im MemStore vorhanden ist und es nicht rechtzeitig zu den HFiles geschafft hat, wird zum Wiederherstellen der Betriebsabl\u00e4ufe WAL verwendet, die ebenfalls in HDFS gespeichert werden. Nach der \u00dcbertragung der \u00c4nderungen kann der RS auf Anfragen reagieren, jedoch f\u00fchrt der Umzug dazu, dass ein Teil der Daten und die zur Bereitstellung dieser Daten dienenden Prozesse auf verschiedenen Knoten liegen, was die Lokalisierung verringert. <\/p>\n<p>Die L\u00f6sung des Problems besteht in der Major Compaction \u2013 dieses Verfahren verschiebt Dateien auf die Knoten, die daf\u00fcr verantwortlich sind (dort, wo sich ihre Regionen befinden), wodurch w\u00e4hrend dieses Verfahrens die Belastung des Netzwerks und der Festplatten erheblich steigt. In der Folge wird jedoch der Zugriff auf die Daten deutlich beschleunigt. Dar\u00fcber hinaus f\u00fchrt die Major Compaction die Zusammenf\u00fchrung aller HFiles in eine Datei innerhalb der Region durch und bereinigt die Daten gem\u00e4\u00df den Tabelleneinstellungen. Beispielsweise kann die Anzahl der Versionen eines Objekts festgelegt werden, die beibehalten werden sollen, oder die Lebensdauer des Objekts, nach deren Ablauf es physisch gel\u00f6scht wird.<\/p>\n<p>Dieses Verfahren kann sich \u00e4u\u00dferst positiv auf die Leistung von HBase auswirken. Im Bild unten ist zu sehen, wie die Leistung aufgrund aktiver Datenschreibvorg\u00e4nge abgenommen hat. Hier ist ersichtlich, wie in eine Tabelle 40 Threads schrieben und 40 Threads gleichzeitig Daten lasen. Die schreibenden Threads erzeugen immer mehr HFiles, die von anderen Threads eingelesen werden. In der Folge m\u00fcssen immer mehr Daten aus dem Speicher gel\u00f6scht werden, und schlie\u00dflich beginnt der GC zu arbeiten, der die gesamte Arbeit praktisch l\u00e4hmt. Der Start der Major Compaction f\u00fchrte zur Bereinigung der entstandenen Stauungen und zur Wiederherstellung der Leistung.<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/6c93b2c10c197663785d3de0bb185481.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDer Test wurde auf 3 DataNodes und 4 RS (CPU Xeon E5-2680 v4 @ 2,40 GHz * 64 Threads) durchgef\u00fchrt. HBase-Version 1.2.0-cdh5.14.2<\/p>\n<p>Es ist zu beachten, dass der Start der Major Compaction auf einer \u201elebenden\u201c Tabelle durchgef\u00fchrt wurde, in die aktiv Daten geschrieben und gelesen wurden. Es wurde in der Community behauptet, dass dies zu inkorrekten Antworten beim Lesen von Daten f\u00fchren kann. Zur \u00dcberpr\u00fcfung wurde ein Prozess gestartet, der neue Daten generierte und sie in die Tabelle schrieb. Anschlie\u00dfend wurde sofort gelesen und \u00fcberpr\u00fcft, ob der erhaltene Wert mit dem \u00fcbereinstimmt, was geschrieben wurde. W\u00e4hrend dieses Prozesses wurde etwa 200 Mal eine Major Compaction durchgef\u00fchrt und es wurden keine Fehler festgestellt. M\u00f6glicherweise tritt das Problem selten auf und nur bei hoher Auslastung, weshalb es sicherer ist, die Schreib- und Lesevorg\u00e4nge planm\u00e4\u00dfig zu stoppen und die Bereinigung ohne solche GC-Drops durchzuf\u00fchren.<\/p>\n<p>Die Major Compaction hat au\u00dferdem keinen Einfluss auf den Zustand des MemStore. Um ihn auf die Festplatte zu schreiben und zu kompakti\ufb01zieren, muss flush verwendet werden (connection.getAdmin().flush(TableName.valueOf(tblName))).<\/p>\n<h2>8. Einstellungen und Leistung<\/h2>\n<p>\nWie bereits erw\u00e4hnt, zeigt HBase den gr\u00f6\u00dften Erfolg dort, wo es nichts tun muss, bei der Durchf\u00fchrung von BulkLoad. Dies gilt jedoch f\u00fcr die meisten Systeme und Menschen. Dieses Tool ist eher f\u00fcr das massenhafte Einf\u00fcllen von Daten in gro\u00dfen Bl\u00f6cken geeignet, w\u00e4hrend, wenn der Prozess viele konkurrierende Lese- und Schreibanfragen erfordert, die oben beschriebenen Get- und Put-Befehle verwendet werden. Zur Bestimmung der optimalen Parameter wurden Testl\u00e4ufe mit verschiedenen Kombinationen von Tabelleneinstellungen und Parametern durchgef\u00fchrt:<\/p>\n<ul>\n<li>Es wurden 10 Threads gleichzeitig 3 Mal hintereinander gestartet (nennen wir dies einen Block von Threads). <\/li>\n<li>Die Laufzeit aller Threads im Block wurde gemittelt und war das Endergebnis der Blockausf\u00fchrung.<\/li>\n<li>Alle Threads arbeiteten mit derselben Tabelle. <\/li>\n<li>Vor jedem Start des Blockes von Threads wurde eine Major Compaction durchgef\u00fchrt.<\/li>\n<li>Jeder Block f\u00fchrte nur eine der folgenden Operationen aus: <\/li>\n<\/ul>\n<p>\n \u2014 Put<br \/>\n \u2014 Get<br \/>\n \u2014 Get+Put<\/p>\n<ul>\n<li>Jeder Block f\u00fchrte 50.000 Wiederholungen seiner Operation aus.<\/li>\n<li>Die Gr\u00f6\u00dfe des Schreibvorgangs im Block betrug 100 Byte, 1000 Byte oder 10.000 Byte (random).<\/li>\n<li>Bl\u00f6cke wurden mit unterschiedlicher Anzahl an angeforderten Schl\u00fcsseln gestartet (entweder ein Schl\u00fcssel oder 10).<\/li>\n<li>Bl\u00f6cke wurden mit verschiedenen Tabelleneinstellungen gestartet. Die Parameter wurden ge\u00e4ndert:<\/li>\n<\/ul>\n<p>\n \u2014 BlockCache = ein- oder ausgeschaltet<br \/>\n \u2014 BlockSize = 65 KB oder 16 KB<br \/>\n \u2014 Partitionen = 1, 5 oder 30<br \/>\n \u2014 MSLAB = ein- oder ausgeschaltet<\/p>\n<p>So sieht ein Block aus:<\/p>\n<p>a. Der MSLAB-Modus wurde ein- oder ausgeschaltet.<br \/>\nb. Es wurde eine Tabelle erstellt, f\u00fcr die folgende Parameter festgelegt wurden: BlockCache = true\/none, BlockSize = 65\/16 Kb, Partitionen = 1\/5\/30. <br \/>\nc. Es wurde GZ-Kompression aktiviert.<br \/>\nd. Es wurden 10 Threads gleichzeitig gestartet, die jeweils 1\/10 Operationen put\/get\/get+put in diese Tabelle mit Eintr\u00e4gen von 100\/1000\/10000 Byte ausf\u00fchrten, wobei 50.000 Anfragen hintereinander durchgef\u00fchrt wurden (Schl\u00fcssel sind zuf\u00e4llig).<br \/>\ne. Punkt d wurde dreimal wiederholt.<br \/>\nf. Die Laufzeit aller Threads wurde gemittelt. <\/p>\n<p>Alle m\u00f6glichen Kombinationen wurden \u00fcberpr\u00fcft. Vorhersehbar ist, dass bei steigendem Datensatz die Geschwindigkeit sinken wird oder dass die Deaktivierung des Cachings zu einer Verlangsamung f\u00fchrt. Das Ziel war es jedoch, das Ausma\u00df und die Bedeutung des Einflusses jedes Parameters zu verstehen, daher wurden die gesammelten Daten in die Funktion der linearen Regression eingegeben, die es erm\u00f6glicht, die Zuverl\u00e4ssigkeit mit Hilfe der t-Statistik zu bewerten. Im Folgenden sind die Ergebnisse der Bl\u00f6cke aufgef\u00fchrt, die die Put-Operationen durchf\u00fchren. Der vollst\u00e4ndige Kombinationssatz betr\u00e4gt 2*2*3*2*3 = 144 Varianten + 72, da einige zweimal durchgef\u00fchrt wurden. Insgesamt also 216 Durchl\u00e4ufe:<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/7a13c7a9b3ff1859976800f5d45cd51b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Tests wurden auf einem Mini-Cluster durchgef\u00fchrt, das aus 3 DataNodes und 4 RS besteht (CPU Xeon E5-2680 v4 @ 2,40 GHz * 64 Threads). Version HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Die h\u00f6chste Einf\u00fcgegeschwindigkeit von 3,7 Sekunden wurde bei deaktiviertem MSLAB-Modus auf einer Tabelle mit einer Partition, mit aktiviertem BlockCache, BlockSize = 16, Eintr\u00e4gen von 100 Byte in 10er-Paketen erreicht.<br \/>\nDie niedrigste Einf\u00fcgegeschwindigkeit von 82,8 Sekunden wurde bei aktiviertem MSLAB-Modus auf einer Tabelle mit einer Partition, mit aktiviertem BlockCache, BlockSize = 16, Eintr\u00e4gen von 10000 Byte einzeln erreicht.<\/p>\n<p>Schauen wir uns jetzt das Modell an. Wir sehen eine gute Modellqualit\u00e4t anhand von R2, aber es ist offensichtlich, dass Extrapolation hier nicht empfehlenswert ist. Das tats\u00e4chliche Verhalten des Systems bei \u00c4nderungen der Parameter wird nicht linear sein, dieses Modell ist nicht f\u00fcr Prognosen gedacht, sondern f\u00fcr das Verst\u00e4ndnis dessen, was im Rahmen der festgelegten Parameter passiert ist. Zum Beispiel sehen wir hier nach dem Student-Kriterium, dass die Parameter BlockSize und BlockCache f\u00fcr die Put-Operation keine Rolle spielen (was im Allgemeinen ganz vorhersehbar ist):<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/2fb65d1809d53f2b47f4f8829a9efc65.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEs ist jedoch etwas \u00fcberraschend, dass die Erh\u00f6hung der Anzahl der Partitionen zu einer Verringerung der Leistung f\u00fchrt (wir haben bereits positive Auswirkungen einer erh\u00f6hten Anzahl von Partitionen bei BulkLoad gesehen), obwohl es nachvollziehbar ist. Erstens m\u00fcssen f\u00fcr die Verarbeitung Anfragen an 30 Regionen anstelle von einer gestellt werden, und das Datenvolumen ist nicht so gro\u00df, dass dies einen Vorteil bringt. Zweitens wird die Gesamtlaufzeit durch den langsamsten RS bestimmt, und da die Anzahl der DataNodes geringer ist als die der RS, haben einige Regionen eine null Lokalisierung. Schauen wir uns schlie\u00dflich die f\u00fcnf Hauptakteure an:<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8ad7e832879156eaa96e630458405cdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLassen Sie uns nun die Ergebnisse der Ausf\u00fchrung der Get-Blocks bewerten:<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8a5dd45422c74e8815011d7e9b805ccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Anzahl der Partitionen hat an Bedeutung verloren, was wahrscheinlich darauf zur\u00fcckzuf\u00fchren ist, dass die Daten gut im Cache gespeichert werden und der Cache f\u00fcr das Lesen das bedeutendste (statistisch gesehen) Kriterium ist. Es ist selbstverst\u00e4ndlich, dass eine Erh\u00f6hung der Anzahl der Nachrichten in der Anfrage ebenfalls sehr vorteilhaft f\u00fcr die Leistung ist. Die besten Ergebnisse:<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9d237f9fdbeaf5412daec2fc2fa24b01.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSchlie\u00dflich schauen wir uns das Blockmodell an, das zun\u00e4chst get und dann put ausgef\u00fchrt hat:<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/75137207a4a69acccad036882794094b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHier sind alle Parameter signifikant. Und die Ergebnisse der F\u00fchrenden:<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/c166933d81e86f36958e3af58297f876.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>9. Lasttests<\/h2>\n<p>\nUnd schlie\u00dflich f\u00fchren wir eine mehr oder weniger angemessene Last aus, aber es ist immer interessanter, wenn man einen Vergleich hat. Auf der DataStax-Website \u2013 dem Schl\u00fcsselentwickler von Cassandra \u2013 gibt es <noindex><a rel=\"nofollow\" href=\"https:\/\/www.datastax.com\/wp-content\/themes\/datastax-2014-08\/files\/NoSQL_Benchmarks_EndPoint.pdf\">Ergebnisse<\/a><\/noindex> eine Anzahl von NoSQL-Speichern, einschlie\u00dflich HBase Version 0.98.6-1. Die Belastung wurde mit 40 Threads und einer Datenmenge von 100 Bytes auf SSD-Festplatten durchgef\u00fchrt. Die Testergebnisse der Read-Modify-Write-Operationen zeigten solche Resultate.<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/521e9dff60f462e6dabebc1234e028be.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Soweit ich verstanden habe, wurde das Lesen in Bl\u00f6cken von 100 Datens\u00e4tzen durchgef\u00fchrt, und f\u00fcr 16 HBase-Knoten zeigte der DataStax-Test eine Leistung von 10.000 Operationen pro Sekunde. <\/p>\n<p>Es ist g\u00fcnstig, dass wir auch 16 Knoten in unserem Cluster haben, aber nicht ganz so \u201eg\u00fcnstig\u201c, dass jeder 64 Kerne (Threads) besitzt, w\u00e4hrend im DataStax-Test nur 4 vorhanden sind. Andererseits verf\u00fcgen sie \u00fcber SSDs, w\u00e4hrend wir HDDs haben, und eine neuere Version von HBase, und die CPU-Auslastung w\u00e4hrend der Belastung nahm kaum signifikant zu (visuell um 5-10 Prozent). Trotzdem werden wir versuchen, mit dieser Konfiguration zu starten. Die Tabelleneinstellungen sind standardm\u00e4\u00dfig, das Lesen erfolgt zuf\u00e4llig im Schl\u00fcsselbereich von 0 bis 50 Millionen (d.h. im Grunde jedes Mal neu). Die Tabelle hat 50 Millionen Eintr\u00e4ge, die auf 64 Partitionen aufgeteilt sind. Die Schl\u00fcssel sind nach crc32 gehasht. Die Tabelleneinstellungen sind standardm\u00e4\u00dfig, MSLAB ist aktiviert. Es werden 40 Threads gestartet, jeder Thread liest einen Satz von 100 zuf\u00e4lligen Schl\u00fcsseln und schreibt gleich darauf 100 generierte Bytes f\u00fcr diese Schl\u00fcssel zur\u00fcck. <\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/776490f01121cc434135f733311b7722.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Stand: 16 DataNode und 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 Threads). HBase-Version 1.2.0-cdh5.14.2.<\/p>\n<p>Das durchschnittliche Ergebnis liegt n\u00e4her bei 40.000 Operationen pro Sekunde, was deutlich besser ist als im DataStax-Test. Allerdings kann man im Rahmen des Experiments die Bedingungen etwas \u00e4ndern. Es ist ziemlich unwahrscheinlich, dass die gesamte Arbeit ausschlie\u00dflich mit einer Tabelle und nur mit eindeutigen Schl\u00fcsseln durchgef\u00fchrt wird. Angenommen, es gibt einen \u201ehei\u00dfen\u201c Satz von Schl\u00fcsseln, der die Hauptlast erzeugt. Daher versuchen wir, die Last mit gr\u00f6\u00dferen Eintr\u00e4gen (10 KB) zu erzeugen, ebenfalls in Mengen von 100, in 4 verschiedenen Tabellen und die angeforderten Schl\u00fcsselfelder auf 50.000 einzuschr\u00e4nken. Im folgenden Diagramm wird der Start von 40 Threads angezeigt, jeder Thread liest einen Satz von 100 Schl\u00fcsseln und schreibt zuf\u00e4llige 10 KB f\u00fcr diese Schl\u00fcssel zur\u00fcck. <\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30d29f1b98663e3c07cb2be20e93876a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNode und 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 Threads). HBase-Version 1.2.0-cdh5.14.2.<\/p>\n<p>Im Verlauf der Belastung wurde mehrmals eine Major Compaction gestartet. Wie oben gezeigt, wird die Leistung ohne dieses Verfahren allm\u00e4hlich abnehmen, jedoch tritt w\u00e4hrend der Ausf\u00fchrung auch zus\u00e4tzliche Belastung auf. Die Einbr\u00fcche werden durch verschiedene Ursachen verursacht. Manchmal beendeten Threads ihre Arbeit, und w\u00e4hrend sie neu gestartet wurden, trat eine Pause auf; manchmal erzeugten externe Anwendungen Belastung f\u00fcr den Cluster.<\/p>\n<p>Das gleichzeitige Lesen und Schreiben ist eines der schwierigsten Arbeitsszenarien f\u00fcr HBase. Wenn nur Put-Anfragen kleiner Gr\u00f6\u00dfe, zum Beispiel 100 Byte, durchgef\u00fchrt werden und diese zu Paketen von 10-50 Tausend zusammengefasst werden, k\u00f6nnen Hunderte von Tausenden von Operationen pro Sekunde erreicht werden, und \u00e4hnlich verh\u00e4lt es sich mit reinen Leseanfragen. Es ist erw\u00e4hnenswert, dass die Ergebnisse radikal besser sind als die von DataStax, haupts\u00e4chlich dank der Blockanfragen von 50.000.<\/p>\n<p><img decoding=\"async\" alt=\"Theorie und Praxis der Nutzung von HBase\" src=\"\/wp-content\/uploads\/2020\/01\/412bda50a55093224169f048ea2f863a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNode und 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 Threads). HBase-Version 1.2.0-cdh5.14.2.<\/p>\n<h2>10. Fazit<\/h2>\n<p>\nDieses System ist ausreichend flexibel konfigurierbar, dennoch bleibt der Einfluss einer gro\u00dfen Anzahl von Parametern nach wie vor unbekannt. Ein Teil von ihnen wurde getestet, hat aber nicht in das endg\u00fcltige Testset Eingang gefunden. Erste Experimente zeigten eine geringe Bedeutung des Parameters DATA_BLOCK_ENCODING, der Informationen unter Verwendung von Werten benachbarter Zellen kodiert, was f\u00fcr zuf\u00e4llig generierte Daten durchaus erkl\u00e4rbar ist. Bei der Verwendung einer gro\u00dfen Anzahl von sich wiederholenden Objekten kann der Gewinn erheblich sein. Insgesamt kann gesagt werden, dass HBase den Eindruck einer ernsthaften und durchdachten Datenbank vermittelt, die bei Operationen mit gro\u00dfen Datenbl\u00f6cken ausreichend leistungsf\u00e4hig sein kann. Besonders wenn es m\u00f6glich ist, Lese- und Schreibvorg\u00e4nge zeitlich zu entzerren.<\/p>\n<p>Wenn etwas Ihrer Meinung nach nicht ausreichend erl\u00e4utert ist, bin ich bereit, mehr Details zu geben. Ich lade ein, unsere Erfahrungen zu teilen oder zu diskutieren, wenn Sie mit etwas nicht einverstanden sind.<br \/>\n<br \/>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Theorie und Praxis der Nutzung von HBase | ProHoster","description":"Guten Tag! Mein Name ist Danil Lipovoy, unser Team bei Sbertech hat begonnen, HBase als Repository f\u00fcr operative Daten zu nutzen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/55302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=55302"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/55302\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=55302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=55302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=55302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}