Sissejuhatus
âPeab olema kĂ”ikide jĂ”ududega jooksma, et lihtsalt kohapeal pĂŒsida,
ja et kuhugi jĂ”uda, tuleb joosta vĂ€hemalt kahekordselt kiiremini!â
(c) Alice Imedemaal
MĂ”ni aeg tagasi paluti mul pidada loeng meie ettevĂ”tte analĂŒĂŒtikutele teemal andmemudelite projekteerimine, sest pikaajaliste projektide (mĂ”nikord mitu aastat) jooksul unustame, mis IT-tehnoloogiate maailmas toimub. Meie ettevĂ”ttes (nĂŒĂŒd nii juhtunud) ei kasutata paljudes projektides NoSQL andmebaase (vĂ€hemalt seni), seega pidasin oma loengus pĂ”hitĂ€helepanu sellele, kasutades HBase'i nĂ€idet, ja pĂŒĂŒdsin suunata materjali esitust neile, kes pole nendega kunagi töötanud. Eriliselt tĂ”in vĂ€lja andmemudeli projekteerimise mĂ”ned eripĂ€rad nĂ€ite pĂ”hjal, mille lugesin paar aastat tagasi artiklist âIntroduction to HBase Schema Designâ autoriks Amandeep Khurana. Hiljuti, âigavusestâ, kĂŒsisin endalt, kuivĂ”rd teoreetilised jĂ€reldused vastavad praktikale? Tegelikult sĂŒndiski selle artikli idee. Arendaja, kes on juba pikka aega töötanud NoSQL-iga, ei pruugi siit midagi uut leida (ja seetĂ”ttu vĂ”ib kohe artikli keskelt edasi kerida). Aga
analĂŒĂŒtikutele, kes pole veel NoSQL-iga tihedalt töötanud, arvan, et see artikkel annab kasulikke baasteadmisi HBase'i andmemudelite projekteerimise eripĂ€radest.NĂ€ite analĂŒĂŒs
NĂ€ide analĂŒĂŒs
Minu arvates tuleks enne NoSQL andmebaaside kasutamise alustamist hoolikalt mĂ”elda ja kaaluda "pooli" ja "vastu". Sageli saab ĂŒlesande lahendada ka traditsiooniliste relationaalsete andmebaasidega. Seega on parem vĂ€ltida NoSQL-i kasutamist ilma oluliste pĂ”hjusteta. Kui otsus kasutada siiski NoSQL andmebaasi on tehtud, tuleb arvestada, et projekteerimispĂ”himĂ”tted on siin veidi erinevad. Eriti vĂ”ivad mĂ”ned neist olla harjumatud neile, kes on varem töötanud ainult relationaalsete andmebaasidega (minu vaatluste kohaselt). Nii et "relationaalses" maailmas lĂ€htume tavaliselt aineala mudeldamisest, ja alles siis, vajadusel, teeme mudeli denormaliseerimise. NoSQL-i puhul peame jĂ€rele mĂ”tlema eeldatavad stsenaariumid andmete töötlemiseks ja algselt andmeid denormaliseerima. Lisaks on veel mitmeid teisi erinevusi, millest allpool rÀÀgitakse.
Kaalume jĂ€rgmise "sĂŒnteetilise" ĂŒlesande, millega edaspidi töötame:
On vajalik kujundada struktuur kasutajate sÔprade nimekirja salvestamiseks mingisuguses abstraktses sotsiaalses vÔrgustikus. Lihtsuse huvides eeldame, et kÔik sidemed on suunatud (nagu Instagramis, mitte LinkedInis). Struktuur peaks vÔimaldama tÔhusalt:
- Vastata kĂŒsimusele, kas kasutaja A loeb kasutaja B postitusi (lugemise mall)
- Lubada lisada/rahuldada sidemed juhul, kui kasutaja A jÀlgib/kui kasutaja A loobub kasutaja B jÀlgimisest (andmete muutmise mall)
Muidugi on ĂŒlesande lahendamiseks palju vĂ”imalusi. Tavalises relationaalses andmebaasis teeksime tĂ”enĂ€oliselt lihtsalt sidemete tabeli (vĂ”imalik, et tĂŒpiseeritud, kui nĂ€iteks on vaja salvestada kasutajarĂŒhm: pere, töö jne, kuhu kuulub see "sĂ”ber"), ning juurdepÀÀsu kiirusel optimeerimiseks lisaksime indeksid/partitsioneerimise. TĂ”enĂ€oliselt nĂ€eks lĂ”pptabel vĂ€lja umbes selline:
user_id
friend_id
Vasya
Petja
Vasya
Olya
siin ja edaspidi kasutan selguse ja parema arusaamise nimel ID-de asemel nimed
HBase-i puhul teame, et:
- efektiivne otsing, mis ei vii full table scan'ini, on vÔimalik ainult vÔtme jÀrgi
- Just for this reason, writing familiar SQL queries for such databases is a bad idea; technically, of course, you can send an SQL query with Joins and other logic from Impala to HBase, but how effective it would be...
Therefore, we are forced to use the user ID as a key. The first thought on where and how to store friend IDs may be the idea of storing them in columns. This most obvious and 'naive' option would look something like this (let's call it Option 1 (default), so we can refer to it later):
RowKey
Columns
Vasya
1: Petya
2: Olya
3: Dasha
Petja
1: Masha
2: Vasya
Here, each row corresponds to one user of the network. The columns are named: 1, 2, ⊠â according to the number of friends, and the friend IDs are stored in the columns. It is important to note that each row will have a different number of columns. In the example above, one row has three columns (1, 2, and 3), while the second one has only two (1 and 2) â here we utilized two properties of HBase that relational databases do not have:
- the ability to dynamically change the composition of columns (add a friend -> add a column, remove a friend -> remove a column)
- different rows can have a different composition of columns
Let's check our structure against the task requirements:
- Andmete lugemine: in order to understand whether Vasya is subscribed to Olya, we need to read the entire row by the RowKey = 'Vasya' and iterate through the column values until we 'meet' Olya in them. Or iterate through the values of all columns, not 'meeting' Olya and return False;
- Data modification: adding a friend: for such a task, we will also need to read the entire row by RowKey = 'Vasya' to count the total number of his friends. This total number of friends is necessary for us to determine the column number where we need to record the ID of the new friend.
- Data modification: deleting a friend:
- It is necessary to read the entire row by RowKey = 'Vasya' and iterate through the columns to find the one where the friend to be deleted is recorded;
- Then, after deleting the friend, we need to 'shift' all the data in one column to avoid 'gaps' in their numbering.
Now letâs evaluate how efficient the algorithms we need to implement on the side of the 'conditional application' will be, using . MĂ€rgime meie hĂŒpoteetilise sotsiaalvĂ”rgu suuruseks n. Siis vĂ”ib ĂŒhe kasutaja maksimaalne sĂ”prade arv olla (n-1). Selle (-1) vĂ”ime meie eesmĂ€rkide jaoks edaspidi eirata, kuna O-sĂŒmboolika kontekstis ei oma see tĂ€htsust.
- Andmete lugemine: on vajalik lugeda vĂ€lja kogu rida ja uurida piiril kĂ”iki selle veerge. Seega on ligikaudne kulude ĂŒlemine hind umbes O(n)
- Data modification: adding a friend: sÔprade arvu mÀÀramiseks on vajalik uurida kÔiki rea veerge, pÀrast mida tuleb lisada uus veerg => O(n)
- Data modification: deleting a friend:
- Sarnaselt lisamisega - on vajalik piiril uurida kÔiki veerge => O(n)
- PĂ€rast veergude eemaldamist peame need "liigutama". Kui teostame seda "otseselt", siis on lĂ”ppkokkuvĂ”ttes vaja veel kuni (n-1) toimingut. Kuid me rakendame siin ja edaspidi praktikas teistsugust lĂ€henemist, mis teostab "pseudo-liikumise" fikseeritud hulk operatsioone â st selle jaoks kulutatakse konstantne aeg olenemata n-st. Selle konstantse aja (kui olla tĂ€pne, siis O(2)) vĂ”ib vĂ”rreldes O(n) ignoreerida. LĂ€henemist illustreeritakse alloleval joonisel: kopeerime lihtsalt andmed "viimase" veeru seest sinna, millest tuleb andmed kustutada, pĂ€rast mida eemaldame viimase veeru:

KokkuvĂ”ttes, kĂ”ikides stsenaariumides saavutame asĂŒmptootilise arvutuskompleksuse O(n).
TĂ”enĂ€oliselt olete juba mĂ€rganud, et peame peaaegu alati vĂ€lja lugema kogu rea tervikuna, kusjuures kahes kolmandikus juhtudest ainult selleks, et uurida kĂ”iki veerge ja arvutada sĂ”prade koguarv. SeetĂ”ttu optimeerimise katse raames saame lisada veeru "count", kus salvestada iga sotsiaalvĂ”rgu kasutaja ĂŒldine sĂ”prade arv. Sel juhul ei pea me kogu rida tervikuna sĂ”prade koguarvu arvutamiseks vĂ€lja lugema, vaid saame lugeda ainult veeru "count". Peamine on mitte unustada uuendada "count" andmete manipuleerimisel. Seega saame paremuse. Variant 2 (count):
RowKey
Columns
Vasya
1: Petya
2: Olya
3: Dasha
count: 3
Petja
1: Masha
2: Vasya
count: 2
Esimese variandi vÔrdluses:
- Andmete lugemine: kĂŒsimusele "Kas Vasja loeb Oljat?" pole midagi muutunud => O(n)
- Data modification: adding a friend: Oleme lihtsustanud uue sĂ”bra lisamist, sest nĂŒĂŒd ei pea me kogu rida lĂ€bi vaatama ja selle veerge jĂ€rjestama, vaid saame lihtsalt kĂ€tte veeru âcountâ vÀÀrtuse ja seega mÀÀrata uue sĂ”bra lisamise veeru numbri. See vĂ€hendab arvutuskohustuse keerukust O(1)-ni.
- Data modification: deleting a friend: SĂ”bra kustutamisel saame samuti kasutada seda veergu, et vĂ€hendada sisse- ja vĂ€ljundoperatsioonide arvu, kui ânihutameâ andmeid ĂŒhe lahtri vĂ”rra vasakule. Kuid veergude lĂ€bivaatamise vajadus kustutatava leidmiseks jÀÀb alles, seega => O(n)
- Teisest kĂŒljest, nĂŒĂŒd peame andmete vĂ€rskendamisel iga kord ka veeru âcountâ uuendama, kuid sellele kulub konstantne aeg, mida O-keerukuse kontekstis saab tĂ€helepanuta jĂ€tta.
KokkuvĂ”ttes tundub variant 2 natuke optimaalsem, kuid see on pigem âevolutsioon, mitte revolutsioonâ. âRevolutsiooniâ elluviimiseks vajame... Variant 3 (col).
KĂ€ime kĂ”ik âpeapealeâ: mÀÀrame veergu kasutaja identifikaatorina! Mida sellele veerule salvestatakse, ei ole meie jaoks enam oluline, olgu seal number 1 (ĂŒldiselt vĂ”ib seal hoida nĂ€iteks grupi âpere/sĂ”brad/jne.â). See lĂ€henemine vĂ”ib ĂŒllatada ettevalmistamata âtavalistâ inimest, kes pole varem NoSQL-andmebaasidega töötanud, kuid just see vĂ”imaldab HBase potentsiaali selles ĂŒlesandes palju tĂ”husamalt kasutada:
RowKey
Columns
Vasya
Petja: 1
Olia: 1
Dasha: 1
Petja
Masha: 1
Vasia: 1
Siin saame kohe mitu eelist. Et neid mĂ”ista, analĂŒĂŒsime uut struktuuri ja hindame arvutuskohustuse keerukust:
- Andmete lugemine: selleks, et vastata kĂŒsimusele, kas Vasia on Olias, piisab, kui lugeda veergu âOliaâ: kui see on olemas, siis vastus True, kui ei, siis False => O(1)
- Data modification: adding a friend: SĂ”bra lisamiseks: piisab lihtsalt uue veeru âSĂ”bra IDâ lisamisest => O(1)
- Data modification: deleting a friend: piisab lihtsalt veeru âSĂ”bra IDâ eemaldamisest => O(1)
Nagu nĂ€eme, on sellise sĂ€ilitamise mudeli oluliseks eeliseks see, et kĂ”igis vajalikes stsenaariumides opereerime ainult ĂŒhe veeruga, vĂ€ltides kogu rea lugemist andmebaasist ja veelgi enam, selle rea kĂ”igi veergude lĂ€bivaatamist. Sellega vĂ”iks lĂ”petada, kuidâŠ
Saame uurida ja minna veel veidi kaugemale jÔudluse optimeerimise ja andmebaasi sisendi-vÀljundi operatsioonide vÀhendamise teel. Mida kui hoida kogu teave seose kohta otse faili rea vÔtmises? St. teha vÔtmega koostisosast, nÀiteks userID.friendID? Sellisel juhul ei pea me mingil juhul isegi ridade veerge lugema.Variant 4 (rida)):
RowKey
Columns
Vassja.Petja
Petja: 1
Vassja.Olja
Olia: 1
Vassja.Dasha
Dasha: 1
Petja.Masha
Masha: 1
Petja.Vassja
Vasia: 1
Kliir, et sellise struktuuri andmetega kÔigi manipuleerimise stsenaariumide hindamine on samuti O(1), nagu eelmine variant. Erinevus kolmandast variandist on ainult sisendi-vÀljundi operatsioonide efektiivsuses andmebaasis.
Ja viimane "sildike". Kergesti vĂ”ib mĂ€rgata, et variandi 4 korral on meie ridade vĂ”tmel muutuv pikkus, mis vĂ”ib tĂ”enĂ€oliselt mĂ”jutada jĂ”udlust (siin tasub meeles pidada, et HBase salvestab andmeid baitide kogumina ja read tabelites on vĂ”tme jĂ€rgi sorteeritud). Samuti on meil eraldaja, mida mĂ”nedes stsenaariumides tuleb töödelda. Selle mĂ”ju kĂ”rvaldamiseks on vĂ”imalik kasutada userID ja friendID rĂ€simĂ€rke, ja kuna mĂ”lemal rĂ€sil on stabiilne pikkus, saab neid lihtsalt ĂŒhendada ilma eraldajata. Siis nĂ€eb andmestik tabelis vĂ€lja selline.Variant 5 (rĂ€simĂ€rk)):
RowKey
Columns
dc084ef00e94aef49be885f9b01f51c01918fa783851db0dc1f72f83d33a5994
Petja: 1
dc084ef00e94aef49be885f9b01f51c0f06b7714b5ba522c3cf51328b66fe28a
Olia: 1
dc084ef00e94aef49be885f9b01f51c00d2c2e5d69df6b238754f650d56c896a
Dasha: 1
1918fa783851db0dc1f72f83d33a59949ee3309645bd2c0775899fca14f311e1
Masha: 1
1918fa783851db0dc1f72f83d33a5994dc084ef00e94aef49be885f9b01f51c0
Vasia: 1
Ilmselt on algoritmilise keerukuse töö selle struktuuriga arvestatavate stsenaariumide puhul sama, mis variandi 4 puhul â st O(1).
KokkuvÔtteks, koondame kÔik meie arvutusi tabelisse:
SÔbra lisamine
SÔbra kontrollimine
SÔbra kustutamine
Option 1 (default)
O(n)
O(n)
O(n)
Variant 2 (loendus)
O(1)
O(n)
O(n)
Variant 3 (veerg)
O(1)
O(1)
O(1)
Variant 4 (rida)
O(1)
O(1)
O(1)
Variant 5 (rÀsimÀrk)
O(1)
O(1)
O(1)
Nagu nĂ€ha, on variandid 3-5 kĂ”ige eelistatumad ja teoreetiliselt tagavad kĂ”ik vajalikud andmete manipuleerimise stsenaariumid konstantse ajaga. Meie ĂŒlesande tingimustes ei ole otsest nĂ”uet, et saada kasutaja kĂ”igi sĂ”prade nimekirja, kuid reaalses projektitöös oleks meil kui headel analĂŒĂŒtikutel hea "ette nĂ€ha", et selline ĂŒlesanne vĂ”ib tekkida ja "alauku panna". SeetĂ”ttu on minu toetused variandi 3 poole. Kuid on tĂ€iesti vĂ”imalik, et reaalses projektis on see pĂ€ring juba lahendatud muude vahenditega, seega ilma ĂŒldise visioonita kogu ĂŒlesandest pole parem teha lĂ”plikke jĂ€reldusi.
Katseseadmete ettevalmistamine
Ălaltoodud teoreetilisi mĂ”tisklusi tahaksin praktikas kontrollida â see oli ka pika nĂ€dalavahetuse mĂ”tte eesmĂ€rk. Selleks on vajalik hinnata meie "teoreetilise rakenduse" töö kiirus kĂ”igis kirjeldatud andmebaasi kasutamise stsenaariumites, samuti selle aja kasvu koos sotsiaalvĂ”rgustiku (n) suuruse kasvuga. SihtnĂ€itaja, mis meid huvitab ja mida me eksperimendi kĂ€igus mÔÔdame, on aeg, mille "teoreetiline rakendus" kulutab ĂŒhe "Ă€ritegevuse" tĂ€itmiseks. "Ăritegevusena" mĂ”istame me ĂŒhte jĂ€rgmistest:
- Uue sÔbra lisamine
- Kontrollimine, kas kasutaja A on kasutaja B sÔber
- Ăhe sĂ”bra eemaldamine
Seega, arvestades algsetes tingimustes mÀrgitud nÔudeid, kujuneb kontrollimise stsenaarium jÀrgmiseks:
- Andmete salvestamine. Juhuslikult genereerida algne vĂ”rk suurusega n. Suuremaks lĂ€henemiseks "reaalsele maailmale" on iga kasutaja sĂ”prade arv samuti juhuslik suurus. MÔÔta aeg, mille jooksul meie "teoreetiline rakendus" salvestab HBase kĂ”ik genereeritud andmed. SeejĂ€rel jagame saadud aja kĂ”igi lisatud sĂ”prade koguarvuga â nii saame keskmise aja ĂŒhe "Ă€ritegevuse" kohta.
- Andmete lugemine. Iga kasutaja jaoks koostada nimekiri âisikutestâ, kelle kohta tuleb kontrollida, kas kasutaja on neile tellinud vĂ”i mitte. Nimekirja pikkus = umbes kasutaja sĂ”prade arv, kusjuures pooltel kontrollitavatest sĂ”pradest peab vastus olema âJahâ, ja teisel poolel â âEiâ. Kontrollimine toimub sellises jĂ€rjekorras, et âJahâ ja âEiâ vahelduvad (st igal teisel juhul peame kĂ”iki veerge rida 1 ja 2 kontrollima). Ăldine kontrollimise aeg jagada seejĂ€rel kontrollitavate sĂ”prade arvuga, et saada keskmine aeg ĂŒhe subjekti kontrollimiseks.
- Andmete eemaldamine. Eemaldada kasutajalt kĂ”ik sĂ”brad. Eemaldamise jĂ€rjekord peab olema juhuslik (st âsegameâ algse nimekirja, mida andmete salvestamiseks kasutati). Ăldine kontrollimise aeg jagada seejĂ€rel eemaldatavate sĂ”prade arvuga, et saada keskmine aeg ĂŒhe kontrolli jaoks.
Skeeme tuleb jooksutada iga 5 andmemudeli variandi ja erineva sotsiaalvĂ”rgu suuruse jaoks, et nĂ€ha, kuidas aeg muutub selle kasvades. Ăhe n sideme raames peavad vĂ”rgu ja kontrollitavate kasutajate nimekirjad olema loomulikult kĂ”ikide 5 variandi jaoks samad.
Selle paremiseks mĂ”istmiseks toon allpool nĂ€ite genereeritud andmetest n= 5. Kirjutatud âgeneraatorâ annab vĂ€ljundina kolm ID-sĂ”nastikku:
- esimene â sisestamiseks
- teine â kontrollimiseks
- kolmas â eemaldamiseks
{0: [1], 1: [4, 5, 3, 2, 1], 2: [1, 2], 3: [2, 4, 1, 5, 3], 4: [2, 1]} # kokku 15 sÔpra
{0: [1, 10800], 1: [5, 10800, 2, 10801, 4, 10802], 2: [1, 10800], 3: [3, 10800, 1, 10801, 5, 10802], 4: [2, 10800]} # kokku 18 kontrollitavat subjekt
{0: [1], 1: [1, 3, 2, 5, 4], 2: [1, 2], 3: [4, 1, 2, 3, 5], 4: [1, 2]} # kokku 15 sÔpra
Kuidas vĂ”ib mĂ€rgata, et kĂ”ik ID-d, mis ĂŒletavad 10 000 kontrollimise sĂ”nastikus â need on just need, mis kindlasti annavad vastuse False. SĂ”prade sisestamine, kontrollimine ja eemaldamine toimuvad tĂ€pselt sĂ”nastikus nĂ€idatud jĂ€rjekorras.
Eksperiment viidi lĂ€bi sĂŒlearvutis, mis töötas Windows 10 all, kus ĂŒhes Docker konteineris töötas HBase andmebaas ja teises â Python Jupyter Notebookiga. Dockerile eraldati 2 CPU tuuma ja 2 GB RAM-i. Kogu loogika, nii âtinglikku rakendustâ simuleerimine kui ka testandmete genereerimise ja aja mÔÔtmise âĂŒmberringiâ kirjutati Pythonis. HBaseâi töötlemiseks kasutati teeki , et hashide (MD5) arvutamiseks variandi 5 â hashlib
Arvesse vĂ”ttes konkreetse sĂŒlearvuti arvutusvĂ”imsust, valiti katse kĂ€ivitamine eksperimentaalselt n = 10, 30, ⊠170 â kui kogu testimise tsĂŒkli (kĂ”ik stsenaariumid kĂ”igi variantide jaoks kĂ”ikide n-de jaoks) koguaeg oli veel enam-vĂ€hem mĂ”istlik ja mahtus ĂŒhe teejoomise ajal (keskmiselt 15 minutit).
Siin on vajalik teha mÀrkida, et selles eksperimendis hindame esmajoones mitte absoluutseid jÔudluse numbreid. Isegi kahe erineva variandi suhteline vÔrdlemine ei pruugi olla tÀiesti korrektne. Praegu huvitab meid eelkÔige aja muutumise iseloom sÔltuvalt n-st, kuna eespool nimetatud 'katse seade' konfigureerimisega on ajahinnangute saamine, mis on 'puhastatud' juhuslike ja muude tegurite mÔjust, vÀga keeruline (ja sellist eesmÀrki pole seadnud).
Eksperimenti tulemus
Esimene test â kuidas muutub aeg, mis kulub sĂ”prade nimekirja tĂ€itmiseks. Tulemus â alloleval graafikul.

Variandid 3-5 nÀitavad oodatult peaaegu konstantset 'Àritegevuse' aega, mis ei sÔltu vÔrgu suuruse kasvust ega ole eristuv erinevus jÔudluses.
Variant 2 nĂ€itab samuti konstanti, kuid veidi halvemad tulemused, olles praktiliselt 2 korda madalam variantide 3-5 suhtes. See ei saa mitte rÔÔmustada, sest see vastab teooriale â selles variandis on operatsioonide arv HBase'i sisse-/vĂ€ljal 2 korda suurem. See vĂ”ib olla kaudne tĂ”end, et meie testimisseade annab pĂ”himĂ”tteliselt head tĂ€psust.
Variant 1 osutub samuti oodatult kĂ”ige aeglasemaks ja nĂ€itab vĂ”rgu suuruse osas lineaarset aja kasvu, mis kulub ĂŒhe sĂ”bra lisamiseks.
Vaatame nĂŒĂŒd teise testi tulemusi.

Variandid 3-5 kĂ€ituvad taas oodatult â konstantne aeg, mis ei sĂ”ltu vĂ”rgu suurusest. Variandid 1 ja 2 nĂ€itavad lineaarset aelae tĂ”usu vĂ”rgu suuruse suurenedes ja sarnast jĂ”udlust. Lisaks on variant 2 pisut aeglasem â ilmselt seetĂ”ttu, et tuleb lugeda ja töödelda tĂ€iendavat veergu "count", mis suurenedes n muutub silmatorkavamaks. Kuid ma siiski hoidun igasugustest jĂ€reldustest, kuna selle vĂ”rgu tĂ€psus on suhteliselt madal. Lisaks muutusid need suhted (milline variant, 1 vĂ”i 2, on kiirem) kĂ€ivituse kaupa (samas sĂ€ilitades sĂ”ltuvuse iseloomu ja "minnes ninapidi koos").
Ja viimane diagramm â testimise tulemused kustutamise kohta.

Siin pole jĂ€lle ĂŒllatusi. Variandid 3-5 teostavad kustutamise konstantse aja jooksul.
Mis on huvitav, variandid 4 ja 5, erinevalt eelmistest stsenaariumitest, nĂ€itavad veidi halvemana jĂ”udlust vĂ”rreldes variant 3-ga. Ilmselt on rea kustutamine kulukam kui veeru kustutamine, mis on ĂŒldiselt mĂ”istlik.
Variandid 1 ja 2 nĂ€itavad ootuspĂ€raselt lineaarset aja kasvu. Samuti on variant 2 pidevalt aeglasem variant 1-st â tĂ€nu tĂ€iendavale sisend-vĂ€ljund operatsioonile veeru count "hooldamiseks".
Katse ĂŒldised jĂ€reldused:
- Variandid 3-5 nĂ€itavad suuremat efektiivsust, kuna nad kasutavad HBase eeliseid; nende jĂ”udlus erineb ĂŒksteisest konstantse arvu vĂ”rra ja ei sĂ”ltu vĂ”rgu suurusest.
- Variantide 4 ja 5 vahel ei olnud erinevust fikseeritud. Kuid see ei tĂ€henda, et variant 5 ei ole kasutamiseks sobiv. On ĂŒsna tĂ”enĂ€oline, et katse stsenaarium koos testseina tehniliste omadustega ei vĂ”imaldanud selle tuvastamist.
- Aja kasvamise iseloom, mis on vajalik andmete "Ă€riprotsesside" teostamiseks, kinnitas ĂŒldiselt varasemate teoreetiliste jĂ€relduste kehtivust kĂ”igi variantide puhul.
Epilog
Tehtud karmid eksperimendid ei tohiks olla absoluutse tĂ”ena. On palju tegureid, mis ei olnud arvesse vĂ”etud ning mis moonutasid tulemusi (eriti hĂ€sti on need kĂ”ikumised nĂ€htavad graafikutes vĂ€ikese vĂ”rgu suuruse puhul). NĂ€iteks thrift'i töökiirus, mida kasutab happybase, loogika maht ja rakendamise viis, mis mul oli kirjutatud Pythonis (ei julge vĂ€ita, et kood oli optimaalselt kirjutatud ja kasutas kĂ”igi komponentide vĂ”imalusi efektiivselt), vĂ”imalikud HBase'i puhverdamise eripĂ€rad, Windows 10 taustategevus minu sĂŒlearvutis jne. Ăldiselt vĂ”ib öelda, et kĂ”ik teoreetilised jĂ€reldused on eksperimentaalselt oma pĂ€devust nĂ€idanud. VĂ”i vĂ€hemalt ei olnud vĂ”imalik neid sel viisil âotsesel rĂŒnnakulâ ĂŒmber lĂŒkata.
KokkuvĂ”ttes â soovitused kĂ”igile, kes alles alustavad andmemudelite kavandamist HBase'is: abstraheerige end varasemast kogemusest relatsiooniliste andmebaasidega ja pidage meeles âkĂŒmmet kĂ€skuâ:
- Kavandades alustame ĂŒlesandest ja andmete manipulatsiooni mustritest, mitte ainevaldkonna mudelist.
- TĂ”hus juurdepÀÀs (ilma tĂ€ieliku tabeli skannimiseta) â ainult vĂ”tme kaudu.
- Denormaliseerimine.
- Erinevad read vÔivad sisaldada erinevaid veerge.
- DĂŒnaamiline veergude koosseis.
Allikas: habr.com

