Funktionen zum Entwerfen eines Datenmodells fĂĽr NoSQL

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). :
  • , ( )
  • / / ( )

, . (, , , , : , .., «»), /. :


user_idfriend_id

ID


HBase , :


  • , full table scan,
    • , SQL- – ; , , Impala SQL- Join’ HBase, …

ID . « ID ?» . «» ( 1 (default), ):


RowKey
1:2:3:
1:2:

. : 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):


RowKey
1:2:3:count: 3
1:2:count: 2

:


  • : « ?» => (n)
  • : : , , «count» .. . (1)
  • : : , - «» . , , , => O(n)
  • , «count», , -

2 , « ». «» 3 (col).
« »: ! – , 1 (, , , «// ..»). «», NoSQL-, HBase :


RowKey
: 1: 1: 1
: 1: 1

. , :


  • : , , , «»: , True, – False => O(1)
  • : : : «ID » => O(1)
  • : : «ID » => O(1)

, , , , . , …


- . ? userID.friendID? ( 4(row)):


RowKey
.: 1
.: 1
.: 1
.: 1
.: 1

, , (1). 3 - .


«». , 4 , , , ( , HBase ). , . , userID friendID, , , . ( 5(hash)):


RowKey
dc084ef00e94aef49be885f9b01f51c01918fa783851db0dc1f72f83d33a5994: 1
dc084ef00e94aef49be885f9b01f51c0f06b7714b5ba522c3cf51328b66fe28a: 1
dc084ef00e94aef49be885f9b01f51c00d2c2e5d69df6b238754f650d56c896a: 1
1918fa783851db0dc1f72f83d33a59949ee3309645bd2c0775899fca14f311e1: 1
1918fa783851db0dc1f72f83d33a5994dc084ef00e94aef49be885f9b01f51c0: 1

, , , 4 – (1).
, :


1 (default)O(n)O(n)O(n)
2 (count)O(1)O(n)O(n)
3 (column)O(1)O(1)O(1)
4 (row)O(1)O(1)O(1)
5 (hash)O(1)O(1)O(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]} #  15 

{0: [1, 10800], 1: [5, 10800, 2, 10801, 4, 10802], 2: [1, 10800], 3: [3, 10800, 1, 10801, 5, 10802], 4: [2, 10800]} #  18  

{0: [1], 1: [1, 3, 2, 5, 4], 2: [1, 2], 3: [4, 1, 2, 3, 5], 4: [1, 2]} #  15 

, 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

All Articles