EinfĂĽhrung
"Sie mĂĽssen
so schnell laufen , um an Ort und Stelle zu bleiben, aber um irgendwohin zu gelangen, mĂĽssen Sie mindestens doppelt so schnell laufen!"
(c) Alice im Wunderland
Vor einiger Zeit wurde ich gebeten, den Analysten unseres Unternehmens einen Vortrag zum Thema Entwurf von Datenmodellen zu halten, da wir, wenn wir lange (manchmal mehrere Jahre) an Projekten sitzen, die Ereignisse in der IT-Welt aus den Augen verlieren. In unserem Unternehmen (es ist einfach so passiert) werden NoSQL-Datenbanken (zumindest vorerst) nicht in vielen Projekten verwendet. In meinem Vortrag habe ich sie daher anhand des HBase-Beispiels gesondert behandelt und versucht, die Präsentation des Materials auf diejenigen auszurichten, die es nie getan haben hat funktioniert. Insbesondere habe ich einige Merkmale des Datenmodelldesigns anhand eines Beispiels veranschaulicht, das ich vor einigen Jahren im Artikel „Einführung in das HB ase-Schemadesign“ von Amandeep Khurana gelesen habe. Bei der Analyse der Beispiele habe ich verschiedene Optionen zur Lösung des gleichen Problems miteinander verglichen, um dem Publikum die wichtigsten Ideen besser zu vermitteln.
Vor kurzem habe ich mich gefragt: "Es gibt nichts zu tun" (lange Maiwochenenden im Quarantänemodus sind dafür besonders geeignet), wie viel theoretische Berechnungen der Praxis entsprechen werden. Eigentlich war die Idee zu diesem Artikel geboren. Ein Entwickler, der seit mehreren Tagen mit NoSQL arbeitet, lernt möglicherweise nichts Neues daraus (und kann daher sofort ein halbes Hundert ausgeben). Für Analysten , die noch nicht eng mit NoSQL zusammengearbeitet haben, ist dies meines Erachtens hilfreich, um ein grundlegendes Verständnis der Konstruktionsmerkmale von Datenmodellen für HBase zu erhalten.
Ein Beispiel analysieren
, NoSQL , «» «». . NoSQL . NoSQL , , . , ( ). , «» , . NoSQL . , , .
«» , :
. , ( , Linkedin). :
, . (, , , , : , .., «»), /. :
ID
HBase , :
- , full table scan,
- , SQL- – ; , , Impala SQL- Join’ HBase, …
ID . « ID ?» . «» ( 1 (default), ):
. : 1, 2, … — , ID . , . (1, 2 3), – (1 2) – HBase, :
:
- : , , , RowKey = «» , «» . , « » False;
- : : RowKey = «», . - , , ID .
- : :
- RowKey = «» , , ;
- , , «» , «» .
, , « », , -. n. (n-1). (-1) , - .
- : . (n)
- : : , => (n)
- : :
- – => (n)
- «» . « », (n-1) . , «-» - – n. ( , (2)) (n) . : «» , , :

, O(n).
, , , , - . «count», . - , «count». , «count» . .. 2 (count):
:
- : « ?» => (n)
- : : , , «count» .. . (1)
- : : , - «» . , , , => O(n)
- , «count», , -
2 , « ». «» 3 (col).
« »: ! – , 1 (, , , «// ..»). «», NoSQL-, HBase :
. , :
- : , , , «»: , True, – False => O(1)
- : : : «ID » => O(1)
- : : «ID » => O(1)
, , , , . , …
- . ? userID.friendID? ( 4(row)):
, , (1). 3 - .
«». , 4 , , , ( , HBase ). , . , userID friendID, , , . ( 5(hash)):
, , , 4 – (1).
, :
, 3-5 . , , , «», « ». 3. , , .
– . « » , (n). , , , « », «-». «-» :
, , :
- . n. " " – . , « » HBase . – «-»
- . «», , . = - , «», – «». , «» «» ( 1 2). .
- . . – ( «» , ). .
5 , , . n , , 5 .
n= 5. «» ID-:
{0: [1], 1: [4, 5, 3, 2, 1], 2: [1, 2], 3: [2, 4, 1, 5, 3], 4: [2, 1]}
{0: [1, 10800], 1: [5, 10800, 2, 10801, 4, 10802], 2: [1, 10800], 3: [3, 10800, 1, 10801, 5, 10802], 4: [2, 10800]}
{0: [1], 1: [1, 3, 2, 5, 4], 2: [1, 2], 3: [4, 1, 2, 3, 5], 4: [1, 2]}
, ID, 10 000 – , False. , «» .
Windows 10, - HBase, – Python Jupyter Notebook. 2 CPU 2 . , « », «» Python. HBase happybase, (MD5) 5 — hashlib
n = 10, 30, …. 170 – ( n) - ( 15 ).
, . . n, « » , «» , ( ).
– , . – .

3-5 «-», .
2 , , 2 3-5. , – - / HBase 2 . , .
1 , .
.

3-5 – , . 1 2 . 2 – - «count», n . - , . , ( , 1 2, ) ( " ").
– .

. 3-5 .
, , 4 5, , , 3. , – , , .
1 2, , . 2 1 – - - «» count.
:
- 3-5 , HBase; .
- 4 5 . , 5 . , .
- , «-» , .
. , ( ). , thrift, happybase, , Python ( , ), HBase, Windows 10 .. , . « » .
Fazit - Empfehlungen für alle, die gerade erst anfangen, Datenmodelle in HBase zu entwerfen: Zusammenfassung früherer Erfahrungen mit relationalen Datenbanken und Erinnerung an die „Gebote“:
- Beim Entwerfen gehen wir von den Aufgaben- und Datenmanipulationsmustern aus und nicht vom Domänenmodell
- Effektiver Zugriff (ohne vollständigen Tabellenscan) - nur per Schlüssel
- Denormalisierung
- Unterschiedliche Zeilen können unterschiedliche Spalten enthalten
- Die dynamische Zusammensetzung der Spalten