NoSQL-i andmemudeli kujundamise omadused

Sissejuhatus

NoSQL-i andmemudeli kujundamise omadused "Sa pead jooksma nii kiiresti kui vĂ”imalik, et paigal pĂŒsida,"
ja kuhugi jÔudmiseks pead jooksma vÀhemalt kaks korda kiiremini!
(c) Alice Imedemaal

MĂ”ni aeg tagasi paluti mul loengut pidada analĂŒĂŒtikud Meie ettevĂ”tte fookuses on andmemudelite disain, kuna me töötame projektide kallal pikka aega (mĂ”nikord mitu aastat) ja unustame IT-maailmas toimuva. Meie ettevĂ”ttes, nagu ikka, paljud projektid ei kasuta NoSQL-i andmebaase (vĂ€hemalt mitte veel), seega keskendusin oma loengus just neile, tuues nĂ€itena HBase'i, ja pĂŒĂŒdsin esitlust kohandada neile, kes pole nendega kunagi töötanud. TĂ€psemalt illustreerisin andmemudelite disaini mĂ”ningaid eripĂ€rasid nĂ€ite abil, mida lugesin mitu aastat tagasi. Amandeep Khurana artiklis „Sissejuhatus HB ase skeemi kujundamisse”NĂ€idete analĂŒĂŒsimisel vĂ”rdlesin sama probleemi mitut lahendust, et pĂ”hiideed paremini publikule edastada.

Hiljuti "igavusest" mĂ”tlesin (pikad maikuu pĂŒhad karantiini ajal olid sellele kĂŒsimusele eriti soodsad): kui hĂ€sti teoreetilised kontseptsioonid praktikasse ĂŒlekantavad? Nii sĂŒndiski selle artikli idee. Arendaja, kes on NoSQL-iga juba mĂ”nda aega töötanud, ei pruugi sellest midagi uut saada (ja seetĂ”ttu vĂ”ib pool artiklist vahele jĂ€tta). Aga analĂŒĂŒtikudNeile, kes pole veel NoSQL-iga pĂ”hjalikult töötanud, arvan, et see on kasulik HBase'i andmemudelite kujundamise eripĂ€rade pĂ”hiteadmiste saamiseks.

NĂ€ite analĂŒĂŒs

Minu arvates tuleb enne NoSQL-i andmebaaside kasutamist hoolikalt mĂ”elda ja plusse ja miinuseid kaaluda. Sageli saab ĂŒlesande lahendada traditsiooniliste relatsioon-andmebaasihaldussĂŒsteemide abil. SeetĂ”ttu on kĂ”ige parem vĂ€ltida NoSQL-i kasutamist ilma mĂ”juva pĂ”hjuseta. Kui otsustate NoSQL-i andmebaasi kasutada, pidage meeles, et disainimeetodid on mĂ”nevĂ”rra erinevad. MĂ”ned neist vĂ”ivad olla eriti harjumatud neile, kes on varem töötanud ainult relatsioon-andmebaasihaldussĂŒsteemidega (minu kogemuse pĂ”hjal). NĂ€iteks relatsioonmaailmas alustame tavaliselt valdkonna modelleerimisega ja seejĂ€rel vajadusel mudeli denormaliseerime. NoSQL-is aga me... peab viivitamatult arvestama andmetega töötamise eeldatavate stsenaariumidega ja esialgu denormaliseerige andmed. On ka mitmeid muid erinevusi, mida kĂ€sitletakse allpool.

Vaatleme jĂ€rgmist „sĂŒnteetilist” probleemi, millega me jĂ€tkame tööd:

Peame kujundama teatud abstraktse sotsiaalvĂ”rgustiku kasutajate sĂ”bralisti salvestusstruktuuri. Lihtsuse mĂ”ttes eeldame, et kĂ”ik ĂŒhendused on suunatud (nagu Instagramis, mitte LinkedInis). Struktuur peaks vĂ”imaldama jĂ€rgmise tĂ”husat rakendamist:

  • Vasta kĂŒsimusele, kas kasutaja A loeb kasutajat B (lugemismuster)
  • Luba ĂŒhenduste lisamine/eemaldamine, kui kasutaja A jĂ€lgib/lĂ”petab kasutaja B jĂ€lgimise (andmete muutmise mall)

Loomulikult on sellele probleemile palju vĂ”imalikke lahendusi. Traditsioonilises relatsioonandmebaasis looksime tĂ”enĂ€oliselt lihtsalt relatsioonitabeli (vĂ”ib-olla tĂŒĂŒbitud, kui nĂ€iteks peame salvestama kasutajarĂŒhmi – perekond, töö jne –, mis sisaldavad antud "sĂ”pra") ja lisaksime indeksid/partitsioonid, et optimeerida juurdepÀÀsu kiirust. Saadud tabel nĂ€eks tĂ”enĂ€oliselt vĂ€lja umbes selline:

USER_ID
sÔbra_id

Vasya
Petja

Vasya
ĐžĐ»Ń

Selguse ja parema arusaamise huvides kasutan edaspidi ID-de asemel nimesid.

HBase'i puhul teame, et:

  • TĂ”hus otsing ilma tĂ€ieliku tabeli skaneerimiseta on vĂ”imalik ainult vĂ”tme abil
    • SeepĂ€rast on sellistele andmebaasidele tuttavate SQL-pĂ€ringute kirjutamine halb mĂ”te; tehniliselt saab muidugi Impalast HBase'i saata SQL-pĂ€ringu koos liitumiste ja muu loogikaga, aga kui tĂ”hus see on?

SeetÔttu oleme sunnitud kasutajatunnust vÔtmena kasutama. Esimene mÔte teemal "kuhu ja kuidas sÔprade ID-sid salvestada?" vÔib olla idee salvestada need veergudesse. See kÔige ilmsem ja "naiivsem" variant nÀeks vÀlja umbes selline (nimetagem seda Valik 1 (vaikimisi), edaspidiseks kasutamiseks):

ReavÔti
Esinejad

Vasya
1: Petja
2: Olja
3: DaĆĄa

Petja
1: MaĆĄa
2: Vasja

Siin vastab iga rida ĂŒhele vĂ”rgukasutajale. Veerud on nimetatud 1, 2, ... – sĂ”prade arvu pĂ”hjal – ja salvestavad sĂ”prade ID-sid. Oluline on mĂ€rkida, et igal real on erinev arv veerge. Ülaltoodud nĂ€ites on ĂŒhel real kolm veergu (1, 2 ja 3), teisel aga ainult kaks (1 ja 2). Siin oleme Ă€ra kasutanud kahte HBase'i omadust, mida relatsioonandmebaasidel pole:

  • vĂ”imalus veergude koostist dĂŒnaamiliselt muuta (lisa sĂ”ber -> lisa veerg, eemalda sĂ”ber -> eemalda veerg)
  • erinevatel ridadel vĂ”ivad olla erinevad veergude koostised

Kontrollime oma struktuuri vastavust ĂŒlesande nĂ”uetele:

  • Andmete lugemine: selleks, et mĂ”ista, kas Vasya on Olya tellija, peame lahutama kogu rida RowKey = "Vasya" abil ja itereerime veeruvÀÀrtusi, kuni me "kohtume" Olyaga. VĂ”i itereerime lĂ€bi kĂ”ik veeruvÀÀrtused, "ei kohtu" Olyaga ja tagastame vÀÀrtuse False;
  • Andmete muutmine: sĂ”bra lisaminesarnase probleemi puhul peame ka lahutama kogu rida RowKey = "Vasya" abil loendada oma sĂ”prade koguarvu. Me vajame seda sĂ”prade koguarvu, et mÀÀrata veeru number, kuhu uue sĂ”bra ID salvestada.
  • Andmete muutmine: sĂ”bra kustutamine:
    • On vaja lahutada kogu rida vĂ”tme RowKey = “Vasya” abil ja leidke veerud, kuhu kustutatav sĂ”ber on salvestatud;
    • JĂ€rgmisena, pĂ€rast sĂ”bra kustutamist, peame kĂ”ik andmed ĂŒhte veergu "nihutama", et nende numeratsioonis ei tekiks "lĂŒnki".

Hindame nĂŒĂŒd, kui produktiivsed need algoritmid, mida peame "tingimusliku rakenduse" poolel rakendama, on. O-sĂŒmboolikaTĂ€histagem hĂŒpoteetilise sotsiaalvĂ”rgustiku suurust n-ga. Siis on ĂŒhe kasutaja maksimaalne sĂ”prade arv (n-1). Me vĂ”ime seda (-1) siinkohal ignoreerida, kuna see pole O-sĂŒmbolite kasutamise kontekstis oluline.

  • Andmete lugemine: on vaja lahutada kogu rida ja piirvÀÀrtuse korral itereerida lĂ€bi kĂ”igi selle veergude. See tĂ€hendab, et ĂŒlemine kuluhinnang on ligikaudu O(n)
  • Andmete muutmine: sĂ”bra lisamineSĂ”prade arvu mÀÀramiseks tuleb lĂ€bi kĂ€ia kĂ”ik rea veerud ja seejĂ€rel lisada uus veerg => O(n)
  • Andmete muutmine: sĂ”bra kustutamine:
    • Sarnaselt liitmisega on vaja itereerida ĂŒle kĂ”igi veergude piirvÀÀrtuses => O(n)
    • PĂ€rast veergude kustutamist peame need "nihutama". Lihtne lĂ€henemine nĂ”uaks kuni (n-1) operatsiooni rohkem. Siin ja kogu praktilises osas kasutame aga teistsugust lĂ€henemist, mis rakendab "pseudo-nihet" fikseeritud arvu operatsioonidega – see tĂ€hendab, et see vĂ”tab konstantse aja olenemata n-st. See konstantne aeg (tĂ€psemalt O(2)) on tĂŒhine vĂ”rreldes O(n)-ga. LĂ€henemisviisi illustreerib allolev joonis: me lihtsalt kopeerime andmed "viimasest" veerust sellesse, kust andmed tuleb kustutada, ja seejĂ€rel kustutame viimase veeru:
      NoSQL-i andmemudeli kujundamise omadused

Kokku saime kĂ”igis stsenaariumides asĂŒmptootilise arvutusliku keerukuse O(n).
TÔenÀoliselt olete juba mÀrganud, et peaaegu alati peame andmebaasist lugema terve rea ja kahel juhul kolmest ainult selleks, et kÔik veerud lÀbi kÀia ja sÔprade koguarvu arvutada. SeetÔttu saame optimeerimise eesmÀrgil lisada veeru "count", et salvestada iga vÔrgukasutaja sÔprade koguarv. Sellisel juhul ei pea me sÔprade koguarvu arvutamiseks lugema tervet rida, vaid lugema ainult veergu "count". Peaasi on meeles pidada, et andmetega manipuleerides vÀrskendataks veergu "count". Nii saame parema tulemuse. 2. variant (loendus):

ReavÔti
Esinejad

Vasya
1: Petja
2: Olja
3: DaĆĄa
arv: 3

Petja
1: MaĆĄa
2: Vasja

arv: 2

VÔrreldes esimese variandiga:

  • Andmete lugemine: kĂŒsimusele "Kas Vasja loeb Oljat?" vastuse saamiseks pole midagi muutunud => O(n)
  • Andmete muutmine: sĂ”bra lisamineOleme uue sĂ”bra lisamise lihtsustanud, kuna me ei pea enam kogu rida lugema ja selle veerge lĂ€bi kĂ€ima. NĂŒĂŒd saame hankida ainult veeru "count" vÀÀrtuse ja seega kohe mÀÀrata veeru numbri uue sĂ”bra lisamiseks. See vĂ€hendab arvutuslikku keerukust O(1)-ni.
  • Andmete muutmine: sĂ”bra kustutamineSĂ”bra kustutamisel saame seda veergu kasutada ka I/O-operatsioonide arvu vĂ€hendamiseks andmete ĂŒhe lahtri vĂ”rra vasakule nihutamisel. Kustutatava leidmiseks peame aga ikkagi veerud lĂ€bi kĂ€ima, seega => ​​O(n)
  • Teisest kĂŒljest peame andmete vĂ€rskendamisel iga kord vĂ€rskendama ka veergu „count“, kuid see vĂ”tab konstantse aja, mida saab O-sĂŒmbolite raamistikus eirata.

Üldiselt tundub variant 2 veidi optimaalsem, aga see meenutab pigem "evolutsiooni revolutsiooni asemel". "Revolutsiooni" saavutamiseks on meil vaja Variant 3 (veerg).
Pöörame kĂ”ik pea peale: mÀÀrame ametisse veeru nimi kasutaja ID! See, mis veerus kirjas on, pole meie jaoks ĂŒlioluline; kasutame lihtsalt numbrit 1 (ĂŒldiselt vĂ”iks sinna salvestada kasulikke asju, nĂ€iteks rĂŒhmana nagu "perekond/sĂ”brad/jne"). See lĂ€henemine vĂ”ib ĂŒllatada algajat "vĂ”hikut", kellel pole eelnevat kogemust NoSQL-i andmebaasidega, kuid see vĂ”imaldab meil HBase'i potentsiaali selle ĂŒlesande jaoks palju tĂ”husamalt Ă€ra kasutada:

ReavÔti
Esinejad

Vasya
Petja: 1
Olja: 1
DaĆĄa: 1

Petja
MaĆĄa: 1
Vasja: 1

See pakub mitmeid eeliseid. Nende mĂ”istmiseks analĂŒĂŒsime uut struktuuri ja hindame selle arvutuslikku keerukust:

  • Andmete lugemineKĂŒsimusele, kas Vasja on Olja tellija, vastamiseks piisab ĂŒhest veerust „Olja“: kui on, siis on vastus tĂ”ene, kui ei ole – vale => O(1)
  • Andmete muutmine: sĂ”bra lisamineSĂ”bra lisamine: lisa lihtsalt uus veerg "SĂ”bra ID" => O(1)
  • Andmete muutmine: sĂ”bra kustutamine: eemalda lihtsalt veerg "SĂ”bra ID" => O(1)

Nagu nĂ€eme, on selle salvestusmudeli oluline eelis see, et kĂ”igis vajalikes stsenaariumides opereerime ainult ĂŒhe veeruga, vĂ€ltides seega kogu rea lugemist andmebaasist, rÀÀkimata selle rea kĂ”igi veergude lĂ€bikĂ€imisest. Me vĂ”iksime seal peatuda, aga...

Saame olla veidi loomingulisemad ja minna veidi kaugemale jÔudluse optimeerimisel ja sisend-/vÀljundoperatsioonide vÀhendamisel andmebaasile juurdepÀÀsul. Mis siis, kui salvestaksime kogu seoseteabe otse reavÔtmesse endasse? See tÀhendab, et muudaksime vÔtme liitvÔtmeks, nÀiteks kasutajaID.sÔbraID? Sellisel juhul ei peaks me isegi reaveergusid lugema (Variant 4 (rida)):

ReavÔti
Esinejad

Vasja. Petja
Petja: 1

Vasja.Olja
Olja: 1

Vasja.DaĆĄa
DaĆĄa: 1

Petja. MaĆĄa
MaĆĄa: 1

Petja. Vasja
Vasja: 1

Ilmselgelt on sellise struktuuri kÔigi andmetöötlusstsenaariumide hindamine O(1), nagu ka eelmises valikus. Erinevus 3. valikuga seisneb ainult andmebaasi I/O-operatsioonide efektiivsuses.

Ja lÔpuks viimane nipp. On lihtne nÀha, et 4. variandi puhul on meie reavÔtmel muutuv pikkus, mis vÔib potentsiaalselt jÔudlust mÔjutada (pidage meeles, et HBase salvestab andmeid baitide komplektina ja tabeli read sorteeritakse vÔtme jÀrgi). Lisaks on meil eraldaja, mida vÔib mÔnel juhul vaja minna töödelda. Selle mÔju vÀltimiseks saame kasutada kasutajaID ja sÔbraID rÀsi. Kuna mÔlemal rÀsil on konstantne pikkus, saame need lihtsalt eraldajata liita. SeejÀrel nÀevad tabeli andmed vÀlja sellised:Variant 5 (rÀsi)):

ReavÔti
Esinejad

dc084ef00e94aef49be885f9b01f51c01918fa783851db0dc1f72f83d33a5994
Petja: 1

dc084ef00e94aef49be885f9b01f51c0f06b7714b5ba522c3cf51328b66fe28a
Olja: 1

dc084ef00e94aef49be885f9b01f51c00d2c2e5d69df6b238754f650d56c896a
DaĆĄa: 1

1918fa783851db0dc1f72f83d33a59949ee3309645bd2c0775899fca14f311e1
MaĆĄa: 1

1918fa783851db0dc1f72f83d33a5994dc084ef00e94aef49be885f9b01f51c0
Vasja: 1

Ilmselgelt on sellise struktuuriga töötamise algoritmiline keerukus meie vaadeldavate stsenaariumide kohaselt sama, mis 4. variandi puhul – st O(1).
VĂ”tame siis kĂ”ik meie arvutusliku keerukuse hinnangud ĂŒhte tabelisse kokku:

SÔbra lisamine
SÔbra kontrollimine
SÔbra eemaldamine

Valik 1 (vaikimisi)
O (n)
O (n)
O (n)

2. variant (loendus)
O (1)
O (n)
O (n)

3. variant (veerg)
O (1)
O (1)
O (1)

Variant 4 (rida)
O (1)
O (1)
O (1)

Variant 5 (rÀsi)
O (1)
O (1)
O (1)

Nagu nĂ€ete, tunduvad valikud 3-5 eelistatumad ja tagavad teoreetiliselt kĂ”igi vajalike andmetöötlusstsenaariumide tĂ€itmise konstantse aja jooksul. Meie probleemipĂŒstitus ei nĂ”ua otseselt kĂ”igi kasutaja sĂ”prade nimekirja hankimist, kuid reaalsetes projektides oleks meil heade analĂŒĂŒtikutena soovitatav sellist probleemi ette nĂ€ha ja ettevaatusabinĂ”usid vĂ”tta. SeetĂ”ttu pooldan ma 3. valikut. Siiski on tĂ€iesti vĂ”imalik, et reaalses projektis on see taotlus juba muul viisil lahendatud, seega ilma kogu probleemi ĂŒldise mĂ”istmiseta on parem mitte teha lĂ”plikke jĂ€reldusi.

Katse ettevalmistamine

Sooviksin ĂŒlaltoodud teoreetilist arutluskĂ€iku praktikas testida – see oligi pika nĂ€dalavahetuse jooksul tekkinud idee eesmĂ€rk. Selleks peame hindama oma „hĂŒpoteetilise rakenduse” toimivust kĂ”igis kirjeldatud andmebaasi kasutusstsenaariumides ja seda, kuidas see aeg suureneb koos sotsiaalvĂ”rgustiku suurusega (n). Sihtparameeter, mis meid huvitab ja mida me katse kĂ€igus mÔÔdame, on aeg, mis kulub „hĂŒpoteetilisel rakendusel” ĂŒhe „Àrioperatsiooni” sooritamiseks. „Ärioperatsiooni” all peame silmas ĂŒhte jĂ€rgmistest:

  • Ühe uue sĂ”bra lisamine
  • Kontrollitakse, kas kasutaja A on kasutaja B sĂ”ber
  • Ühe sĂ”bra eemaldamine

Seega, vÔttes arvesse esialgses avalduses esitatud nÔudeid, on verifitseerimisstsenaarium jÀrgmine:

  • Andmete salvestamineGenereerige juhuslikult algne vĂ”rk suurusega n. "PĂ€rismaailma" paremaks lĂ€hendamiseks on iga kasutaja sĂ”prade arv samuti juhuslik. MÔÔtke aeg, mis kulub meie "nĂ€idisrakendusel" kĂ”igi genereeritud andmete HBase'i kirjutamiseks. SeejĂ€rel jagage see aeg lisatud sĂ”prade koguarvuga – see annab meile ĂŒhe "Ă€ritoimingu" keskmise aja.
  • Andmete lugemineIga kasutaja jaoks loo loend "isiksustest", mille puhul pead kindlaks tegema, kas kasutaja jĂ€lgib neid vĂ”i mitte. Loendi pikkus on ligikaudu vĂ”rdne kasutaja sĂ”prade arvuga, kusjuures vastus on poolte kontrollitud sĂ”prade puhul "Jah" ja teise poole puhul "Ei". Kontrollid tehakse nii, et vastused "Jah" ja "Ei" vahelduvad (see tĂ€hendab, et igal muul juhul peame valikute 1 ja 2 jaoks lĂ€bi kĂ€ima kĂ”ik rea veerud). SeejĂ€rel jagatakse kontrolli koguaeg kontrollitud sĂ”prade arvuga, et saada keskmine aeg kontrolli kohta.
  • Andmete kustutamineKustuta kĂ”ik kasutaja sĂ”brad. Kustutamise jĂ€rjekord on juhuslik (st me segame andmete salvestamiseks kasutatud algset nimekirja). SeejĂ€rel jagatakse kinnituse koguaeg kustutatavate sĂ”prade arvuga, et saada keskmine kinnituse aeg.

Stsenaariume tuleb kĂ€ivitada iga viie andmemudeli variandi ja erineva suurusega sotsiaalvĂ”rgustike puhul, et nĂ€ha, kuidas aeg vĂ”rgustiku kasvades muutub. Ühe n-mudeli piires peavad vĂ”rguĂŒhendused ja testitavate kasutajate loend loomulikult olema kĂ”igi viie variandi puhul samad.
Paremaks mÔistmiseks on allpool nÀide genereeritud andmetest n = 5 jaoks. Minu kirjutatud "generaator" loob kolm ID-sÔnastikku:

  • esimene on sisestamiseks
  • teine ​​on kontrollimiseks
  • kolmas on eemaldamiseks

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

Nagu nĂ€ete, on kĂ”ik sĂ”nastikus kontrollimiseks mĂ”eldud ID-d, mille number on suurem kui 10 000, just need, mis kindlasti tagastavad vÀÀrtuse „vÀÀr“. SĂ”prade sisestamine, kontrollimine ja kustutamine toimub sĂ”nastikus mÀÀratud jĂ€rjekorras.

Katse viidi lĂ€bi sĂŒlearvutil, millel oli Windows 10, kus HBase töötas ĂŒhes Dockeri konteineris ja Python koos Jupyter Notebookiga töötas teises. Dockerile eraldati 2 protsessori tuuma ja 2 GB muutmĂ€lu. Kogu loogika, sealhulgas "mannekeenirakenduse" simulatsioon ja testandmete genereerimise ning aja mÔÔtmise raamistik, kirjutati Pythonis. Teek Ă”nnelik baas, 5. valiku rĂ€si (MD5) arvutamiseks - hashlib

VĂ”ttes arvesse konkreetse sĂŒlearvuti arvutusvĂ”imsust, valiti eksperimentaalselt kĂ€ivitusaeg ajavahemike n = 10, 30, ... 170 jaoks – kui kogu testimistsĂŒkli (kĂ”ik stsenaariumid kĂ”igi valikute jaoks kĂ”igi n jaoks) kogukestusaeg oli veel enam-vĂ€hem mĂ”istlik ja mahtus ĂŒhe teepidu ajale (keskmiselt 15 minutit).

Oluline on siinkohal mĂ€rkida, et selles katses ei hinda me peamiselt absoluutseid jĂ”udlusnĂ€itajaid. Isegi kahe erineva variandi suhteline vĂ”rdlus ei pruugi olla tĂ€iesti tĂ€pne. Praegu huvitab meid aja muutuse olemus n funktsioonina, kuna ĂŒlalmainitud testplatvormi konfiguratsiooni arvestades on juhuslike ja muude tegurite mĂ”just "puhastatud" ajahinnangute saamine vĂ€ga keeruline (ja see polnudki eesmĂ€rk).

Katse tulemus

Esimeses testis uuriti, kuidas muutub sÔbralisti tÀitmiseks kuluv aeg. Tulemused on nÀidatud alloleval graafikul.
NoSQL-i andmemudeli kujundamise omadused
Valikud 3–5 nĂ€itavad ootuspĂ€raselt praktiliselt konstantset "Ă€ritegevuse" aega, mis ei sĂ”ltu vĂ”rgu suuruse kasvust, ning mĂ€rgatavat jĂ”udluse erinevust.
Variant 2 nĂ€itab samuti konstantset, kuid veidi halvemat jĂ”udlust, peaaegu tĂ€pselt kaks korda rohkem kui variantidel 3-5. See on julgustav, kuna see on kooskĂ”las teooriaga – selles variandis on HBase'i ja HBase'i suunatavate I/O-operatsioonide arv tĂ€pselt kaks korda suurem. See vĂ”ib olla kaudne tĂ”end selle kohta, et meie testi seadistus tagab ĂŒldiselt korraliku tĂ€psuse.
Nagu oodatud, osutub ka 1. variant kĂ”ige aeglasemaks ning nĂ€itab ĂŒhe sĂ”bra lisamiseks kuluva aja lineaarset suurenemist, olenevalt vĂ”rgu suurusest.
Vaatame nĂŒĂŒd teise testi tulemusi.
NoSQL-i andmemudeli kujundamise omadused
Variandid 3-5 kĂ€ituvad taas ootuspĂ€raselt – konstantse aja jooksul, olenemata vĂ”rgu suurusest. Variandid 1 ja 2 nĂ€itavad lineaarset aja kasvu koos vĂ”rgu suurusega ja sarnast jĂ”udlust. Variant 2 on aga veidi aeglasem – ilmselt vajaduse tĂ”ttu analĂŒĂŒsida ja töödelda tĂ€iendavat "loendus" veergu, mis muutub mĂ€rgatavamaks n suurenedes. Siiski jĂ€tan hinnangu andmata, kuna selle vĂ”rdluse tĂ€psus on suhteliselt madal. Lisaks varieerusid korrelatsioonid (milline variant, 1 vĂ”i 2, on kiirem) tsĂŒkliti (sĂ€ilitades samal ajal jĂ€rjepideva mustri ja olles kak-kaelus).

Noh, viimane graafik on eemaldamistesti tulemus.

NoSQL-i andmemudeli kujundamise omadused

JĂ€llegi pole siin mingeid ĂŒllatusi. Valikud 3-5 teostavad kustutamise konstantse aja jooksul.
Huvitaval kombel nĂ€itavad valikud 4 ja 5, erinevalt eelmistest stsenaariumidest, mĂ€rgatavalt veidi halvemat jĂ”udlust kui valik 3. Ilmselt on rea kustutamise toiming kallim kui veeru kustutamise toiming, mis on ĂŒldiselt loogiline.

Nagu oodatud, nÀitavad valikud 1 ja 2 lineaarset ajakasvu. Valik 2 on aga pidevalt aeglasem kui variant 1, kuna loendusveeru haldamiseks on vaja tÀiendavat sisend-/vÀljundoperatsiooni.

Katse ĂŒldised jĂ€reldused:

  • Valikud 3–5 nĂ€itavad suuremat efektiivsust, kuna need kasutavad Ă€ra HBase'i; aga nende jĂ”udlus erineb ĂŒksteisest konstantse vÀÀrtuse vĂ”rra ega sĂ”ltu vĂ”rgu suurusest.
  • Variantide 4 ja 5 vahel ei tĂ€heldatud erinevust. See aga ei tĂ€henda, et varianti 5 ei tohiks kasutada. Arvestades katsealuse jĂ”udlusomadusi, takistas kasutatud eksperimentaalne stsenaarium selle tuvastamist.
  • Andmetega „Àritoimingute” teostamiseks kuluva aja pikenemise iseloom kinnitas ĂŒldiselt kĂ”igi valikute puhul varem saadud teoreetilisi arvutusi.

Epiloog

Neid ligikaudseid katseid ei tohiks absoluutse tĂ”ena vĂ”tta. On palju tegureid, mida ei vĂ”etud arvesse ja mis moonutasid tulemusi (need kĂ”ikumised on eriti nĂ€htavad vĂ€ikeste vĂ”rkude suuruste graafikutel). NĂ€iteks sÀÀstlikkuse kiirus, mida happybase kasutab, Pythonis kirjutatud loogika maht ja rakendusmeetod (ma ei saa vĂ€ita, et kood kirjutati optimaalselt vĂ”i et kĂ”iki komponente kasutati tĂ”husalt), vĂ”imalik, et HBase'i vahemĂ€llu salvestamise funktsioonid ja taustategevus. Windows 10 Minu sĂŒlearvutil jne. Üldiselt vĂ”ib jĂ€reldada, et kĂ”ik teoreetilised eeldused on eksperimentaalselt osutunud kehtivaks. VĂ”i vĂ€hemalt ei olnud vĂ”imalik neid sellise otsekohese rĂŒnnakuga ĂŒmber lĂŒkata.

KokkuvÔtteks on siin mÔned soovitused kÔigile, kes alles alustavad HBase'is andmemudelite kujundamist: pange kÔrvale oma varasem kogemus relatsioonandmebaasidega ja pidage meeles "kÀske":

  • Projekteerimisel lĂ€htume ĂŒlesande ja andmetega manipuleerimise mustritest, mitte domeenimudelist.
  • TĂ”hus juurdepÀÀs (ilma tĂ€ieliku tabeli skaneerimiseta) – ainult vĂ”tmega
  • Denormaliseerimine
  • Erinevad read vĂ”ivad sisaldada erinevaid veerge.
  • Veergude dĂŒnaamiline koostis

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster