{"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 Speichersystem f\u00fcr operative Daten zu nutzen. Im Laufe unserer Untersuchungen haben wir Erfahrungen gesammelt, die wir systematisieren und dokumentieren wollten (wir hoffen, dass viele davon profitieren k\u00f6nnen). Alle nachfolgend aufgef\u00fchrten Experimente wurden mit den HBase-Versionen 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>Datenschreibung in HBase<\/li>\n<li>Datenlesen aus HBase<\/li>\n<li>Daten-Caching<\/li>\n<li>Batchverarbeitung von Daten MultiGet\/MultiPut<\/li>\n<li>Tabelle-Regionen-Split-Strategie<\/li>\n<li>Fehlertoleranz, Kompaktierung und Datenlokalit\u00e4t<\/li>\n<li>Einstellungen und Leistung<\/li>\n<li>Lasttest<\/li>\n<li>Fazit<\/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 \u00fcberwacht das Heartbeat des aktiven Masters auf dem ZooKeeper-Knoten und \u00fcbernimmt im Falle eines Ausfalls die Funktionen des Masters. <\/p>\n<h2>2. Datenschreibung in HBase<\/h2>\n<p>\nZuerst betrachten wir den einfachsten Fall \u2013 das Schreiben eines Schl\u00fcssel-Wert-Objekts in eine Tabelle mithilfe von put(rowkey). Der Client muss zuerst herausfinden, wo sich der Root Region Server (RRS) befindet, der die Tabelle hbase:meta speichert. Diese Informationen erh\u00e4lt er von ZooKeeper. Anschlie\u00dfend wendet er sich an den RRS und liest die Tabelle hbase:meta, aus der er die Informationen dar\u00fcber entnimmt, welcher RegionServer (RS) f\u00fcr die Speicherung der Daten f\u00fcr den angegebenen Schl\u00fcssel rowkey in der von ihm interessierten Tabelle verantwortlich ist. Zur weiteren Verwendung wird die Metatabelle vom Client zwischengespeichert, sodass nachfolgende Zugriffe schneller direkt zum RS erfolgen.<\/p>\n<p>Danach schreibt RS, nachdem es die Anfrage erhalten hat, zun\u00e4chst in das WriteAheadLog (WAL), was f\u00fcr die Wiederherstellung im Falle eines Ausfalls erforderlich ist. Danach werden die Daten im MemStore gespeichert. Dies ist ein Speicherpuffer, der eine sortierte Menge von Schl\u00fcsseln f\u00fcr diese Region enth\u00e4lt. Die Tabelle kann in Regionen (Partitionen) unterteilt werden, von denen jede eine nicht \u00fcberschneidende Menge von Schl\u00fcsseln enth\u00e4lt. Dadurch kann durch die Verteilung der Regionen auf verschiedene Server eine h\u00f6here Leistung erzielt werden. Trotz der offensichtlichen Natur dieser Aussage werden wir jedoch sehen, dass dies nicht in allen F\u00e4llen funktioniert.<\/p>\n<p>Nach dem Ablegen des Eintrags im MemStore erh\u00e4lt der Kunde eine R\u00fcckmeldung, dass der Eintrag erfolgreich gespeichert wurde. Tats\u00e4chlich wird er jedoch nur im Puffer gespeichert und gelangt erst auf die Festplatte, nachdem ein gewisser Zeitraum vergangen ist oder wenn er mit neuen Daten gef\u00fcllt wird. <\/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 Ausf\u00fchrung der \u00abDelete\u00bb-Operation erfolgt keine physische L\u00f6schung der Daten. Sie werden lediglich als gel\u00f6scht markiert, und die tats\u00e4chliche Zerst\u00f6rung findet zum Zeitpunkt des Aufrufs der Funktion major compact statt, die in Punkt 7 n\u00e4her erl\u00e4utert wird.<\/p>\n<p>HFile-Dateien sammeln sich im HDFS und gelegentlich wird ein Minor Compact-Prozess gestartet, der einfach kleine Dateien zu gr\u00f6\u00dferen zusammenf\u00fchrt, ohne etwas zu l\u00f6schen. Im Laufe der Zeit f\u00fchrt dies zu einem Problem, das sich nur beim Lesen von Daten bemerkbar macht (darauf kommen wir sp\u00e4ter zur\u00fcck). <\/p>\n<p>Neben dem oben beschriebenen Upload-Prozess gibt es ein viel effizienteres Verfahren, das wohl die st\u00e4rkste Seite dieser Datenbank ist \u2013 BulkLoad. Dabei erstellen wir HFiles selbst und legen sie auf die Festplatte, was eine hervorragende Skalierbarkeit und durchaus respektable Geschwindigkeiten erm\u00f6glicht. Letztlich ist hier nicht HBase die Grenze, sondern die M\u00f6glichkeiten der Hardware. Nachfolgend sind die Ergebnisse des Uploads in einem Cluster mit 16 RegionServern und 16 NodeManager YARN (CPU Xeon E5-2680 v4 @ 2,40 GHz * 64 Threads), Version HBase 1.2.0-cdh5.14.2, aufgef\u00fchrt. <\/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 erkennen, dass die Erh\u00f6hung der Anzahl der Partitionen (Regionen) in der Tabelle sowie der Spark-Executors die Upload-Geschwindigkeit steigert. Zudem h\u00e4ngt die Geschwindigkeit vom Volumen der Schreibvorg\u00e4nge ab. Gro\u00dfe Bl\u00f6cke f\u00fchren zu einem Anstieg in MB\/s, kleine hingegen erh\u00f6hen die Anzahl der eingef\u00fcgten Datens\u00e4tze pro Zeiteinheit, unter ansonsten gleichen Bedingungen. <\/p>\n<p>Es ist auch m\u00f6glich, den Download in zwei Tabellen gleichzeitig zu starten und die Geschwindigkeit zu verdoppeln. Unten ist zu sehen, dass das gleichzeitige Schreiben von 10-KB-Bl\u00f6cken in zwei Tabellen mit einer Geschwindigkeit von etwa 600 MB\/s pro Tabelle (insgesamt 1275 MB\/s) erfolgt, was mit der Schreibgeschwindigkeit in eine Tabelle von 623 MB\/s \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 Durchlauf mit 50-KB-Eintr\u00e4gen zeigt, dass die Ladegeschwindigkeit nur geringf\u00fcgig steigt, was auf ann\u00e4hernde Grenzwerte hinweist. Dabei sollte ber\u00fccksichtigt werden, dass die Belastung f\u00fcr HBASE praktisch nicht entsteht; alles, was von ihm gefordert wird, besteht darin, zuerst die Daten aus hbase:meta bereitzustellen und nach der Ablage von HFiles die Daten im BlockCache zur\u00fcckzusetzen und den MemStore-Puffer auf die Festplatte zu speichern, sofern dieser nicht leer ist.<\/p>\n<h2>3. Daten aus HBASE lesen<\/h2>\n<p>\nWenn man davon ausgeht, dass der Kunde bereits alle Informationen aus hbase:meta hat (siehe Punkt 2), wird die Anfrage sofort an den RS gesendet, wo der ben\u00f6tigte Schl\u00fcssel gespeichert ist. Zun\u00e4chst erfolgt die Suche in MemCache. Unabh\u00e4ngig davon, ob dort Daten vorhanden sind oder nicht, wird auch im BlockCache und bei Bedarf in HFiles gesucht. Wenn die Daten in der Datei gefunden werden, werden sie in den BlockCache gelegt und bei der n\u00e4chsten Anfrage schneller zur\u00fcckgegeben. Die Suche in HFile erfolgt relativ schnell dank der Verwendung des Bloom Filters, d.h. nachdem eine kleine Datenmenge gelesen wurde, kann sofort festgestellt werden, ob diese Datei den ben\u00f6tigten Schl\u00fcssel enth\u00e4lt. Falls nicht, wird zur n\u00e4chsten gewechselt.<\/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 Daten aus diesen drei Quellen erhalten wurden, formt der RS die Antwort. Insbesondere kann er mehrere gefundene Versionen des Objekts gleichzeitig \u00fcbermitteln, wenn der Kunde nach Versionsverwaltung gefragt hat.<\/p>\n<h2>4. Daten-Caching<\/h2>\n<p>\nDie MemStore- und BlockCache-Puffer nehmen bis zu 80 % des zugewiesenen on-heap Speichers des RS ein (der Rest ist f\u00fcr die Dienstaufgaben des RS reserviert). Wenn der typische Nutzungsmodus so ist, dass Prozesse diese Daten schreiben und sofort wieder lesen, macht es Sinn, den BlockCache zu reduzieren und den MemStore zu erh\u00f6hen, da beim Schreiben die Daten nicht in den Lesekernel gelangen und der BlockCache seltener verwendet wird. Der BlockCache besteht aus zwei Teilen: LruBlockCache (immer on-heap) und BucketCache (in der Regel off-heap oder auf SSD). Den BucketCache sollte man verwenden, wenn es viele Leseanfragen gibt, die nicht im LruBlockCache Platz finden, was zu einer aktiven Arbeit des Garbage Collectors f\u00fchrt. Dabei sollte man jedoch keine radikalen Leistungssteigerungen durch die Verwendung des Lesekerns erwarten; darauf kommen wir in Punkt 8 zur\u00fcck.<\/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 der MemStore f\u00fcr jede Tabelle individuell ist (je einer f\u00fcr jede Spaltenfamilie).<\/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 die Parameter CACHE_DATA_ON_WRITE f\u00fcr die Tabelle und \u201eCache DATA on Write\u201c f\u00fcr RS auf false gesetzt. In der Praxis jedoch, wenn Daten in den MemStore geschrieben und dann auf die Festplatte zur\u00fcckgesp\u00fclt werden (somit gel\u00f6scht), erhalten wir beim Ausf\u00fchren einer Abrufanfrage dennoch erfolgreich die Daten. Selbst wenn wir den BlockCache komplett deaktivieren und die Tabelle mit neuen Daten f\u00fcllen, dann den MemStore auf die Festplatte zur\u00fccksp\u00fclen, sie l\u00f6schen und aus einer anderen Sitzung anfordern, werden sie trotzdem irgendwoher abgerufen. HBase speichert also nicht nur Daten, sondern auch geheimnisvolle R\u00e4tsel.<\/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>\nDer Parameter \u201eCache DATA on Read\u201c ist auf false gesetzt. Wenn es Ideen gibt, sind Sie herzlich eingeladen, dies in den Kommentaren zu besprechen.<\/p>\n<h2>5. Batch-Datenverarbeitung MultiGet\/MultiPut<\/h2>\n<p>\nDie Verarbeitung einzelner Anfragen (Get\/Put\/Delete) ist eine recht kostspielige Operation, daher sollten sie nach M\u00f6glichkeit in einer Liste zusammengefasst werden, um eine betr\u00e4chtliche Leistungssteigerung zu erzielen. Dies gilt insbesondere f\u00fcr Schreiboperationen, w\u00e4hrend beim Lesen ein weiterer Stolperstein zu beachten ist. Im unteren Diagramm 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 angezeigt. Hier ist zu sehen, dass bei einer Erh\u00f6hung auf bis zu tausend Schl\u00fcssel in einer Anfrage die Ausf\u00fchrungszeit sinkt, d.h. die Geschwindigkeit steigt. Allerdings tritt beim standardm\u00e4\u00dfig aktivierten MSLAB-Modus nach diesem Schwellenwert ein drastischer Leistungsabfall auf, und je gr\u00f6\u00dfer das Datenvolumen im Datensatz ist, desto l\u00e4nger dauert die Verarbeitung. <\/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 wurde entwickelt, um die Fragmentierung des Heaps zu reduzieren, die durch das Mischen von Daten neuer und alter Generationen entsteht. Um dieses Problem zu l\u00f6sen, werden beim Aktivieren von MSLAB die Daten in relativ kleine Einheiten (Chunks) eingeordnet und in Portionen verarbeitet. Dadurch sinkt die Leistung erheblich, wenn die Gr\u00f6\u00dfe des angeforderten Datenpakets den zugewiesenen Speicher \u00fcberschreitet. Andererseits ist das Deaktivieren dieses Modus ebenfalls unerw\u00fcnscht, da dies zu Stopps durch GC w\u00e4hrend intensiver Datenverarbeitung f\u00fchrt. Eine gute L\u00f6sung ist die Erh\u00f6hung der Chunk-Gr\u00f6\u00dfe, wenn gleichzeitig Daten durch Put geschrieben und gelesen werden. Es ist erw\u00e4hnenswert, dass das Problem nicht auftritt, wenn nach dem Schreiben der Befehl Flush ausgef\u00fchrt wird, der den MemStore auf die Festplatte zur\u00fcckschreibt, oder wenn der Upload mithilfe von BulkLoad erfolgt. Die folgende Tabelle zeigt, dass Anfragen aus dem MemStore mit gr\u00f6\u00dferem Volumen (und der gleichen Anzahl) zu einer Verlangsamung f\u00fchren. Allerdings wird die Verarbeitungszeit durch Erh\u00f6hung der Chunk-Gr\u00f6\u00dfe wieder auf das Normalniveau zur\u00fcckgebracht.<\/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 \/>\nZus\u00e4tzlich zur Erh\u00f6hung der Chunkgr\u00f6\u00dfe hilft die Aufteilung der Daten nach Regionen, also dem Splitten von Tabellen. Dadurch erh\u00e4lt jede Region weniger Anfragen, und wenn sie in eine Zelle passen, bleibt die Antwortzeit gut.<\/p>\n<h2>6. Strategie zur Aufteilung von Tabellen auf Regionen (Splitting)<\/h2>\n<p>\nDa HBase ein Key-Value-Speicher ist und die Partitionierung nach dem Schl\u00fcssel erfolgt, ist es entscheidend, 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 passieren, dass dies zu einer erheblichen Verlangsamung f\u00fchrt, wenn die anschlie\u00dfend geladenen Daten beispielsweise lange Werte enthalten, die gr\u00f6\u00dftenteils mit derselben Ziffer beginnen, zum Beispiel:<\/p>\n<p>1000001<br \/>\n1000002<br \/>\n\u2026<br \/>\n1100003<\/p>\n<p>Da die Schl\u00fcssel als Byte-Arrays gespeichert werden, werden sie alle gleich anfangen und zu einer Region #1 geh\u00f6ren, die diesen Schl\u00fcsselbereich speichert. Es gibt mehrere Strategien f\u00fcr die Aufteilung:<\/p>\n<p>HexStringSplit \u2013 Wandelt den Schl\u00fcssel in eine Zeichenfolge mit hexadezimaler Kodierung im Bereich von \u201e00000000\u201c bis \u201eFFFFFFFF\u201c um und f\u00fcllt links mit Nullen auf.<\/p>\n<p>UniformSplit \u2013 Wandelt einen Schl\u00fcssel in ein Byte-Array mit einer hexadezimalen Kodierung im Bereich von \u00ab00\u00bb bis \u00abFF\u00bb um und f\u00fcllt ihn rechts mit Nullen auf.<\/p>\n<p>Dar\u00fcber hinaus kann ein beliebiger Bereich oder eine Gruppe von Schl\u00fcsseln f\u00fcr die Aufteilung angegeben und das Autoplenning konfiguriert werden. Eine der einfachsten und effektivsten Methoden ist jedoch UniformSplit und die Verwendung der Hash-Konkatenation, etwa des vorderen Byte-Paares aus der Anwendung der Funktion CRC32(rowkey) auf den Schl\u00fcssel und dem 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 RS die Menge der Daten und Schl\u00fcssel in der Region und teilt sie automatisch in Teile auf, wenn die Limits \u00fcberschritten werden. <\/p>\n<h2>7. Fehlertoleranz und Datenlokalit\u00e4t<\/h2>\n<p>\nDa jedes Region nur f\u00fcr einen Satz von Schl\u00fcsseln verantwortlich ist, besteht die L\u00f6sung f\u00fcr Probleme im Zusammenhang mit dem Ausfall von RS oder Stilllegungen darin, alle erforderlichen Daten in HDFS zu speichern. Wenn ein RS ausf\u00e4llt, erkennt der Master dies durch das Fehlen eines Heartbeats am ZooKeeper-Knoten. Er weist den betroffenen Region einem anderen RS zu, und da die HFiles in einem verteilten Dateisystem gespeichert sind, kann der neue Besitzer sie auslesen und die Daten weiterhin bereitstellen. Allerdings kann es sein, dass ein Teil der Daten im MemStore verbleibt und noch nicht in HFiles \u00fcberf\u00fchrt wurde. Zur Wiederherstellung der Operationshistorie wird das WAL verwendet, das ebenfalls in HDFS gespeichert ist. Nach dem Aufspielen der \u00c4nderungen kann der RS wieder auf Anfragen reagieren, jedoch f\u00fchrt der Umzug dazu, dass einige Daten und die Prozesse, die deren Verwaltung \u00fcbernehmen, sich auf verschiedenen Knoten befinden, was die Lokalit\u00e4t verringert. <\/p>\n<p>Die L\u00f6sung des Problems ist die major compaction \u2013 ein Verfahren, das die Dateien auf die Knoten verschiebt, die f\u00fcr sie verantwortlich sind (dort, wo sich ihre Regionen befinden). Dadurch steigt w\u00e4hrend dieses Prozesses die Belastung des Netzwerks und der Festplatten signifikant. Allerdings wird der Zugriff auf die Daten danach 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 basierend auf den Tabelleneinstellungen. So kann beispielsweise die Anzahl der Versionen des Objekts festgelegt werden, die aufbewahrt werden sollen, oder die Lebensdauer, nach deren Ablauf das Objekt physisch gel\u00f6scht wird.<\/p>\n<p>Dieses Verfahren kann sich sehr positiv auf die Leistung von HBase auswirken. Das Bild unten zeigt, wie die Leistung durch aktives Schreiben von Daten degradiert wurde. Hier sieht man, wie 40 Threads in eine Tabelle schreiben und 40 Threads gleichzeitig Daten lesen. Die schreibenden Threads erzeugen immer mehr HFiles, die von anderen Threads gelesen werden. Infolgedessen m\u00fcssen immer mehr Daten aus dem Speicher entfernt werden, und schlie\u00dflich beginnt der Garbage Collector zu arbeiten, was die gesamte Arbeit praktisch l\u00e4hmt. Der Start einer Major Compaction f\u00fchrte zur Bereinigung der entstandenen R\u00fcckst\u00e4nde 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 RegionServern (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 anzumerken, dass die Durchf\u00fchrung einer major compaction auf einer \"lebenden\" Tabelle stattfand, in die aktiv Daten geschrieben und gelesen wurden. In der Community wurde behauptet, dass dies zu inkorrekten Antworten beim Lesen von Daten f\u00fchren k\u00f6nnte. Zur \u00dcberpr\u00fcfung wurde ein Prozess gestartet, der neue Daten generierte und in die Tabelle schrieb. Anschlie\u00dfend wurden diese sofort gelesen und mit den gespeicherten Werten abgeglichen. W\u00e4hrend dieses Prozesses wurde die major compaction etwa 200 Mal durchgef\u00fchrt, und es wurden keine Fehler festgestellt. M\u00f6glicherweise tritt das Problem selten und nur bei hoher Auslastung auf, weshalb es sicherer ist, die Schreib- und Leseprozesse programmatisch zu stoppen und die Bereinigung durchzuf\u00fchren, um solche GC-Einbr\u00fcche zu vermeiden.<\/p>\n<p>Au\u00dferdem hat die major compaction keinen Einfluss auf den Zustand des MemStore; um ihn auf die Festplatte zu leeren und zu kompaktiifizieren, 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, wenn es nichts tun muss, w\u00e4hrend es BulkLoad ausf\u00fchrt. Dies gilt jedoch f\u00fcr die meisten Systeme und Menschen. Dieses Tool eignet sich besser f\u00fcr die Massenablage von Daten in gro\u00dfen Bl\u00f6cken. Wenn der Prozess jedoch viele konkurrierende Lese- und Schreibanfragen erfordert, werden die oben beschriebenen Befehle Get und Put verwendet. Um die optimalen Parameter zu bestimmen, wurden mehrere L\u00e4ufe mit unterschiedlichen Kombinationen von Tabelleneinstellungen und Konfigurationen durchgef\u00fchrt.<\/p>\n<ul>\n<li>Es wurden 10 Threads gleichzeitig dreimal hintereinander gestartet (nennen wir dies einen Threadblock). <\/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 Threadblocks 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 eines Eintrags im Block betrug 100 Byte, 1000 Byte oder 10000 Byte (zuf\u00e4llig).<\/li>\n<li>Bl\u00f6cke wurden mit einer unterschiedlichen Anzahl angeforderter Schl\u00fcssel gestartet (entweder ein Schl\u00fcssel oder 10).<\/li>\n<li>Die 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 der Block aus:<\/p>\n<p>a. Der MSLAB-Modus wurde ein- bzw. ausgeschaltet.<br \/>\nb. Eine Tabelle wurde erstellt, f\u00fcr die folgende Parameter festgelegt wurden: BlockCache = true\/none, BlockSize = 65\/16 KB, Partitionen = 1\/5\/30. <br \/>\nc. GZ-Kompression wurde aktiviert.<br \/>\nd. Es wurden gleichzeitig 10 Threads gestartet, die 1\/10 Put\/Get\/Get+Put-Operationen in dieser Tabelle mit Datens\u00e4tzen von 100\/1000\/10000 Bytes durchf\u00fchrten, wobei 50.000 Anfragen hintereinander ausgef\u00fchrt wurden (Zufallszahlen).<br \/>\ne. Punkt d wurde dreimal wiederholt.<br \/>\nf. Die Laufzeit aller Threads wurde im Durchschnitt berechnet. <\/p>\n<p>Alle m\u00f6glichen Kombinationen wurden getestet. Vorhersehbar war, dass die Geschwindigkeit sinkt, wenn die Datensatzgr\u00f6\u00dfe erh\u00f6ht wird, oder dass das Deaktivieren des Caching zu einer Verlangsamung f\u00fchrt. Das Ziel war jedoch, das Ausma\u00df und die Bedeutung des Einflusses jedes Parameters zu verstehen. Daher wurden die gesammelten Daten in eine lineare Regressionsfunktion eingespeist, was eine Bewertung der Verl\u00e4sslichkeit mithilfe von t-Statistiken erm\u00f6glicht. Im Folgenden sind die Ergebnisse der Bl\u00f6cke aufgef\u00fchrt, die die Put-Operationen ausf\u00fchren. Die vollst\u00e4ndige Kombination von 2*2*3*2*3 ergibt 144 Varianten + 72, da einige zweimal durchgef\u00fchrt wurden. Insgesamt also 216 Ausf\u00fchrungen:<\/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 (CPU Xeon E5-2680 v4 @ 2,40 GHz * 64 Threads) bestand. Version HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Die h\u00f6chste Einf\u00fcgegeschwindigkeit von 3,7 Sekunden wurde im ausgeschalteten MSLAB-Modus auf einer Tabelle mit einer Partition erreicht, mit aktiviertem BlockCache, BlockSize = 16, mit 100-Byte-Datens\u00e4tzen in 10er-Packs.<br \/>\nDie niedrigste Einf\u00fcgegeschwindigkeit von 82,8 Sekunden wurde im aktivierten MSLAB-Modus auf einer Tabelle mit einer Partition erreicht, mit aktiviertem BlockCache, BlockSize = 16, mit 10.000-Byte-Datens\u00e4tzen von je 1 St\u00fcck.<\/p>\n<p>Jetzt schauen wir uns das Modell an. Wir sehen eine gute Modellqualit\u00e4t gem\u00e4\u00df R\u00b2, aber es ist v\u00f6llig klar, dass eine Extrapolation hier nicht angebracht ist. Das tats\u00e4chliche Verhalten des Systems bei \u00c4nderung der Parameter wird nicht linear sein; dieses Modell dient nicht zur Prognose, sondern zum Verst\u00e4ndnis dessen, was innerhalb der gegebenen Parameter passiert ist. Zum Beispiel sehen wir hier anhand des Student-Kriteriums, dass die Parameter BlockSize und BlockCache f\u00fcr die Put-Operation irrelevant sind (was im Allgemeinen ziemlich 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 \/>\nDass jedoch eine Erh\u00f6hung der Anzahl von Partitionen zu einer Verringerung der Leistung f\u00fchrt, ist etwas unerwartet (wir haben bereits einen positiven Einfluss der Erh\u00f6hung der Partitionen bei BulkLoad gesehen), obwohl es erkl\u00e4rbar ist. Erstens muss f\u00fcr die Verarbeitung Anfragen an 30 Regionen anstatt an eine einzige gestellt werden, und das Datenvolumen reicht nicht aus, um daraus einen Vorteil zu ziehen. Zweitens wird die Gesamtarbeitszeit durch den langsamsten RS bestimmt, und da die Anzahl der DataNodes geringer ist als die Anzahl der RS, haben einige Regionen eine null Lokalisierung. Schauen wir uns die Top 5 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 \/>\nJetzt bewerten wir die Ergebnisse der Ausf\u00fchrung der Get-Blocks:<\/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 daran liegt, dass die Daten gut zwischengespeichert werden und der Lesecache das statistisch bedeutendste Merkmal darstellt. Nat\u00fcrlich ist auch eine Erh\u00f6hung der Anzahl an Anfragen im Request sehr n\u00fctzlich f\u00fcr die Leistung. 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 \/>\nUnd schlie\u00dflich schauen wir uns das Blockmodell an, das zuerst 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 Besten:<\/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 lassen Sie uns eine halbwegs anst\u00e4ndige Last ausprobieren, aber es ist immer interessanter, wenn man einen Vergleich hat. Auf der DataStax-Website \u2013 dem wichtigsten Entwickler 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\">die Ergebnisse<\/a><\/noindex> NHT einer Reihe von NoSQL-Datenbanken, einschlie\u00dflich HBase Version 0.98.6-1. Der Test wurde mit 40 Threads durchgef\u00fchrt, die Datengr\u00f6\u00dfe betrug 100 Byte, SSDs wurden verwendet. Das Testergebnis f\u00fcr die Operationen Read-Modify-Write ergab folgende 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 Eintr\u00e4gen durchgef\u00fchrt, und f\u00fcr 16 Nodes zeigte der DataStax-Test f\u00fcr HBase eine Leistung von 10.000 Operationen pro Sekunde. <\/p>\n<p>Es ist g\u00fcnstig, dass auch in unserem Cluster 16 Knoten installiert sind, allerdings ist es weniger erfreulich, dass jeder \u00fcber 64 Kerne (Threads) verf\u00fcgt, w\u00e4hrend im DataStax-Test lediglich 4 pro Knoten genutzt werden. Auf der anderen Seite haben sie SSDs, w\u00e4hrend wir HDDs verwenden und eine neuere Version von HBase haben. Die CPU-Auslastung w\u00e4hrend der Last war jedoch kaum signifikant angestiegen (visuell um 5-10 Prozent). Dennoch werden wir versuchen, auf 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. praktisch jedes Mal neu). In der Tabelle sind 50 Millionen Datens\u00e4tze, aufgeteilt in 64 Partitionen. Die Schl\u00fcssel sind nach crc32 gehasht. Die Tabelleneinstellungen sind standardm\u00e4\u00dfig, MSLAB ist aktiviert. Es werden 40 Threads gestartet, jeder Thread liest ein Set aus 100 zuf\u00e4lligen Schl\u00fcsseln und schreibt sofort 100 generierte Bytes zur\u00fcck zu diesen Schl\u00fcsseln. <\/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 DataNodes 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. F\u00fcr das Experiment k\u00f6nnen die Bedingungen jedoch leicht angepasst werden. Es ist ziemlich unwahrscheinlich, dass alle Arbeiten ausschlie\u00dflich mit einer Tabelle und nur mit einzigartigen Schl\u00fcsseln durchgef\u00fchrt werden. Angenommen, es gibt einen 'hei\u00dfen' Schl\u00fcsselbereich, der die Hauptlast erzeugt. Daher versuchen wir, eine Last mit gr\u00f6\u00dferen Datens\u00e4tzen (10 KB), ebenfalls in Stapeln zu 100, auf 4 verschiedenen Tabellen zu erstellen und den Bereich der angeforderten Schl\u00fcssel auf 50.000 zu begrenzen. Im folgenden Diagramm wird der Start von 40 Threads gezeigt, wobei jeder Thread eine Gruppe von 100 Schl\u00fcsseln liest und sofort zuf\u00e4llige 10 KB zu diesen Schl\u00fcsseln zur\u00fcckschreibt. <\/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 DataNodes und 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 Threads). HBase-Version 1.2.0-cdh5.14.2.<\/p>\n<p>W\u00e4hrend der Last wurde mehrfach eine Major Compaction gestartet, wie oben gezeigt, und ohne diese Prozedur w\u00fcrde die Leistung allm\u00e4hlich abnehmen, jedoch entsteht w\u00e4hrend der Ausf\u00fchrung auch zus\u00e4tzliche Last. Die Einbr\u00fcche wurden durch verschiedene Gr\u00fcnde verursacht. Manchmal beendeten die Threads ihre Arbeit, und w\u00e4hrend sie neu gestartet wurden, gab es eine Pause. Manchmal erzeugten Drittanwendungen zus\u00e4tzliche Last auf dem Cluster.<\/p>\n<p>Das gleichzeitige Lesen und Schreiben geh\u00f6rt zu den herausforderndsten Szenarien f\u00fcr HBase. Wenn nur kleine Put-Anfragen von beispielsweise 100 Bytes gemacht werden, k\u00f6nnen diese in Batches von 10.000 bis 50.000 zusammengefasst werden, um mehrere Hunderttausend Operationen pro Sekunde zu erreichen. \u00c4hnlich verh\u00e4lt es sich mit reinen Leseanfragen. Es ist zu beachten, dass die Ergebnisse deutlich besser sind als die von DataStax, haupts\u00e4chlich dank der Batches von 50.000 Anfragen.<\/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 DataNodes 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 l\u00e4sst sich flexibel konfigurieren, jedoch bleibt der Einfluss zahlreicher Parameter weitgehend unbekannt. Einige davon wurden getestet, fanden aber keinen Eingang in die Ergebnisreihe der Tests. Vorl\u00e4ufige Experimente zeigten beispielsweise eine geringe Signifikanz des Parameters DATA_BLOCK_ENCODING, der Informationen unter Verwendung von Werten aus benachbarten Zellen kodiert, was f\u00fcr zuf\u00e4llig generierte Daten vollst\u00e4ndig verst\u00e4ndlich ist. Bei der Verwendung einer gro\u00dfen Anzahl sich wiederholender Objekte kann der Gewinn erheblich sein. Insgesamt macht HBase den Eindruck einer ernsthaften und gut durchdachten Datenbank, die bei Operationen mit gro\u00dfen Datenbl\u00f6cken durchaus leistungsf\u00e4hig sein kann. Besonders wenn die M\u00f6glichkeit besteht, Lese- und Schreibprozesse zeitlich zu trennen.<\/p>\n<p>Wenn meiner Meinung nach etwas nicht ausreichend behandelt wurde, bin ich bereit, detaillierter zu berichten. Wir laden Sie ein, Ihre 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 4.9.10 - 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. \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\" \/>\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) 4.9.10\" \/>\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. \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\" \/>\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 Verwendung von HBase | ProHoster","description":"Guten Tag! Mein Name ist Danil Lipovoy. Unser Team bei Sbertech hat begonnen, HBase als Speicherung f\u00fcr operative Daten zu verwenden. W\u00e4hrend seiner Erforschung haben wir Erfahrungen gesammelt, die wir systematisieren und beschreiben wollten (wir hoffen, dass es vielen n\u00fctzlich sein wird). Alle unten dargestellten Experimente wurden mit den Versionen HBase 1.2.0-cdh5.14.2 und 2.0.0-cdh6.0.0-beta1 durchgef\u00fchrt. Allgemeine Architektur Datenspeicherung in HBase Datenlesung aus HBase","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. \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","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"},"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}]}}