Sissejuhatus
"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. 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. TĂ€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:

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 , 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.

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.

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.

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

