Funktioner för att designa en datamodell för NoSQL

Inledning

Funktioner för att designa en datamodell för NoSQL "Du mÄste springa sÄ fort du kan bara för att stanna pÄ plats,
och för att komma nĂ„gonstans mĂ„ste du springa minst dubbelt sĂ„ snabbt!”
(c) Alice i Underlandet

För en tid sedan blev jag ombedd att hÄlla en förelÀsning analytiker vÄrt företag pÄ temat design av datamodeller, för nÀr vi sitter pÄ projekt under en lÄng tid (ibland i flera Är) tappar vi ur sikte vad som hÀnder runt omkring oss i IT-teknikens vÀrld. I vÄrt företag (det rÄkar vara sÄ) anvÀnder mÄnga projekt inte NoSQL-databaser (Ätminstone för nu), sÄ i min förelÀsning Àgnade jag sÀrskild uppmÀrksamhet Ät dem med hjÀlp av exemplet HBase och försökte orientera presentationen av materialet till de som aldrig har anvÀnt dem har arbetat. I synnerhet illustrerade jag nÄgra av funktionerna i design av datamodeller med hjÀlp av ett exempel som jag lÀste för flera Är sedan i artikeln "Introduction to HB ase Schema Design" av Amandeep Khurana. NÀr jag analyserade exempel jÀmförde jag flera alternativ för att lösa samma problem för att bÀttre kunna förmedla huvudidéerna till publiken.

Nyligen, "av ingenting att göra", stÀllde jag mig sjÀlv frÄgan (den lÄnga majhelgen i karantÀn Àr sÀrskilt gynnsam för detta), hur mycket kommer teoretiska berÀkningar att motsvara praxis? Det Àr faktiskt sÄ hÀr idén till den hÀr artikeln föddes. En utvecklare som har arbetat med NoSQL i flera dagar kanske inte lÀr sig nÄgot nytt av det (och kan dÀrför direkt hoppa över halva artikeln). Men för analytikerFör de som Ànnu inte har arbetat nÀra NoSQL tror jag att det kommer att vara anvÀndbart för att fÄ en grundlÀggande förstÄelse för funktionerna i att designa datamodeller för HBase.

Exempelanalys

Enligt min mening, innan du börjar anvÀnda NoSQL-databaser, mÄste du tÀnka noga och vÀga för- och nackdelar. Ofta kan problemet med största sannolikhet lösas med traditionella relationella DBMS. DÀrför Àr det bÀttre att inte anvÀnda NoSQL utan betydande skÀl. Om du ÀndÄ bestÀmt dig för att anvÀnda en NoSQL-databas, bör du ta hÀnsyn till att designmetoderna hÀr Àr nÄgot annorlunda. Speciellt nÄgra av dem kan vara ovanliga för dem som tidigare endast har sysslat med relationella DBMS:er (enligt mina observationer). SÄ i den "relationella" vÀrlden börjar vi vanligtvis med att modellera problemdomÀnen, och först dÄ, om nödvÀndigt, avnormalisera modellen. I NoSQL vi bör omedelbart ta hÀnsyn till de förvÀntade scenarierna för att arbeta med data och initialisera data. Dessutom finns det ett antal andra skillnader, som kommer att diskuteras nedan.

LÄt oss övervÀga följande "syntetiska" problem, som vi kommer att fortsÀtta arbeta med:

Det Àr nödvÀndigt att utforma en lagringsstruktur för listan över vÀnner till anvÀndare av nÄgot abstrakt socialt nÀtverk. För att förenkla kommer vi att anta att alla vÄra anslutningar Àr riktade (som pÄ Instagram, inte Linkedin). Strukturen bör tillÄta dig att effektivt:

  • Svara pĂ„ frĂ„gan om anvĂ€ndare A lĂ€ser anvĂ€ndare B (lĂ€smönster)
  • TillĂ„t att lĂ€gga till/ta bort anslutningar vid prenumeration/avregistrering av anvĂ€ndare A frĂ„n anvĂ€ndare B (dataĂ€ndringsmall)

Naturligtvis finns det mÄnga alternativ för att lösa problemet. I en vanlig relationsdatabas skulle vi med största sannolikhet helt enkelt göra en tabell över relationer (eventuellt typiskt om vi till exempel behöver lagra en anvÀndargrupp: familj, arbete etc. som inkluderar denna "vÀn") och för att optimera Ätkomsthastighet skulle lÀgga till index/partitionering. Med största sannolikhet skulle finalbordet se ut ungefÀr sÄ hÀr:

USER_ID
vÀn_id

Vasya
Petya

Vasya
ĐžĐ»Ń

nedan, för tydlighetens skull och för bÀttre förstÄelse, kommer jag att ange namn istÀllet för ID

NÀr det gÀller HBase vet vi att:

  • effektiv sökning som inte resulterar i en fullstĂ€ndig tabellskanning Ă€r möjlig uteslutande med nyckel
    • i sjĂ€lva verket Ă€r det dĂ€rför en dĂ„lig idĂ© att skriva SQL-frĂ„gor till sĂ„dana databaser som Ă€r bekanta för mĂ„nga; tekniskt sett kan du naturligtvis skicka en SQL-frĂ„ga med Joins och annan logik till HBase frĂ„n samma Impala, men hur effektivt blir det...

DÀrför Àr vi tvungna att anvÀnda anvÀndar-ID som nyckel. Och min första tanke om Àmnet "var och hur man lagrar vÀnners ID-nummer?" kanske en idé att lagra dem i kolumner. Detta mest uppenbara och "naiva" alternativ kommer att se ut ungefÀr sÄ hÀr (lÄt oss kalla det Alternativ 1 (standard)för ytterligare referens):

RowKey
högtalare

Vasya
1: Petya
2: Olya
3: Dasha

Petya
1: Masha
2: Vasya

HÀr motsvarar varje linje en nÀtverksanvÀndare. Kolumnerna har namn: 1, 2, ... - enligt antalet vÀnner, och vÀnners ID lagras i kolumnerna. Det Àr viktigt att notera att varje rad kommer att ha olika antal kolumner. I exemplet i figuren ovan har en rad tre kolumner (1, 2 och 3), och den andra har bara tvÄ (1 och 2) - hÀr anvÀnde vi sjÀlva tvÄ HBase-egenskaper som relationsdatabaser inte har:

  • möjligheten att dynamiskt Ă€ndra sammansĂ€ttningen av kolumner (lĂ€gg till en vĂ€n -> lĂ€gg till en kolumn, ta bort en vĂ€n -> ta bort en kolumn)
  • olika rader kan ha olika kolumnsammansĂ€ttningar

LÄt oss kontrollera vÄr struktur för att uppfylla kraven för uppgiften:

  • LĂ€ser data: för att förstĂ„ om Vasya prenumererar pĂ„ Olya mĂ„ste vi subtrahera hela raden med nyckeln RowKey = "Vasya" och sortera igenom kolumnvĂ€rdena tills vi "trĂ€ffar" Olya i dem. Eller iterera genom vĂ€rdena för alla kolumner, "trĂ€ffa inte" Olya och returnera svaret False;
  • Redigera data: lĂ€gga till en vĂ€n: för en liknande uppgift mĂ„ste vi ocksĂ„ subtrahera hela raden anvĂ€nda tangenten RowKey = “Vasya” för att berĂ€kna det totala antalet vĂ€nner. Vi behöver det hĂ€r totala antalet vĂ€nner för att bestĂ€mma numret pĂ„ kolumnen dĂ€r vi behöver skriva ner ID:t för den nya vĂ€nnen.
  • Ändra data: radera en vĂ€n:
    • Behöver subtrahera hela raden med tangenten RowKey = “Vasya” och sortera igenom kolumnerna för att hitta den dĂ€r vĂ€nnen som ska raderas Ă€r registrerad;
    • DĂ€refter, efter att ha tagit bort en vĂ€n, mĂ„ste vi "skifta" all data till en kolumn för att inte fĂ„ "luckor" i deras numrering.

LÄt oss nu utvÀrdera hur produktiva dessa algoritmer, som vi kommer att behöva implementera pÄ sidan "villkorad applikation", kommer att vara, med O-symbolik. LÄt oss beteckna storleken pÄ vÄrt hypotetiska sociala nÀtverk som n. DÄ Àr det maximala antalet vÀnner en anvÀndare kan ha (n-1). Vi kan ytterligare försumma detta (-1) för vÄra syften, eftersom det inom ramen för anvÀndningen av O-symboler Àr oviktigt.

  • LĂ€ser data: det Ă€r nödvĂ€ndigt att subtrahera hela raden och iterera genom alla dess kolumner i grĂ€nsen. Detta innebĂ€r att den övre uppskattningen av kostnaderna kommer att vara ungefĂ€r O(n)
  • Redigera data: lĂ€gga till en vĂ€n: för att bestĂ€mma antalet vĂ€nner mĂ„ste du iterera genom alla kolumner i raden och sedan infoga en ny kolumn => O(n)
  • Ändra data: radera en vĂ€n:
    • Liknar att lĂ€gga till - du mĂ„ste gĂ„ igenom alla kolumner i grĂ€nsen => O(n)
    • Efter att ha tagit bort kolumnerna mĂ„ste vi "flytta" dem. Om du implementerar detta "head-on" behöver du i grĂ€nsen upp till (n-1) operationer. Men hĂ€r och vidare i den praktiska delen kommer vi att anvĂ€nda ett annat tillvĂ€gagĂ„ngssĂ€tt, som kommer att implementera ett "pseudoskifte" för ett fast antal operationer - det vill sĂ€ga konstant tid kommer att spenderas pĂ„ det, oavsett n. Denna konstanta tid (O(2) för att vara exakt) kan försummas jĂ€mfört med O(n). TillvĂ€gagĂ„ngssĂ€ttet illustreras i figuren nedan: vi kopierar helt enkelt data frĂ„n den "sista" kolumnen till den som vi vill ta bort data frĂ„n och tar sedan bort den sista kolumnen:
      Funktioner för att designa en datamodell för NoSQL

Totalt sett fick vi i alla scenarier en asymptotisk berÀkningskomplexitet av O(n).
Du har sÀkert redan mÀrkt att vi nÀstan alltid mÄste lÀsa hela raden frÄn databasen, och i tvÄ fall av tre, bara för att gÄ igenom alla kolumner och rÀkna ut det totala antalet vÀnner. DÀrför, som ett försök till optimering, kan du lÀgga till en kolumn "rÀkning", som lagrar det totala antalet vÀnner för varje nÀtverksanvÀndare. I det hÀr fallet kan vi inte lÀsa hela raden för att berÀkna det totala antalet vÀnner, utan bara lÀsa en "count" kolumn. Det viktigaste Àr att inte glömma att uppdatera "count" nÀr du manipulerar data. Den dÀr. vi blir bÀttre Alternativ 2 (antal):

RowKey
högtalare

Vasya
1: Petya
2: Olya
3: Dasha
antal: 3

Petya
1: Masha
2: Vasya

antal: 2

JÀmfört med det första alternativet:

  • LĂ€ser data: för att fĂ„ svar pĂ„ frĂ„gan "LĂ€ser Vasya Olya?" ingenting har förĂ€ndrats => O(n)
  • Redigera data: lĂ€gga till en vĂ€n: Vi har förenklat infogningen av en ny vĂ€n, eftersom vi nu inte behöver lĂ€sa hela raden och iterera över dess kolumner, utan kan bara fĂ„ vĂ€rdet pĂ„ kolumnen "rĂ€kna", etc. bestĂ€m omedelbart kolumnnumret för att infoga en ny vĂ€n. Detta leder till en minskning av berĂ€kningskomplexiteten till O(1)
  • Ändra data: radera en vĂ€n: NĂ€r vi tar bort en vĂ€n kan vi ocksĂ„ anvĂ€nda den hĂ€r kolumnen för att minska antalet I/O-operationer nĂ€r vi "skiftar" data en cell till vĂ€nster. Men behovet av att iterera genom kolumnerna för att hitta den som behöver raderas kvarstĂ„r, sĂ„ => ​​O(n)
  • Å andra sidan, nu nĂ€r vi uppdaterar data mĂ„ste vi uppdatera kolumnen "count" varje gĂ„ng, men detta tar konstant tid, vilket kan försummas inom ramen för O-symboler

I allmÀnhet verkar alternativ 2 lite mer optimalt, men det Àr mer som "evolution istÀllet för revolution." För att göra en "revolution" kommer vi att behöva Alternativ 3 (kol).
LÄt oss vÀnda allt "upp och ner": vi tilldelar kolumnnamn anvÀndar-ID! Vad som kommer att skrivas i sjÀlva kolumnen Àr inte lÀngre viktigt för oss, lÄt det vara siffran 1 (i allmÀnhet kan anvÀndbara saker lagras dÀr, till exempel gruppen "familj/vÀnner/etc."). Detta tillvÀgagÄngssÀtt kan överraska den oförberedda "lekmannen" som inte har nÄgon tidigare erfarenhet av att arbeta med NoSQL-databaser, men det Àr just detta tillvÀgagÄngssÀtt som gör att du kan anvÀnda potentialen hos HBase i denna uppgift mycket mer effektivt:

RowKey
högtalare

Vasya
Petya: 1
Olya: 1
Dasha: 1

Petya
Masha: 1
Vasya: 1

HÀr fÄr vi flera fördelar pÄ en gÄng. För att förstÄ dem, lÄt oss analysera den nya strukturen och uppskatta berÀkningskomplexiteten:

  • LĂ€ser data: för att svara pĂ„ frĂ„gan om Vasya prenumererar pĂ„ Olya rĂ€cker det att lĂ€sa en kolumn "Olya": om den finns dĂ€r Ă€r svaret sant, om inte - Falskt => O(1)
  • Redigera data: lĂ€gga till en vĂ€n: LĂ€gga till en vĂ€n: lĂ€gg bara till en ny kolumn "VĂ€n-ID" => O(1)
  • Ändra data: radera en vĂ€n: ta bara bort vĂ€n-ID-kolumnen => O(1)

Som du kan se Àr en betydande fördel med denna lagringsmodell att vi i alla scenarier vi behöver arbetar med endast en kolumn, och undviker att lÀsa hela raden frÄn databasen och dessutom rÀkna upp alla kolumner i denna rad. Vi kunde stanna dÀr, men...

Du kan bli förbryllad och gÄ lite lÀngre pÄ vÀgen för att optimera prestanda och minska I/O-operationer nÀr du kommer Ät databasen. Vad hÀnder om vi lagrade den fullstÀndiga relationsinformationen direkt i sjÀlva radnyckeln? Det vill sÀga, gör nyckeln sammansatt som userID.friendID? I det hÀr fallet behöver vi inte ens lÀsa radens kolumner alls (Alternativ 4 (rad)):

RowKey
högtalare

Vasya.Petya
Petya: 1

Vasya.Olya
Olya: 1

Vasya.Dasha
Dasha: 1

Petya.Masha
Masha: 1

Petya.Vasya
Vasya: 1

Uppenbarligen kommer bedömningen av alla datamanipulationsscenarier i en sÄdan struktur, som i den tidigare versionen, att vara O(1). Skillnaden med alternativ 3 kommer enbart att ligga i effektiviteten av I/O-operationer i databasen.

Jo, den sista "bÄgen". Det Àr lÀtt att se att i alternativ 4 kommer radnyckeln att ha en variabel lÀngd, vilket möjligen kan pÄverka prestandan (hÀr kommer vi ihÄg att HBase lagrar data som en uppsÀttning byte och rader i tabeller sorteras efter nyckel). Dessutom har vi en separator som kan behöva hanteras i vissa scenarier. För att eliminera detta inflytande kan du anvÀnda hash frÄn userID och friendID, och eftersom bÄda hasharna kommer att ha en konstant lÀngd kan du helt enkelt sammanfoga dem, utan en separator. DÄ kommer data i tabellen att se ut sÄ hÀr (Alternativ 5 (hash)):

RowKey
högtalare

dc084ef00e94aef49be885f9b01f51c01918fa783851db0dc1f72f83d33a5994
Petya: 1

dc084ef00e94aef49be885f9b01f51c0f06b7714b5ba522c3cf51328b66fe28a
Olya: 1

dc084ef00e94aef49be885f9b01f51c00d2c2e5d69df6b238754f650d56c896a
Dasha: 1

1918fa783851db0dc1f72f83d33a59949ee3309645bd2c0775899fca14f311e1
Masha: 1

1918fa783851db0dc1f72f83d33a5994dc084ef00e94aef49be885f9b01f51c0
Vasya: 1

Uppenbarligen kommer den algoritmiska komplexiteten att arbeta med en sÄdan struktur i de scenarier vi övervÀger att vara densamma som för alternativ 4 - det vill sÀga O(1).
Sammantaget, lÄt oss sammanfatta alla vÄra uppskattningar av berÀkningskomplexitet i en tabell:

LÀgger till en vÀn
Kollar pÄ en vÀn
Ta bort en vÀn

Alternativ 1 (standard)
O (n)
O (n)
O (n)

Alternativ 2 (antal)
O (1)
O (n)
O (n)

Alternativ 3 (kolumn)
O (1)
O (1)
O (1)

Alternativ 4 (rad)
O (1)
O (1)
O (1)

Alternativ 5 (hash)
O (1)
O (1)
O (1)

Som du kan se verkar alternativ 3-5 vara det mest föredragna och teoretiskt sÀkerstÀller exekveringen av alla nödvÀndiga datamanipulationsscenarier i konstant tid. I villkoren för vÄr uppgift finns det inget uttryckligt krav pÄ att skaffa en lista över alla anvÀndarens vÀnner, men i verkliga projektaktiviteter skulle det vara bra för oss, som bra analytiker, att "förutse" att en sÄdan uppgift kan uppstÄ och "sprid ett sugrör." DÀrför Àr mina sympatier pÄ sidan av alternativ 3. Men det Àr ganska troligt att i ett verkligt projekt kunde denna begÀran redan ha lösts pÄ andra sÀtt, dÀrför Àr det, utan en allmÀn vision av hela problemet, bÀttre att inte göra slutsatser.

Förberedelse av experimentet

Jag skulle vilja testa ovanstĂ„ende teoretiska argument i praktiken – detta var mĂ„let med idĂ©n som uppstod under lĂ„nghelgen. För att göra detta Ă€r det nödvĂ€ndigt att utvĂ€rdera driftshastigheten för vĂ„r "villkorliga applikation" i alla beskrivna scenarier för att anvĂ€nda databasen, sĂ„vĂ€l som ökningen av denna tid med ökande storlek pĂ„ det sociala nĂ€tverket (n). MĂ„lparametern som intresserar oss och som vi kommer att mĂ€ta under experimentet Ă€r den tid som den "villkorliga applikationen" spenderar för att utföra en "affĂ€rsoperation". Med "affĂ€rstransaktion" menar vi nĂ„got av följande:

  • LĂ€gger till en ny vĂ€n
  • Kontrollera om anvĂ€ndare A Ă€r en vĂ€n till anvĂ€ndare B
  • Tar bort en vĂ€n

Med hÀnsyn till de krav som beskrivs i det inledande uttalandet, framtrÀder verifieringsscenariot som följer:

  • Dataregistrering. Generera slumpmĂ€ssigt ett initialt nĂ€tverk av storlek n. För att komma nĂ€rmare den "verkliga vĂ€rlden" Ă€r antalet vĂ€nner varje anvĂ€ndare har ocksĂ„ en slumpmĂ€ssig variabel. MĂ€t den tid under vilken vĂ„r "villkorliga applikation" skriver all genererad data till HBase. Dela sedan den resulterande tiden med det totala antalet tillagda vĂ€nner - sĂ„ hĂ€r fĂ„r vi den genomsnittliga tiden för en "affĂ€rsverksamhet"
  • LĂ€ser data. Skapa en lista över "personligheter" för varje anvĂ€ndare som du behöver för att fĂ„ svar pĂ„ om anvĂ€ndaren prenumererar pĂ„ dem eller inte. LĂ€ngden pĂ„ listan = ungefĂ€r antalet av anvĂ€ndarens vĂ€nner, och för hĂ€lften av de markerade vĂ€nnerna ska svaret vara "Ja", och för den andra hĂ€lften - "Nej". Kontrollen utförs i sĂ„dan ordning att svaren "Ja" och "Nej" vĂ€xlar (det vill sĂ€ga i vartannat fall mĂ„ste vi gĂ„ igenom alla kolumner pĂ„ raden för alternativ 1 och 2). Den totala screeningstiden divideras sedan med antalet vĂ€nner som testats för att fĂ„ den genomsnittliga screeningtiden per försöksperson.
  • Radering av data. Ta bort alla vĂ€nner frĂ„n anvĂ€ndaren. Dessutom Ă€r raderingsordningen slumpmĂ€ssig (det vill sĂ€ga vi "blandar" den ursprungliga listan som anvĂ€ndes för att registrera data). Den totala kontrolltiden divideras sedan med antalet vĂ€nner som tagits bort för att fĂ„ den genomsnittliga tiden per check.

Scenarierna mÄste köras för vart och ett av de 5 datamodellalternativen och för olika storlekar av det sociala nÀtverket för att se hur tiden förÀndras nÀr den vÀxer. Inom ett n mÄste anslutningar i nÀtverket och listan över anvÀndare som ska kontrolleras naturligtvis vara lika för alla 5 alternativen.
För en bÀttre förstÄelse, nedan Àr ett exempel pÄ genererad data för n= 5. Den skrivna "generatorn" producerar tre ID-ordböcker som utdata:

  • den första Ă€r för insĂ€ttning
  • den andra Ă€r för kontroll
  • tredje – för radering

{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 ĐŽŃ€ŃƒĐ·Đ”Đč

Som du kan se Àr alla ID:n som Àr större Àn 10 000 i ordboken för kontroll just de som sÀkert kommer att ge svaret Falskt. Infoga, kontrollera och radera "vÀnner" utförs exakt i den ordning som anges i ordboken.

Experimentet utfördes pÄ en bÀrbar dator som körde Windows 10, dÀr HBase kördes i en Docker-behÄllare och Python med Jupyter Notebook kördes i den andra. Docker tilldelades 2 CPU-kÀrnor och 2 GB RAM. All logik, som emuleringen av den "villkorliga applikationen" och "pipingen" för att generera testdata och mÀtningstid, skrevs i Python. Biblioteket anvÀndes för att arbeta med HBase happybase, för att berÀkna hash (MD5) för alternativ 5 - hashlib

Med hĂ€nsyn till datorkraften hos en viss bĂ€rbar dator valdes en lansering för n = 10, 30, 
 experimentellt. 170 – nĂ€r den totala drifttiden för hela testcykeln (alla scenarier för alla alternativ för alla n) var till och med mer eller mindre rimlig och passade under en tebjudning (i genomsnitt 15 minuter).

HĂ€r Ă€r det nödvĂ€ndigt att göra en anmĂ€rkning att vi i detta experiment inte i första hand utvĂ€rderar absoluta prestationssiffror. Även en relativ jĂ€mförelse av olika tvĂ„ alternativ kanske inte Ă€r helt korrekt. Nu Ă€r vi intresserade av arten av förĂ€ndringen i tid beroende pĂ„ n, eftersom med hĂ€nsyn till ovanstĂ„ende konfiguration av "testbĂ€nken" Ă€r det mycket svĂ„rt att fĂ„ tidsuppskattningar "rensade" frĂ„n pĂ„verkan av slumpmĂ€ssiga och andra faktorer ( och en sĂ„dan uppgift var inte satt).

Experimentresultat

Det första testet Àr hur tiden för att fylla i vÀnlistan förÀndras. Resultatet finns i grafen nedan.
Funktioner för att designa en datamodell för NoSQL
Alternativ 3-5, som förvÀntat, visar en nÀstan konstant "affÀrstransaktion" tid, som inte beror pÄ tillvÀxten av nÀtverksstorleken och en oskiljbar skillnad i prestanda.
Alternativ 2 visar ocksÄ konstant, men nÄgot sÀmre prestanda, nÀstan exakt 2 gÄnger i förhÄllande till alternativ 3-5. Och detta kan inte annat Àn glÀdjas, eftersom det korrelerar med teori - i denna version Àr antalet I/O-operationer till/frÄn HBase exakt 2 gÄnger större. Detta kan fungera som ett indirekt bevis pÄ att vÄr testbÀnk i princip ger god noggrannhet.
Alternativ 1 visar sig ocksÄ, som vÀntat, vara det lÄngsammaste och visar en linjÀr ökning av tiden som lÀggs pÄ att lÀgga till varandra till nÀtverkets storlek.
LÄt oss nu titta pÄ resultatet av det andra testet.
Funktioner för att designa en datamodell för NoSQL
Alternativ 3-5 beter sig igen som förvÀntat - konstant tid, oberoende av nÀtverkets storlek. Alternativ 1 och 2 visar en linjÀr ökning av tiden nÀr nÀtverksstorleken ökar och liknande prestanda. Dessutom visar sig alternativ 2 vara lite lÄngsammare - uppenbarligen pÄ grund av behovet av att korrekturlÀsa och bearbeta den extra "count"-kolumnen, som blir mer mÀrkbar nÀr n vÀxer. Men jag kommer ÀndÄ att avstÄ frÄn att dra nÄgra slutsatser, eftersom noggrannheten i denna jÀmförelse Àr relativt lÄg. Dessutom Àndras dessa förhÄllanden (vilket alternativ, 1 eller 2, Àr snabbare) frÄn löpning till löpning (med bibehÄllen karaktÀren av beroende och "gÄ hals och nacke").

Tja, den sista grafen Àr resultatet av borttagningstestning.

Funktioner för att designa en datamodell för NoSQL

Återigen, inga överraskningar hĂ€r. Alternativ 3-5 utför borttagning i konstant tid.
Dessutom, intressant nog, alternativ 4 och 5, till skillnad frÄn de tidigare scenarierna, visar mÀrkbart nÄgot sÀmre prestanda Àn alternativ 3. Uppenbarligen Àr radraderingsoperationen dyrare Àn kolumnraderingsoperationen, vilket generellt Àr logiskt.

Alternativ 1 och 2 visar som förvÀntat en linjÀr ökning av tiden. Samtidigt Àr alternativ 2 konsekvent lÄngsammare Àn alternativ 1 - pÄ grund av den extra I/O-operationen för att "underhÄlla" rÀknekolumnen.

AllmÀnna slutsatser av experimentet:

  • Alternativ 3-5 visar större effektivitet nĂ€r de drar fördel av HBase; Dessutom skiljer sig deras prestanda i förhĂ„llande till varandra med en konstant och beror inte pĂ„ nĂ€tverkets storlek.
  • Skillnaden mellan alternativ 4 och 5 registrerades inte. Men det betyder inte att alternativ 5 inte ska anvĂ€ndas. Det Ă€r troligt att det experimentella scenariot som anvĂ€ndes, med hĂ€nsyn till testbĂ€nkens prestandaegenskaper, inte gjorde det möjligt att detektera det.
  • Typen av ökningen av den tid som krĂ€vs för att utföra "affĂ€rsverksamhet" med data bekrĂ€ftade i allmĂ€nhet de tidigare erhĂ„llna teoretiska berĂ€kningarna för alla alternativ.

Epilog

De grova experiment som utförs ska inte ses som absolut sanning. Det finns mÄnga faktorer som inte togs i beaktande och förvrÀngde resultaten (dessa fluktuationer Àr sÀrskilt synliga i graferna med en liten nÀtverksstorlek). Till exempel, hastigheten pÄ sparsamhet, som anvÀnds av happybase, volymen och metoden för att implementera logiken som jag skrev i Python (jag kan inte pÄstÄ att koden skrevs optimalt och effektivt anvÀnde alla komponenters möjligheter), kanske funktionerna i HBase-cache, bakgrundsaktivitet i Windows 10 pÄ min bÀrbara dator, etc. Generellt sett kan vi anta att alla teoretiska berÀkningar experimentellt har visat sin giltighet. Tja, eller Ätminstone var det inte möjligt att motbevisa dem med en sÄdan "head-on attack".

Sammanfattningsvis, rekommendationer till alla som precis har börjat designa datamodeller i HBase: abstrakt frÄn tidigare erfarenhet av att arbeta med relationsdatabaser och kom ihÄg "kommandona":

  • NĂ€r vi designar utgĂ„r vi frĂ„n uppgiften och mönstren för datamanipulation, och inte frĂ„n domĂ€nmodellen
  • Effektiv Ă„tkomst (utan full tabellskanning) – endast med nyckel
  • Denormalisering
  • Olika rader kan innehĂ„lla olika kolumner
  • Dynamisk sammansĂ€ttning av högtalare

KĂ€lla: will.com

LĂ€gg en kommentar