Tere pĂ€evast! Mina olen Danil Lipovoy, meie meeskond Sbertechi's on hakanud HBase'i kasutama operatiivandmete salvestamiseks. Selle uurimise kĂ€igus on kogunenud kogemusi, mida soovisime sĂŒsteematisteerida ja kirjeldada (loodame, et sellest on paljudele abi). KĂ”ik allpool toodud eksperimendid viidi lĂ€bi versioonidega HBase 1.2.0-cdh5.14.2 ja 2.0.0-cdh6.0.0-beta1.
- Ăldine arhitektuur
- Andmete salvestamine HBASE-s
- Andmete lugemine HBASE-st
- Andmete vahemÀlu
- Andmete partii töötlemine MultiGet/MultiPut
- Tabelite jagamise strateegia piirkondadeks (sharding)
- Veakindlus, kompakteerimine ja andmete kohalikkus
- Seaded ja jÔudlus
- Koormuse testimine
- JĂ€reldused
1. Ăldine arhitektuur

Varu Master kuulab aktiivse sÔlme ZooKeeper'is heartbeat'i ja kaotamise korral vÔtab Master'i funktsioonid enda kanda.
2. Andmete salvestamine HBASE-s
Alustame kĂ”ige lihtsama juhtumiga â vĂ”tme-vÀÀrtuse objekti salvestamine tabelisse kasutades put(rowkey). Klient peab esmalt kindlaks tegema, kus asub juure piirkonna server (Root Region Server â RRS), mis salvestab tabelit hbase:meta. Selle teabe saab ta ZooKeeper'ist. SeejĂ€rel pöördub ta RRS-i poole ja loeb tabelit hbase:meta, millest ta tĂ”mbab vĂ€lja teabe, milline RegionServer (RS) vastutab antud vĂ”tme rowkey seotud andmete salvestamise eest huvipakkuvas tabelis. JĂ€tkuva kasutamise eesmĂ€rgil vahemĂ€lu tabelit kliendile ja seega lĂ€hevad edasised pĂ€ringud kiiremini, otseselt RS-i.
SeejĂ€rel kirjutab RS, saades pĂ€ringu, esmalt selle WriteAheadLog'i (WAL), mis on vajalik taastumiseks, kui midagi lĂ€heb valesti. SeejĂ€rel salvestab ta andmed MemStore'i. See on mĂ€lu puhver, mis sisaldab antud piirkonna sorteeritud vĂ”tmete kogumit. Tabel vĂ”ib jagada piirkondadeks (partitsioonideks), millest igaĂŒks sisaldab ĂŒksteisega mitte ĂŒhtivat vĂ”tmete kogumit. See vĂ”imaldab piirkondi erinevates serverites paigutades saavutada kĂ”rgemat jĂ”udlust. Siiski, hoolimata selle vĂ€ite ilmsusest, nĂ€eme hiljem, et see ei toimi kĂ”ikides olukordades.
PÀrast salvestuse paigutamist MemStore'i saab klient vastuse, et salvestus on edukalt tehtud. Samas hoitakse seda tegelikult ainult puhvers ja jÔuab kettale alles pÀrast teatud aja möödumist vÔi selle tÀitumisel uutega.

Tehtava "Delete" kĂ€igus ei toimu fĂŒĂŒsilist andmete kustutamist. Need mĂ€rgitakse lihtsalt kui kustutatud ja tegelik hĂ€vitamine toimub major compact funktsiooni kĂ€ivitamise hetkel, millest on rohkem juttu punktis 7.
HFile formaadis failid kogunevad HDFS-s ja aeg-ajalt kÀivitatakse minor compact protsess, mis lihtsalt liidab vÀikesed failid suuremateks, midagi kustutamata. Aja jooksul muutub see probleemiks, mis avaldub ainult andmete lugemisel (sellest rÀÀgime natuke hiljem).
Lisaks ĂŒlaltoodud andmete laadimise protsessile on olemas palju tĂ”husam protseduur, mille keskmes on brĂ€ndi kĂ”ige tugevam kĂŒlg â BulkLoad. See seisneb selles, et me ise vormistame HFiles ja paneme need kettale, mis vĂ”imaldab suurepĂ€rast skaleerimist ning saavutada ĂŒsna korralikke kiirusnumbreid. Sisuliselt on piiranguks mitte HBase, vaid riistvara vĂ”imalused. Allpool on toodud laadimistulemused klastrilt, mis koosneb 16 RegionServerist ja 16 NodeManager YARN-ist (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 niidid), HBase versioon 1.2.0-cdh5.14.2.

Siit on nÀha, et partitsioonide (regioonide) arvu ning Spark'i eksekutorite suurendamisega saame laadimiskiiruse suurenemise. Samuti sÔltub kiirus kirjutamise mahust. Suured plokid annavad tÔusu MB/sek mÔÔtmisel, vÀiksemad aga sisse kirjutatud kirjade arvu ajas, kui kÔik muud tingimused on vÔrdsed.
Samuti saab kĂ€ivitada laadimise kahes tabelis samaaegselt ning saavutada kiiruskahekordistumine. Allpool on nĂ€htav, et 10 KB plokkide kirjutamine kahte tabelisse toimub kiirusel umbes 600 Mb/sek igasse (kokku 1275 Mb/sek), mis vastab ĂŒhte tabelisse kirjutamise kiirusel 623 MB/sek (vt punkt 11 ĂŒlevale).

Kuid teine kĂ€ivitamine 50 KB kirjete kirjutamisega nĂ€itab, et laadimiskiirus tĂ”useb juba minimaalsetes mÀÀrades, mis viitab sellele, et lĂ€hme piirvÀÀrtuste suunas. Pealegi tuleb arvestada, et HBASE-le endale ei tekkida praktiliselt mingit koormust; kĂ”ik, mis sellest nĂ”utakse, on esmalt andmete andmine hbase:meta-st ja seejĂ€rel HFiles'i lisamisel BlockCache'i tĂŒhjendamine ning MemStore'i buffri salvestamine kettale, kui see pole tĂŒhi.
3. Andmete lugemine HBASE-st
Kui eeldada, et kogu teave hbase:meta on juba kliendil olemas (vt p.2), siis lÀheb pÀring kohe sellele RS-ile, kus vajalik vÔti asub. Esiteks toimub otsing MemCache'is. SÔltumata sellest, kas seal on andmeid vÔi mitte, toimub otsing ka BlockCache'i puhveres ja vajadusel HFiles'is. Kui andmed leiti failist, salvestatakse need BlockCache'i ja jÀrgmise pÀringu korral tagastatakse need kiiremini. Otsing HFiles'is toimub suhteliselt kiiresti, kasutades Bloomi filtrit, mis tÀhendab, et lugedes vÀikest andmehulka, mÀÀrab ta kohe, kas see fail sisaldab vajalikku vÔtit ja kui ei, siis liikuda jÀrgmise juurde.

Saades andmed neist kolmest allikast, vormib RS vastuse. Eriti vĂ”ib ta edastada mitu leitud objekti versiooni, kui klient kĂŒsis versioonisust.
4. Andmete vahemÀlu
MemStore'i ja BlockCache'i puhvritĂ€iendus moodustab kuni 80% eraldatud on-heap mĂ€lu RS jaoks (ĂŒlejÀÀnud on reserveeritud RS teenuste jaoks). Kui tĂŒĂŒpiline kasutusreĆŸiim on selline, et protsessid kirjutavad ja loevad kohe neid samu andmeid, siis on mĂ”istlik vĂ€hendada BlockCache'i ja suurendada MemStore'i, kuna kirjutades ei pÀÀse andmed lugemiseks puhvri, seega toimub BlockCache'i kasutamine harvem. BlockCache puhver koosneb kahest osast: LruBlockCache (alati on-heap) ja BucketCache (tavaliselt off-heap vĂ”i SSD-l). BucketCache'i tuleks kasutada, kui on vĂ€ga palju lugemisepĂ€ringuid ja need ei mahu LruBlockCache'i, mis toob kaasa aktiivse Garbage Collectori töö. Samas ei tasu oodata radikaalset jĂ”udluse kasvu lugemisvahemĂ€lu kasutamiselt, kuid sellest rÀÀgime veel p. 8.

BlockCache on kogu RS-i kaupa, samas on iga tabeli jaoks oma MemStore (iga Column Family jaoks ĂŒks).
Kuidas teoorias, kui andmed kirjutatakse vahemĂ€llu, siis need ei jĂ”ua sinna ja tĂ”epoolest, sellised parameetrid CACHE_DATA_ON_WRITE tabeli jaoks ja "Cache DATA on Write" RS-i jaoks on seatud vÀÀrtusele false. Kuid praktikast, kui kirjutada andmed MemStore'i, seejĂ€rel kustutada see kettale (puhastades selguse mĂ”ttes), seejĂ€rel eemaldada saadud fail, siis tehes get pĂ€ringu saame andmed edukalt. Lisaks, isegi kui tĂ€ielikult blokeerida BlockCache ja tĂ€ita tabel uute andmetega, siis saavutades MemStore'i vĂ€ljalĂŒlitamise kettale, kustutades need ja kĂŒsides teises sessioonis, need ikka kuskilt saadakse. Seega HBase hoiab endas mitte ainult andmeid, vaid ka salapĂ€raseid mĂ”istatusi.
hbase(main):001:0> create 'ns:magic', 'cf'
Loodud tabel ns:magic
Kestis 1.1533 sekundit
hbase(main):002:0> put 'ns:magic', 'key1', 'cf:c', 'try_to_delete_me'
Kestis 0.2610 sekundit
hbase(main):003:0> flush 'ns:magic'
Kestis 0.6161 sekundit
hdfs dfs -mv /data/hbase/data/ns/magic/* /tmp/trash
hbase(main):002:0> get 'ns:magic', 'key1'
cf:c timestamp=1534440690218, value=try_to_delete_me
Parameeter âCache DATA on Readâ on seadistatud vale. Kui teil on ideid, siis teretulnud arutama seda kommentaarides.
5. Andmete paketiline töötlemine MultiGet/MultiPut
Ăksikute pĂ€ringute (Get/Put/Delete) töötlemine on ĂŒsna kallis operatsioon, seetĂ”ttu tuleks neid vĂ”imalusel ĂŒhendatud Listi vĂ”i Listide alla koondada, mis toob kaasa mĂ€rkimisvÀÀrse jĂ”udluse kasvu. Eriti kehtib see kirjutamise operatsioonide jaoks, kuid lugemise puhul on jĂ€rgmine peidetud karikas. Alloleval graafikul on nĂ€idatud 50 000 mĂ€rkme lugemise aega MemStores. Lugemine toimus ĂŒhes olles ja horisontaalsel teljel on nĂ€idatud pĂ€ringu vĂ”tmete arv. Siit on nĂ€ha, et kui vĂ”tmete arv ĂŒhes pĂ€ringus suureneb kuni tuhandeni, siis tĂ€itmisaja kestus langeb, st kiirus suureneb. Kuid vaike- MSLABi reĆŸiimi aktiveerimisel hakkab pĂ€rast seda piiri jĂ”udluse jĂ€rsult langema, kusjuures andmete maht kirje sisse mĂ”jutab kestust.

Testid viidi lÀbi virtuaalkeskkonnas, 8 tuuma, HBase versioon 2.0.0-cdh6.0.0-beta1.
MSLAB reĆŸiim on loodud vĂ€hendama heap'i fragmentatsiooni, mis tuleneb uue ja vana pĂ”lvkonna andmete segunemisest. Probleemi lahendusena andmed MSLAB reĆŸiimi aktiveerimisel paigutatakse suhteliselt vĂ€ikestesse rakkudesse (chunk) ja töödeldakse portsjonitena. Tulemuseks on see, et kui kĂŒsitud andmepaketi maht ĂŒletab reserveeritud suuruse, siis jĂ”udlus langeb jĂ€rsult. Teiselt poolt ei ole antud reĆŸiimi vĂ€ljalĂŒlitamine soovitatav, kuna see vĂ”ib pĂ”hjustada peatuseid GC tĂ”ttu intensiivse andmetöötluse hetkedel. Hea lahendus on suurendada rakuga mahte, kui kirjutamist teostatakse put'i kaudu samal ajal lugemisega. Tuleb mĂ€rkida, et see probleem ei esine, kui pĂ€rast kirjutamist antakse kĂ€sk flush, mis kirjutab MemStore'i kettale, vĂ”i kui laadimist teostatakse BulkLoad abil. Allolevas tabelis on nĂ€idatud, et pĂ€ringud MemStore'ist suuremate (ja sama arvu) andmete puhul pĂ”hjustavad aeglustumist. Kuid suurendades chunksize'i, toob oleme töötluse aega normaali juurde.

Lisaks chunksize'i suurendamisele aitab andmete jagamine regioonide kaupa, st tabelite jagamine. See vÀhendab igale regioonile jÔudvate pÀringute arvu ning kui need on lahtris, siis jÀÀb vastus hea.
6. Tabelite jagamise strateegia regioonide vahel (jagamine)
Kuna HBase on vĂ”tme-vÀÀrtuse salvestus ja jaotamine toimub vĂ”tme jĂ€rgi, on vĂ€ga oluline jagada andmed ĂŒhtlaselt kĂ”ikide regioonide vahel. NĂ€iteks teeb kolme ossa jagamine, et andmed jagatakse kolme regiooniks:

MÔnikord toob see kaasa jÀrsu aeglustumise, kui hiljem laaditavad andmed on nÀiteks long vÀÀrtustes, mis enamikul juhtudel algavad sama numbriga, nÀiteks:
1000001
1000002
âŠ
1100003
Kuna vĂ”tmed salvestatakse baitide massiivina, hakkavad kĂ”ik nad samamoodi ja kuuluvad ĂŒhte regioon #1, mis salvestab selle vĂ”tme vahemiku. On mitmeid jagamise strateegiaid:
HexStringSplit â Muunib vĂ”tme stringiks, kasutades kuuesĂŒsteemi kodeeringut vahemikus "00000000" => "FFFFFFFF", tĂ€iendades vasakule nullidega.
UniformSplit â Muunib vĂ”tme baitide massiiviks, kasutades kuuesĂŒsteemi kodeeringut vahemikus "00" => "FF", tĂ€iendades paremale nullidega.
Lisaks saab mÀÀrata igasuguseid vahemikke vĂ”i vĂ”tmete kogumeid jagamiseks ja seadistada automaatse jagamise. Siiski on ĂŒks lihtsamaid ja tĂ”husamaid lĂ€henemisviise UniformSplit ja hash'i kleepimise kasutamine, nĂ€iteks vanema paari baitidest, kus vĂ”tme jooksutatakse lĂ€bi CRC32(rowkey) funktsiooni ja tĂ”elise rowkey:
hash + rowkey
Siis jagatakse kĂ”ik andmed ĂŒhtlaselt regioonide vahel. Lugemise kĂ€igus lihtsalt visatakse esimesed kaks baitit Ă€ra ja jÀÀb algne vĂ”ti. Samuti kontrollib RS regioonis andmete ja vĂ”tmete arvu ning ĂŒletades piirangud jagab selle automaatselt osadeks.
7. TÔrketaluvus ja andmete lokaalsus
Kuna iga vĂ”tme komplekti haldab ainult ĂŒks piirkond, on RS-i vĂ€ljalangemise vĂ”i vĂ€ljalaskmise probleemide lahenduseks kĂ”igi vajalike andmete salvestamine HDFS-i. Kui RS laguneb, tuvastab master selle ZooKeeperis sĂŒdamepeatu kaudu. Siis mÀÀrab ta hooldatava piirkonna teisele RS-ile ja kuna HFiles on salvestatud jaotatud failisĂŒsteemi, loeb uus omanik need vĂ€lja ja jĂ€tkab andmete teenindamist. Kuid kuna osa andmetest vĂ”ib olla MemStores ja ei ole jĂ”udnud HFilesse, kasutatakse operatsioonide ajaloo taastamiseks WAL-i, mis on samuti salvestatud HDFS-i. PĂ€rast muudatuste pealekandmist suudab RS vastata pĂ€ringutele, kuid ĂŒmberpaiknemine pĂ”hjustab, et osa andmeid ja neid teenindavad protsessid paiknevad erinevates sĂ”lmedes, st lokaalsus vĂ€heneb.
Probleemi lahenduseks on major compaction â see protseduur liigutab faile nendele sĂ”lmedele, mis nende eest vastutavad (seal, kus nende piirkonnad asuvad), mistĂ”ttu suureneb selle protseduuri kĂ€igus oluliselt vĂ”rgu- ja kettakoormus. Siiski kiireneb hiljem juurdepÀÀs andmetele. Lisaks viib major_compaction kĂ”ik HFiles kokku ĂŒheks failiks piirkonna piiresse ning puhastab andmed vastavalt tabeli seadistustele. NĂ€iteks saab mÀÀrata objekti versioonide arvu, mida tuleb sĂ€ilitada, vĂ”i eluaega, pĂ€rast mille möödumist objekt fĂŒĂŒsiliselt kustutatakse.
See protseduur vĂ”ib avaldada vĂ€ga positiivset mĂ”ju HBase tööle. Alloleval pildil on nĂ€htav, kuidas jĂ”udlus on degradeerunud aktiivse andmete kirjutamise tĂ”ttu. NĂ€ha on, kuidas ĂŒhte tabelisse kirjutas 40 voogu ja 40 voogu luges andmeid samaaegselt. Kirjutamisvood vormivad ĂŒha rohkem ja rohkem HFiles, mida teised vood vĂ€lja loevad. Tulemuseks on, et ĂŒha rohkem andmeid tuleb mĂ€lust eemaldada ja lĂ”puks hakkab töötama GC, mis praktiliselt halvab kogu töö. Major compactioni kĂ€ivitamine viis tekkinud ummikute puhastamiseni ja jĂ”udluse taastamiseni.

Test viidi lÀbi 3 DataNode'i ja 4 RS-i (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 lÔime). HBase versioon 1.2.0-cdh5.14.2
Tuleb mĂ€rkida, et major compactioni kĂ€ivitamine toimus âelavasâ tabelis, kuhu kirjutati ja loeti andmeid aktiivselt. Internetis kohtas vĂ€idet, et see vĂ”ib tuua kaasa ebaĂ”ige vastuse andmete lugemisel. Kontrollimiseks kĂ€ivitati protsess, mis genereeris uusi andmeid ja kirjutas need tabelisse, millele jĂ€rgnes kohene lugemine ja kontrollimine, kas saadud vÀÀrtus vastab sellele, mis oli kirjutatud. Selle protsessi kĂ€igus kĂ€ivitati umbes 200 korda major compaction ja ĂŒhtegi viga ei registreeritud. VĂ”ib-olla probleem avaldub harva ja ainult kĂ”rge koormuse ajal, seega on ohutum siiski planeeritult peatada kirjutamis- ja lugemisprotsessid ning teostada puhastus, vĂ€ltides selliseid GC kukkumisi.
Samuti ei mÔjuta major compaction MemStore'i olekut, selle kettale kirjutamiseks ja kompaktimiseks tuleb kasutada flush'i (connection.getAdmin().flush(TableName.valueOf(tblName))).
8. Seaded ja jÔudlus
Nagu juba mainitud, saavutab HBase kĂ”ige suurema edusammuga seal, kus tal ei ole vaja midagi teha, BulkLoad'i teostamisel. Siiski kehtib see enamikus sĂŒsteemides ja inimeste jaoks. Kuid see tööriist sobib pigem suurte andmepakettide massiliseks paigutamiseks, samas kui kui protsess nĂ”uab paljude samaaegsete lugemis- ja kirjutamisĂŒlesannete tĂ€itmist, kasutatakse ĂŒlaltoodud Get ja Put kĂ€ske. Optimaalsete parameetrite mÀÀramiseks viidi lĂ€bi katseid erinevate tabelite parameetrite ja seadistuste kombinatsioonidega:
- KÀivitati 10 voogu korraga 3 korda jÀrjest (nimetame seda voogude blokkiks).
- Kogu voogude blokeeri tööaeg keskmistati ja see oli blokeerimise töö tulem.
- KÔik vood töötasid sama tabeliga.
- Iga voogude bloki kÀivitamise eel viidi lÀbi major compaction.
- Iga blokk sooritas ainult ĂŒhte jĂ€rgmistest toimingutest:
â Put
â Get
â Get+Put
- Iga blokk sooritas 50 000 kordust oma toimingul.
- Kirje suurus blokis on 100 baiti, 1000 baiti vÔi 10000 baiti (juhuslik).
- Blokke kĂ€ivitati erineva soovitud vĂ”tmete arvuga (kas ĂŒks vĂ”ti vĂ”i 10).
- Blokke kÀivitati erinevate tabelite seadistustega. Muudetud parameetrid:
â BlockCache = sisse lĂŒlitatud vĂ”i vĂ€lja lĂŒlitatud
â BlockSize = 65 KB vĂ”i 16 KB
â Partitsioonide arv = 1, 5 vĂ”i 30
â MSLAB = sisse lĂŒlitatud vĂ”i vĂ€lja lĂŒlitatud
Nii nÀeb blokk vÀlja:
a. MSLAB reĆŸiim lĂŒlitati sisse/vĂ€lja.
b. Loodi tabel, millele kehtestati jÀrgmised parameetrid: BlockCache = true/none, BlockSize = 65/16 Kb, Partition = 1/5/30.
c. Seati juurde GZ kokkusurumine.
d. KÀivitati 10 lÔime, mis teostasid 1/10 put/get/get+put operatsiooni selle tabeliga, kus kirjed olid suurustega 100/1000/10000 baiti, teostades jÀrjestikuselt 50 000 pÀringut (vÔtmed on juhuslikud).
e. Punkt d kordus kolm korda.
f. KÔigi lÔimede tööaeg keskmistati.
KÀsitleti kÔiki vÔimalikke kombinatsioone. Eeldatavalt, kui kirje suurus suureneb, siis kiirus langeb vÔi et vahemÀlu keelamine viib aeglustumiseni. Siiski oli eesmÀrk mÔista iga parameetri mÔju ulatust ja tÀhtsust, seetÔttu edastati kogutud andmed lineaarse regressiooni funktsiooni sisendiks, mis vÔimaldab hinnata usaldusvÀÀrsust t-statistika abil. Allpool on toodud tulemused Put operatsioone teostavate plokkide töö kohta. TÀielik kombinatsioonide arv 2*2*3*2*3 = 144 varianti + 72, kuna mÔned olid teostatud kaks korda. Seega kokku 216 kÀivitust:

Testimine viidi lÀbi mini-klastril, mis koosnes 3 DataNode'ist ja 4 RS'ist (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 lÔime). HBase versioon 1.2.0-cdh5.14.2.
KĂ”ige kĂ”rgem sisestamise kiirus 3.7 sekundi jooksul saavutati MSLAB reĆŸiimi vĂ€ljalĂŒlitamisel, ĂŒhes osaga tabelis, koos lubatud BlockCache'iga, BlockSize = 16, kirjed 100 baiti 10 tĂŒkki pakis.
KĂ”ige madalam sisestamise kiirus 82.8 sekundi jooksul saavutati MSLAB reĆŸiimi sisselĂŒlitamisel, ĂŒhes osaga tabelis, koos lubatud BlockCache'iga, BlockSize = 16, kirjed 10000 baiti 1 tĂŒkiga.
NĂŒĂŒd vaatame mudelit. NĂ€eme, et mudeli kvaliteet R2 jĂ€rgi on hea, kuid on tĂ€iesti selge, et siit ekstrapoleerimine on vastunĂ€idustatud. SĂŒsteemi reaalsed kĂ€itumised parameetrite muutmisel ei ole lineaarsed, see mudel on vajalik mitte prognoosimiseks, vaid mĂ”istmiseks, mis juhtus antud parameetrite piires. NĂ€iteks nĂ€eme siin, et Stuudi kriitiumi jĂ€rgi ei oma Put operatsiooni puhul BlockSize ja BlockCache parameetrid tĂ€htsust (mis on ĂŒldiselt ĂŒsna eeldatav):

Kuid see, et arvu suurenemine osade arvus vĂ€hendab jĂ”udlust, on pisut ootamatu (oleme juba nĂ€inud positiivset mĂ”ju osade arvu suurenemisel BulkLoad'i puhul), kuigi see on seletatav. Esiteks, töötlemiseks tuleb vormistada pĂ€ringud 30 piirkonda asemel ĂŒhe suhtes, ning andmemaht ei ole piisavalt suur, et see kasu tooks. Teiseks mÀÀrab kogu tööaeg kĂ”ige aeglasem RS, ning kuna DataNode'ide arv on vĂ€iksem RS-ide arvust, siis osa piirkondadest ei oma null-lokaalsust. Ja vaatame viit liidrit:

NĂŒĂŒd hindame Get plokkide tĂ€itmise tulemusi:

Osade arv on kaotanud oma tÀhtsuse, mis vÔib seletuda sellega, et andmed on hÀsti vahemÀlus ja lugemise vahemÀlu on kÔige olulisem (statistiliselt) parameeter. Loomulikult on pÀringus sÔnumite arvu suurendamine samuti pÀris kasulik jÔudlusele. Parimad tulemused:

Ja lÔpuks vaatame plokki, mis tegi kÔigepealt get ja seejÀrel put:

Siin on kÔik parameetrid olulised. Ja liidrite tulemused:

9. Koormuse testimine
Ja lÔpuks kÀivitame enam-vÀhem korraliku koormuse, kuid alati on huvitavam, kui on, millega vÔrrelda. DataStaxi veebisaidil - Cassandra peamise arendaja juures on NoSQL hoiustamise NT rida, sealhulgas HBase versioon 0.98.6-1. Laadimist tehti 40 lÔime kaudu, andmemaht oli 100 baiti, SSD kettad. Testimise tulemused operatsioonide Read-Modify-Write nÀitasid selliseid tulemusi.

Kuidas ma aru sain, lugemine toimus 100 kirje kaupa ja 16 HBase nodi puhul nÀitas DataStaxi test tootlikkust 10 tuhat operatsiooni sekundis.
Hea, et meie klastris on samuti 16 sĂ”lme, kuid mitte just "hea" on see, et igas on 64 tuuma (voogu), samas kui DataStaxi testis oli vaid 4. Teiselt poolt on neil SSD terad, meil aga HDD ja uuem HBase versioon ning CPU kasutamine koormuse ajal suurenes praktiliselt mitte oluliselt (visuaalselt 5â10 protsenti). Kuid proovime siiski selle konfiguratsiooniga alustada. Tabelid on vaikeseaded, lugemine toimub vĂ”tmevahemikus 0â50 miljonit juhuslikult (st iga kord sisuliselt uus). Tabelis on 50 miljonit kirjet, jagatud 64 partitsiooniks. VĂ”tmed on crc32 jĂ€rgi hashitud. Tabelid on vaikeseadetes, MSLAB on sisse lĂŒlitatud. KĂ€ivitame 40 voogu, iga voog loeb 100 juhusliku vĂ”tme komplekti ja kirjutab kohe 100 genereeritud bitti tagasi nende vĂ”tmete alla.

Stend: 16 DataNode'i ja 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 voogu). HBase versioon 1.2.0-cdh5.14.2.
Keskmine tulemus on lĂ€hemal 40 000 tehingule sekundis, mis on oluliselt parem kui DataStaxi testis. Kuid eksperimendi eesmĂ€rgil on mĂ”istlik tĂ€iendada mĂ”ningaid tingimusi. Ăksikutel juhtudel on vĂ€hetĂ”enĂ€oline, et kogu töö kĂ€ib ainult ĂŒhe tabeliga ja ainult unikaalsete vĂ”tmetega. Oletame, et on olemas mingi "kuum" vĂ”tme komplekt, mis genereerib peamise koormuse. SeetĂ”ttu proovime luua koormust suuremate kirjetega (10 KB), samuti pakkidena 100, 4 erinevas tabelis ja piirates nĂ”utavate vĂ”tmete vahemiku 50 tuhandele. Alloleval graafikul on nĂ€idatud 40 voolu kĂ€ivitamine, iga voog loeb 100 vĂ”tme komplekti ja kirjutab juurde juhuslikud 10 KB nende vĂ”tmete alla.

Stend: 16 DataNode'i ja 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 voogu). HBase versioon 1.2.0-cdh5.14.2.
Koormuse kÀigus kÀivitati mitu korda major compaction, nagu eespool nÀidatud, ilma selle protseduurita vÀheneb tÔhusus aja jooksul, kuid selle teostamise ajal tekib ka tÀiendav koormus. Langused on pÔhjustatud erinevatest teguritest. MÔnikord lÔpetasid vood töö ja kuni nende taaskÀivitamiseni tekkis paus, mÔnikord aitasid kolmandate osapoolte rakendused koormust tekitada klastris.
Lugemine ja kohe kirjutamine on HBase'i jaoks ĂŒks keerulisemaid tööstsenaariume. Kui teha ainult vĂ€ikeseid put-pĂ€ringuid, nĂ€iteks 100 bait, kombineerides need partii kaupa 10-50 tuhat, vĂ”ib saavutada sadu tuhandeid toiminguid sekundis, ja sarnane olukord kehtib ka ainult lugemise pĂ€ringute puhul. Tuleb mĂ€rkida, et tulemused on radikaalselt paremad vĂ”rreldes DataStaxiga, peamiselt tĂ€nu 50 tuhande kaupa blokeeritud pĂ€ringutele.

Stend: 16 DataNode'i ja 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 voogu). HBase versioon 1.2.0-cdh5.14.2.
10. JĂ€reldused
See sĂŒsteem on piisavalt paindlikult seadistatav, kuid paljude parameetrite mĂ”ju jÀÀb endiselt teadmata. Osa neist on testitud, kuid ei kuulunud lĂ”plikku testide kogumisse. NĂ€iteks eelnevad eksperimendid nĂ€itasid, et parameeter DATA_BLOCK_ENCODING, mis kodeerib teavet, kasutades naaberloomuste vÀÀrtusi, on oluliselt vĂ€hem mĂ€rkimisvÀÀrne, mis on arusaadav juhuslike andmete jaoks. Suure hulga korduvate objektide kasutamisel vĂ”ib vĂ”it olla mĂ€rkimisvÀÀrne. Ăldiselt vĂ”ib öelda, et HBase jĂ€tab mulje tĂ”sisest ja lĂ€bimĂ”eldud andmebaasist, mis vĂ”ib suurtel andmeblokiga töötledes olla piisavalt tĂ”hus. Eriti juhul, kui on vĂ”imalik lugemise ja kirjutamise protsessid ajaliselt lahutada.
Kui midagi tundub teie arvates ebapiisavalt kÀsitletud, olen valmis rÀÀkima lÀhemalt. Soovitame jagada oma kogemusi vÔi arutada, kui millegagi ei nÔustu.
Allikas: habr.com
