Ich speichere Daten in hbase mit 5 Regionsservern. Ich benutze md5 Hash von URL als meine Zeilenschlüssel. Derzeit werden alle Daten nur in einem Regionsserver gespeichert. Daher möchte ich die Regionen vorab aufteilen, so dass die Daten einheitlich über den gesamten Regionsserver übertragen werden, sodass die Daten in jedem Regionsserver einheitlich übertragen werden. Ich möchte Daten als erstes Zeichen des Zeilenschlüssels teilen. Als erstes Zeichen ist von 0 bis f (16 Zeichen). Wie Daten mit Zeilenschlüssel beginnend von 0 bis 3 gehen in 1. Region Server, 3-6 auf 2., 6-9 auf 3., a-d am 4., d-f am 5.. Wie kann ich es tun?
Sie können beim Erstellen der Tabelle eine SPLITS-Eigenschaft angeben.
%Vor%Die 4 Splitpunkte erzeugen 5 Regionen.
Bitte beachten Sie, dass HBases DefaultLoadBalancer dies nicht tut Um eine 100% ige gleichmäßige Verteilung zwischen den Regionsservern zu gewährleisten, kann es vorkommen, dass ein Regionsserver mehrere Regionen aus derselben Tabelle hostet.
Weitere Informationen zur Funktionsweise finden Sie in dies :
%Vor%Generieren Sie einen globalen Lastverteilungsplan gemäß der angegebenen Karte von Serverinformationen zu den am meisten geladenen Regionen jedes Servers. Das Load Balancing Invariant ist, dass alle Server innerhalb einer Region von sind die durchschnittliche Anzahl von Regionen pro Server. Wenn der Durchschnitt eine ganze Zahl ist Anzahl, alle Server werden auf den Durchschnitt ausgewogen sein. Sonst alles Die Server haben entweder durchschnittliche (durchschnittliche) oder durchschnittliche (durchschnittliche) Bereiche. HBASE-3609 Modellierte Regionen, die mit Guava's MinMaxPriorityQueue so arbeiten das können wir von beiden Enden der Warteschlange holen. Am Anfang haben wir Überprüfen Sie, ob ein leerer Regionsserver vom Master gefunden wurde. Wenn ja, wählen wir abwechselnd neue / alte Regionen von Kopf / Schwanz aus regionesToMove. Dieser Wechsel verhindert, dass junge Cluster gebildet werden Regionen auf dem neu erkannten Regionsserver. Ansonsten wählen wir neue Regionen von Kopf der RegionenToMove. Eine weitere Verbesserung von HBASE-3609 ist, dass wir Regionen von regionsToMove zu untergeordnet zuweisen Server in Round-Robin-Mode. Zuvor ein unterbelasteter Server würde gefüllt werden, bevor wir auf den nächsten unterbelasteten Server gehen, zur Clusterbildung junger Regionen führen. Zum Schluss mischen wir uns zufällig unterbelastete Server, so dass sie reload Regionen relativ erhalten gleichmäßig über Aufrufe von balanceCluster (). Der Algorithmus ist derzeit als solche implementiert:
- Bestimmen Sie die zwei gültigen Zahlen von Regionen, die jeder Server haben sollte, MIN = floor (Durchschnitt) und MAX = ceiling (Durchschnitt).
- Iterieren Sie die am meisten ausgelasteten Server, und geben Sie Regionen von jedem Server frei, damit jeder Server genau MAX-Regionen hostet. Stoppen Sie, sobald Sie einen Server erreichen das hat bereits & lt; = MAX-Regionen. Ordne die Regionen so an, dass sie sich am meisten bewegen zuletzt mindestens.
- Iterieren Sie die am wenigsten ausgelasteten Server, indem Sie Regionen zuweisen, sodass jeder Server genau MIN-Regionen aufweist. Stoppen Sie, sobald Sie einen Server erreichen, der hat bereits & gt; = MIN-Regionen. Regionen, die unterbelastet sind Server sind diejenigen, die im vorherigen Schritt vergossen wurden. Es ist möglich dass es nicht genug Regionen gab, um jede unterbelastete zu füllen Server zu MIN. Wenn dies der Fall ist, haben wir eine Reihe von Regionen, die wir tun müssen so, benötigteRegionen. Es ist auch möglich, dass wir jeweils füllen konnten unterbelastet, aber endete mit Regionen, die nicht zugewiesen wurden Überladene Server, die aber immer noch keine Zuweisung haben. Wenn nicht von diesen Bedingungen halten (keine Regionen benötigt, um die unterbelasteten zu füllen Server, keine Regionsreste von überlasteten Servern), wir sind fertig und Rückkehr. Ansonsten behandeln wir diese Fälle unten.
- Wenn necessariesRegions nicht Null ist (haben Sie noch unterbeladene Server), durchlaufen wir die am meisten ausgelasteten Server erneut und geben dabei einen einzelnen Server ab jeder (das bringt sie von MAX-Regionen zu MIN-Regionen).
- Wir haben jetzt definitiv mehr Regionen, die eine Zuweisung benötigen, entweder vom vorherigen Schritt oder vom ursprünglichen Shedding von überladen Server. Iterieren Sie die am wenigsten belasteten Server, die jeweils MIN füllen. Wenn wir haben immer noch mehr Regionen, die eine Zuweisung benötigen, iterieren sie am wenigsten geladene Server, dieses Mal geben Sie jedes (bis MAX zu füllen) bis wir laufen aus.
- Alle Server werden jetzt entweder MIN- oder MAX-Regionen hosten. Darüber hinaus wird garantiert, dass alle Server-Hosting- & gt; = MAX-Regionen mit MAX enden Regionen am Ende des Ausgleichs. Dies gewährleistet die minimale Anzahl von möglichen Regionen werden verschoben.
TODO: Wir können höchstens die Anzahl der Regionen von a bestimmten Server, wie viele sie als am meisten geladen melden. Sollten wir einfach alle Zuweisungen im Speicher behalten? Irgendwelche Einwände? Heißt das wir? Benötigen Sie HeapSize auf HMaster? Oder nur vorsichtiger Monitor? (aktuelles Denken werden wir alle Zuweisungen im Speicher halten)
Wenn Sie alle Daten bereits gespeichert haben, empfehle ich Ihnen, einige Regionen manuell auf andere Regionsserver zu verschieben, indem Sie hbase verwenden Schale .
%Vor%Verschiebe eine Region. Geben Sie optional target regionserver an, den wir auswählen eins nach dem Zufallsprinzip. HINWEIS: Sie übergeben den Namen der codierten Region, nicht die Region benennen Sie diesen Befehl ein wenig anders als die anderen. Das codiert Regionsname ist das Hash-Suffix für Regionsnamen: z. wenn die Region Name waren TestTable, 0094429456,1289497600452.527db22f95c8a9e0116f0cc13c680396. dann ist der codierte Bereichsname Teil 527db22f95c8a9e0116f0cc13c680396 Ein Servername ist sein Host, Port plus Startcode. Beispiel: host187.example.com, 60020,1289493121758
Wenn Sie Apache Phoenix zum Erstellen von Tabellen in HBase verwenden, können Sie SALT_BUCKETS in der CREATE-Anweisung angeben. Die Tabelle wird in so viele Regionen aufgeteilt, wie der erwähnte Bucket angibt. Phoenix berechnet den Hash des Zeilenschlüssels (höchstwahrscheinlich ein numerischer Hashwert% SALT_BUCKETS) und weist die Spaltenzelle der entsprechenden Region zu.
%Vor%Dadurch wird die Tabelle in drei Bereiche aufgeteilt
Alternativ können Sie auf der Standardbenutzeroberfläche von HBase Regionen entsprechend aufteilen.