Teoria dhe praktika e përdorimit të HBase

Përshëndetje! Emri im është Danil Lipovoy, ekipi ynë në Sbertech ka filluar të përdorë HBase si depozita për të dhënat operative. Gjatë studimit të tij, është grumbulluar përvoja, të cilën deshëm ta sistematizojmë dhe ta përshkruajmë (shpresojmë se do të jetë e dobishme për shumëkënd). Të gjitha eksperimentet e mëposhtme janë kryer me versionet HBase 1.2.0-cdh5.14.2 dhe 2.0.0-cdh6.0.0-beta1.

  1. Arkitektura e përgjithshme
  2. Shkrimi i të dhënave në HBASE
  3. Leximi i të dhënave nga HBASE
  4. Keshimi i të dhënave
  5. Procesimi i paketave të të dhënave MultiGet/MultiPut
  6. Strategjia e ndarjes së tabelave në rajone (shpërndarja)
  7. Kohëzgjatja, kompakti dhe lokaliteti i të dhënave
  8. Cështjet dhe performanca
  9. Testimi i ngarkesës
  10. Përfundimet

1. Arkitektura e përgjithshme

Teoria dhe praktika e përdorimit të HBase
Master-i rezervë dëgjon heartbeat-in e aktiv në nodin ZooKeeper dhe në rast se zhduket merr funksionet e master-it mbi vete.

2. Shkrimi i të dhënave në HBASE

MĂ« parĂ«, le tĂ« shqyrtojmĂ« rastin mĂ« tĂ« thjeshtĂ« – shkrimin e njĂ« objekti çelĂ«s-vlerĂ« nĂ« njĂ« tabelĂ« me anĂ« tĂ« put(rowkey). Klienti fillimisht duhet tĂ« kuptojĂ« se ku ndodhet rajoni rrĂ«njĂ«sor i serverit (Root Region Server – RRS), i cili ruan tabelĂ«n hbase:meta. KĂ«tĂ« informacion e merr nga ZooKeeper. Pas kĂ«saj, ai drejtohet te RRS dhe lexon tabelĂ«n hbase:meta, nga e cila nxjerr informacionin, se cili RegionServer (RS) Ă«shtĂ« pĂ«rgjegjĂ«s pĂ«r ruajtjen e tĂ« dhĂ«nave pĂ«r çelĂ«sin e caktuar rowkey nĂ« tabelĂ«n qĂ« e intereson. PĂ«r qĂ«llime pĂ«rdorimi nĂ« tĂ« ardhmen, tabela meta keshon nga klienti dhe prandaj subvencionet e mĂ«vonshme shkojnĂ« mĂ« shpejt, direkt te RS.

Më pas, RS, duke marrë kërkesën, fillimisht e shkruan atë në WriteAheadLog (WAL), që është e nevojshme për rikuperimin në rast rënie. Pastaj ruan të dhënat në MemStore. Ky është një tampon në kujtesë, i cili përmban një grup të renditur të çelësave të këtij rajoni. Tabela mund të ndahet në rajone (partita), secili prej të cilëve përmban një grup të pandryshueshëm çelësh. Kjo lejon, duke vendosur rajonet në serverë të ndryshëm, të arrihet një performancë më e lartë. Megjithatë, pavarësisht qartësisë së këtij pohimi, më pas do të shohim se kjo nuk funksionon në të gjitha rastet.

Pasi të vendoset regjistrimi në MemStore, klienti merr një përgjigje se regjistrimi është ruajtur me sukses. Ndërkohë, në të vërtetë ai ruhet vetëm në tampon dhe do të kalojë në disk vetëm pas kalimit të një intervali të caktuar kohe ose kur mbushet me të dhëna të reja.

Teoria dhe praktika e përdorimit të HBase
Kur operacioni "Fshi" ekzekutohet, nuk ndodh një eliminim fizik i të dhënave. Ato thjesht shënohen si të fshira, ndërsa shkatërrimi ndodh në momentin e thirrjes së funksionit major compact, për të cilin është shkruar më shumë në p.7.

Skedarët në formatin HFile grumbullohen në HDFS dhe nga koha në kohë nis një proces minor compact, i cili thjesht ngjitesh skedarët e vegjël në më të mëdhenj, pa fshirë asgjë. Me kalimin e kohës, kjo bëhet një problem që shfaqet vetëm gjatë leximit të të dhënave (për këtë do të kthehemi më vonë).

Përveç procesit të ngarkesës të përshkruar më sipër, ekziston një procedurë shumë më efikase, e cila përmban ndoshta pikën më të fortë të kësaj DB - BulkLoad. Ajo konsiston në faktin se ne vetë formojmë HFiles dhe i vendosim në disk, që na lejon të shkallëzojmë mjaft mirë dhe të arrijmë shpejtësi të konsiderueshme. Në thelb, kufizimi këtu nuk është HBase, por mundësitë e harduerit. Më poshtë janë rezultatet e ngarkesës në një klaster që përbëhet nga 16 RegionServers dhe 16 NodeManager YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 procese), versioni HBase 1.2.0-cdh5.14.2.

Teoria dhe praktika e përdorimit të HBase

Këtu shihet se duke rritur numrin e particioneve (rajoneve) në tabelë, si dhe ekzekutorët e Spark, arrijmë një rritje të shpejtësisë së ngarkesës. Gjithashtu, shpejtësia varet nga volumi i shkruar. Blloqet e mëdha japin një rritje në matjen MB/sek, ndërsa ato të vogla në numrin e shënimeve të futur në një njësi kohe, nën kushte të barabarta.

Gjithashtu, mund tĂ« nisim ngarkimin nĂ« dy tabela njĂ«kohĂ«sisht dhe tĂ« marrim dyfishin e shpejtĂ«sisĂ«. MĂ« poshtĂ« shihet se shkruarja e blloqeve 10 KB menjĂ«herĂ« nĂ« dy tabela shkon me njĂ« shpejtĂ«si prej rreth 600 Mb/sek nĂ« secilĂ«n (shuma 1275 Mb/sek), qĂ« pĂ«rputhet me shpejtĂ«sinĂ« e shkruarjes nĂ« njĂ« tabelĂ« 623 MB/sek (shih №11 mĂ« sipĂ«r)

Teoria dhe praktika e përdorimit të HBase
Ndërsa, ekzekutimi i dytë me shënime në 50 KB tregon se shpejtësia e ngarkesës rritet tashmë në mënyrë të vogël, që flet për afrim ndaj vlerave maksimale. Në të njëjtën kohë, duhet të merret parasysh se samë HBASE këtu nuk krijon ngarkesë të rëndë, gjithçka që kërkohet prej tij është së pari të dorëzojë të dhënat nga hbase:meta, dhe pas vendosjes së HFiles, të shkarkojë të dhënat BlockCache dhe të ruajë tamponin MemStore në disk, nëse ai nuk është bosh.

3. Leximi i të dhënave nga HBASE

Nëse merret parasysh se të gjitha informacionet nga hbase:meta tashmë i ka klienti (shih. p.2), atëherë kërkesa shkon menjëherë në atë RS, ku ruhet çelësi i nevojshëm. Fillimisht, kërkimi kryhet në MemCache. Pavarësisht nëse atje ka të dhëna apo jo, kërkimi kryhet gjithashtu në tamponin BlockCache dhe, nëse është e nevojshme, në HFiles. Nëse të dhënat janë gjetur në skedarin, ato vendosen në BlockCache dhe për kërkesën e ardhshme do të kthehen më shpejt. Kërkimi në HFile ndodh mjaft shpejt për shkak të përdorimit të filtrit Bloom, dmth duke lexuar një volum të vogël të dhënash, ai e përcakton menjëherë nëse ky skedar përmban çelësin e nevojshëm dhe, nëse nuk ka, kalon te i siguiente.

Teoria dhe praktika e përdorimit të HBase
Duke marrë të dhënat nga këto tre burime, RS formon përgjigjen. Në veçanti, ai mund të transmetojë menjëherë disa versione të gjetura të objektit nëse klienti ka kërkuar versionim.

4. Keshimi i të dhënave

Buffers MemStore dhe BlockCache zënë deri në 80% të memories së rezervuar on-heap të RS (pjesa tjetër është rezervuar për detyra shërbimi të RS). Nëse modelet tipike të përdorimit janë të tilla që proceset shkruajnë dhe menjëherë lexojnë të njëjtat të dhëna, ka kuptim të ulet BlockCache dhe të rritet MemStore, pasi gjatë shkrimit të dhënat në cache nuk hyjnë për lexim, kështu që përdorimi i BlockCache do të ndodhë më rrallë. Buffer BlockCache përbëhet nga dy pjesë: LruBlockCache (përherë on-heap) dhe BucketCache (në përgjithësi off-heap ose në SSD). BucketCache duhet të përdoret kur ka shumë kërkesa për lexim dhe ato nuk hyjnë në LruBlockCache, gjë që rezulton në një punë aktive të Garbage Collector. Megjithatë, nuk duhet pritur një rritje dramatike të performancës nga përdorimi i cache për lexim, por për këtë do të kthehemi përsëri në p. 8.

Teoria dhe praktika e përdorimit të HBase
BlockCache është një për të gjithë RS, ndërsa MemStore është specifike për secilën tabelë (një për çdo Column Family).

Si përshkruhet Në teori, gjatë shkrimit, të dhënat nuk hyjnë në cache, dhe me të vërtetë, parametrat e tillë CACHE_DATA_ON_WRITE për tabelën dhe "Cache DATA on Write" për RS janë vendosur në false. Megjithatë, në praktikë, nëse shkruani të dhëna në MemStore, më pas e shfryni atë në disk (duke e pastruar kështu), pastaj fshini skedarin që është krijuar, duke realizuar një kërkesë get, ne e marrim me sukses të dhënat. Madje, edhe nëse e fikni krejt BlockCache dhe mbushni tabelën me të dhëna të reja, më pas arritni të shfryni MemStore në disk, duke i fshirë ato dhe kërkuar nga një sesion tjetër, ato do të nxirren sërish nga diku. Pra, HBase ruan në vetvete jo vetëm të dhëna, por edhe misteret e çuditshme.

hbase(main):001:0> krijo 'ns:magic', 'cf'
Tabela ns:magic u krijua
Mori 1.1533 sekonda
hbase(main):002:0> vendos 'ns:magic', 'key1', 'cf:c', 'provo_të_fshihem'
Mori 0.2610 sekonda
hbase(main):003:0> flush 'ns:magic'
Mori 0.6161 sekonda
hdfs dfs -mv /data/hbase/data/ns/magic/* /tmp/trash
hbase(main):002:0> merr 'ns:magic', 'key1'
 cf:c      timestamp=1534440690218, vlera=provo_të_fshihem

Parametri "Cache DATA on Read" është vendosur false. Nëse keni ide, mirëpriteni të diskutojmë këtë në komentet.

5. Përpunimi i grupeve të të dhënave MultiGet/MultiPut

Përpunimi i kërkesave të vetme (Get/Put/Delete) është një operacion mjaft i kushtueshëm, prandaj është e rekomandueshme t'i gruposh sa më shumë të jetë e mundur në List ose List, duke lejuar kështu një rritje të konsiderueshme të performancës. Kjo veçanërisht vlen për operacionin e shkrimit, ndërsa në lexim ka një pengesë tjetër. Në grafikun më poshtë është treguar koha e leximit të 50,000 regjistrimeve nga MemStore. Leximi është bërë në një të vetëm dhe në boshtin horizontal është treguar numri i çelësave në kërkesë. Këtu shihet se me rritjen deri në një mijë çelësa në një kërkesë, koha e ekzekutimit bie, pra shpejtësia rritet. Megjithatë, me modalitetin MSLAB të aktivizuar në mënyrë të paracaktuar, pas këtij prag, fillon një rënien dramatike të performancës, ndërsa më shumë është volumi i të dhënave në regjistër, aq më shumë është koha e punës.

Teoria dhe praktika e përdorimit të HBase

Testet janë kryer në një virtualka, 8 bërthama, versioni HBase 2.0.0-cdh6.0.0-beta1.

Modaliteti MSLAB është krijuar për të zvogëluar fragmentimin e heap-it, që ndodh për shkak të përzierjes së të dhënave të brezit të ri dhe atyre të vjetër. Si zgjidhje e problemit, kur aktivizohet MSLAB, të dhënat vendosen në qeliza (chunk) relativisht të vogla dhe përpunohen në grupe. Si rezultat, kur volumi në paketën e të dhënave të kërkuara tejkalon madhësinë e caktuar, performanca bie në mënyrë drastike. Në anën tjetër, çaktivizimi i këtij modaliteti gjithashtu nuk është i dëshirueshëm, pasi do të çojë në ndalime për shkak të GC në momentet e punës intensive me të dhëna. Një zgjidhje e mirë është rritja e madhësive të qelizave, në rastin e shkrimit aktiv përmes put-it në të njëjtën kohë me leximin. Duhet të theksohet se problemi nuk ndodh nëse pas shkrimit ekzekutohet komandë flush, e cila dërgon MemStore në disk ose nëse bëhet ngarkesa përmes BulkLoad. Në tabelën më poshtë tregohet se kërkesat nga MemStore për të dhëna të mëdha (dhe në të njëjtin numër) çojnë në ngadalësim. Megjithatë, duke rritur chunksize, rikthejmë kohën e përpunimit në normë.

Teoria dhe praktika e përdorimit të HBase
Përveç rritjes së chunksize, ndihmon ndarja e të dhënave sipas rajoneve, pra, ndarja e tabelave. Kjo çon në atë që në çdo rajon vijnë më pak kërkesa dhe nëse ato vendosen në një qelizë, përgjigja mbetet e mirë.

6. Strategjia e ndarjes së tabelave në rajone (splitting)

Duke qenë se HBase është një magazinë çelës-vlerë dhe ndarja bëhet sipas çelësit, është shumë e rëndësishme të ndahet të dhënat në mënyrë të barabartë në të gjitha rajonet. Për shembull, ndarja e një tabele të tillë në tre pjesë do të çonte në atë që të dhënat do të ishin të ndara në tri rajone:

Teoria dhe praktika e përdorimit të HBase
Ndodh që kjo të çojë në ngadalësim të menjëhershëm, nëse të dhënat që do të ngarkohen më pas kanë formë për shembull vlerash të gjata, shumica e të cilave fillojnë me të njëjtën shifër, për shembull:

1000001
1000002


1100003

Duke qenë se çelësat ruhen si një array bajtesh, të gjithë do të fillojnë njësoj dhe do t'i përkasin një rajoni të vetëm #1 që ruan këtë gamë çelësash. Ka disa strategji ndarje:

HexStringSplit – Kthen çelĂ«sin nĂ« njĂ« varg me kodim gjashtĂ«mbĂ«dhjetĂ«she nĂ« gamĂ«n «00000000» => «FFFFFFFF» dhe e mbush atĂ« nga e majta me zero.

UniformSplit – Kthen çelĂ«sin nĂ« njĂ« array bajtesh me kodim gjashtĂ«mbĂ«dhjetĂ«she nĂ« gamĂ«n «00» => «FF» dhe e mbush atĂ« nga e djathta me zero.

Për më tepër, mund të specifikoni çdo gamë ose set çelësash për ndarje dhe të konfiguroni ndarjen automatike. Megjithatë, një nga qasjet më të thjeshta dhe efikase është UniformSplit dhe përdorimi i konkatenimit të hash-it, për shembull, çifti më i lartë i bajtëve nga ekzekutimi i çelësit përmes funksionit CRC32(rowkey) dhe vetë rowkey:

hash + rowkey

Atëherë të gjitha të dhënat do të shpërndahen në mënyrë të barabartë në rajone. Gjatë leximit, dy bajtët e parë thjesht hiqen dhe mbetet çelësi origjinal. Gjithashtu, RS kontrollon sasinë e të dhënave dhe çelësave në rajon dhe në rast të tejkalimit të kufijve, automatikisht e ndan atë në pjesë.

7. Qëndrueshmëria dhe lokaliteti i të dhënave

Dukeqë çdo grup çelësash menaxhohet nga një rajon i vetëm, zgjidhja e problemeve që lidhen me rëniet e RS ose me daljen nga përdorimi është ruajtja e të dhënave të nevojshme në HDFS. Kur ndodh një rënie e RS, masteri e zbulon këtë përmes mungesës së heartbeat në nyjën ZooKeeper. Atëherë ai i cakton një rajon tjetër të menaxhuar një RS të ri dhe pasi që HFiles ruhen në sistemin e skedarëve të shpërndarë, pronari i ri i lexon dhe vazhdon të shërbejë të dhënat. Megjithatë, pasi një pjesë e të dhënave mund të jetë në MemStore dhe nuk është ruajtur ende në HFiles, për rikthimin e historisë së operacioneve përdoret WAL, i cili gjithashtu ruhet në HDFS. Pas vendosjes së ndryshimeve, RS është në gjendje të përgjigjet ndaj kërkesave, megjithatë kalimi çon në faktin se një pjesë e të dhënave dhe proceset që i shërbejnë atyre janë në nyja të ndryshme, dmth, lokaliteti zvogëlohet.

Zgjidhja pĂ«r kĂ«tĂ« problem Ă«shtĂ« major compaction – kjo procedurĂ« transferon skedarĂ«t nĂ« ato nyja qĂ« janĂ« pĂ«rgjegjĂ«se pĂ«r ta (aty ku ndodhen rajonet e tyre), si rezultat i tĂ« cilĂ«s gjatĂ« kĂ«saj procedure ngarkesa nĂ« rrjet dhe disqet rritet ndjeshĂ«m. MegjithatĂ«, mĂ« vonĂ«, qasja nĂ« tĂ« dhĂ«na pĂ«rmirĂ«sohet ndjeshĂ«m. PĂ«r mĂ« tepĂ«r, major_compaction kombinon tĂ« gjitha HFiles nĂ« njĂ« skedar tĂ« vetĂ«m nĂ« kuadĂ«r tĂ« rajonit, si dhe pastron tĂ« dhĂ«nat nĂ« varĂ«si tĂ« cilĂ«simeve tĂ« tabelĂ«s. PĂ«r shembull, mund tĂ« caktohet numri i versioneve tĂ« objektit qĂ« duhet tĂ« ruhen ose koha e jetĂ«s sĂ« tij, pas kalimit tĂ« sĂ« cilĂ«s objekti fshihet fizikisht.

Kjo procedurë mund të ketë një ndikim shumë pozitiv në funksionimin e HBase. Në imazhin më poshtë shihet si degradoi performanca si rezultat i shkrimit aktiv të të dhënave. Këtu shihet si 40 rrjedha shkruajnë në një tabelë dhe 40 rrjedha lexojnë të dhëna njëkohësisht. Rrjedhat shkruese formojnë gjithnjë e më shumë HFiles, të cilat lexohen nga rrjedhat e tjera. Si rezultat, gjithnjë e më shumë të dhëna duhet të fshihen nga memoria dhe në fund fillon të funksionojë GC, që pothuajse paralizon të gjithë punën. Aktivizimi i major compaction çoi në pastrimin e mbetjeve të krijuara dhe rikthimin e performancës.

Teoria dhe praktika e përdorimit të HBase
Testi u krye në 3 DataNode dhe 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 rrjedha). Versioni HBase 1.2.0-cdh5.14.2

ËshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se lançimi i major compaction u krye nĂ« njĂ« tavĂ«ll "live", nĂ« tĂ« cilĂ«n ishin duke u shkruar dhe lexuar tĂ« dhĂ«na aktivisht. NĂ« internet ka pasur deklarata qĂ« sugjerojnĂ« se kjo mund tĂ« çojĂ« nĂ« pĂ«rgjigje tĂ« gabuar gjatĂ« leximit tĂ« tĂ« dhĂ«nave. PĂ«r tĂ« verifikuar, u aktivizua njĂ« proces qĂ« gjeneronte tĂ« dhĂ«na tĂ« reja dhe i shkruante ato nĂ« tavĂ«ll. Pas kĂ«saj, menjĂ«herĂ« lexonte dhe krahasonte nĂ«se vlera e marrĂ« pĂ«rputhej me atĂ« qĂ« ishte shkruar. GjatĂ« punĂ«s sĂ« kĂ«tij procesi, major compaction u lançua rreth 200 herĂ« dhe asnjĂ« dĂ«shtim nuk u regjistrua. Ndoshta problemi shfaqet sĂ« shpejti dhe vetĂ«m gjatĂ« ngarkesĂ«s sĂ« lartĂ«, prandaj Ă«shtĂ« mĂ« e sigurt tĂ« ndaloni procedurat e shkrimit dhe leximit nĂ« mĂ«nyrĂ« planifikuese dhe tĂ« kryeni pastrimin pa lejuar rĂ«niet e tilla GC.

Po ashtu, major compaction nuk ndikon në gjendjen e MemStore, për të hedhur atë në disk dhe për kompaktim duhet të përdoret flush (connection.getAdmin().flush(TableName.valueOf(tblName))).

8. Cilësimet dhe Performanca

Siç është thënë më parë, HBase tregon suksesin më të madh atje ku nuk ka nevojë të bëjë asgjë, gjatë realizimit të BulkLoad. Megjithatë, kjo i përket shumicës së sistemeve dhe njerëzve. Sidoqoftë, ky instrument është më i përshtatshëm për vendosjen masive të të dhënave në blloqe të mëdha, ndërsa nëse procesi kërkon realizimin e shumë kërkesave konkurruese për lexim dhe shkrim, përdoren komandat e përshkruara më sipër Get dhe Put. Për të përcaktuar parametrat optimalë, u zhvilluan lançime me kombinime të ndryshme të parametrave të tavllave dhe cilësimeve:

  • U lançuan 10 rrjedha njĂ«kohĂ«sisht 3 herĂ« radhazi (tĂ« quajmĂ« kĂ«tĂ« njĂ« bllok rrjedhash).
  • Koha e punĂ«s sĂ« tĂ« gjitha rrjedhave nĂ« bllok u mesataua dhe ishte rezultati pĂ«rfundimtar i punĂ«s sĂ« bllokut.
  • TĂ« gjitha rrjedhat punuan me tĂ« njĂ«jtĂ«n tavĂ«ll.
  • Para çdo lançimi tĂ« bllokut tĂ« rrjedhave, u krye njĂ« major compaction.
  • Çdo bllok kryente vetĂ«m njĂ« nga operacionet e mĂ«poshtme:

— Put
— Get
— Get+Put

  • Çdo bllok kryente 50,000 pĂ«rsĂ«ritje tĂ« operacionit tĂ« tij.
  • MadhĂ«sia e regjistrimit nĂ« bllok ishte 100 byte, 1000 byte ose 10000 byte (random).
  • Blloqet u lançuan me sasi tĂ« ndryshme tĂ« çelĂ«save tĂ« kĂ«rkuar (ose njĂ« çelĂ«s ose 10).
  • Blloqet u lançuan nĂ«n cilĂ«sime tĂ« ndryshme tĂ« tavllĂ«s. Parametrat u ndĂ«rruan:

— BlockCache = u aktivizua ose u deaktivizua
— BlockSize = 65 Kb ose 16 Kb
— PjesĂ«t = 1, 5 ose 30
— MSLAB = aktivizuar ose deaktivizuar

Kështu, blloku duket kështu:

a. Mënyra MSLAB u aktivizua/aktivizua.
b. U krijua një tabelë, për të cilën u vendosën parametrat e mëposhtëm: BlockCache = true/në, BlockSize = 65/16 Kb, Partita = 1/5/30.
c. U vendos kompresimi GZ.
d. U nisën 10 përcjellës në të njëjtën kohë që kryenin 1/10 operacione put/get/get+put në këtë tabelë me shënime prej 100/1000/10000 byte, duke realizuar 50,000 kërkesa radhazi (çelësat ishin të rastësishëm).
e. Pika d u përsërit tri herë.
f. Koha e punës së të gjitha përcjellësve u mesatua.

U kontrolluan tĂ« gjitha kombinimet e mundshme. ËshtĂ« e parashikueshme se me rritjen e madhĂ«sisĂ« sĂ« shĂ«nimit, shpejtĂ«sia do tĂ« bjerĂ« ose se deaktivizimi i kapjes do tĂ« çojĂ« nĂ« ngadalĂ«sim. MegjithatĂ«, qĂ«llimi ishte tĂ« kuptohej shkalla dhe rĂ«ndĂ«sia e ndikimit tĂ« secilit parametr, prandaj tĂ« dhĂ«nat e mbledhura u japĂ«n si input nĂ« funksionin e regresionit linear, qĂ« ofron mundĂ«sinĂ« pĂ«r tĂ« vlerĂ«suar saktĂ«sinĂ« pĂ«rmes statistikĂ«s t. MĂ« poshtĂ« janĂ« rezultatat e punĂ«s sĂ« bllokĂ«ve qĂ« kryejnĂ« operacionet Put. Grupi i plotĂ« i kombinimeve 2*2*3*2*3 = 144 variante + 72 pĂ«r shkak se disa u realizuan dy herĂ«. Prandaj, nĂ« total janĂ« 216 nisje:

Teoria dhe praktika e përdorimit të HBase
Testimi u krye në një mini-klaster që përbëhej nga 3 DataNode dhe 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 përcjellës). Versioni HBase 1.2.0-cdh5.14.2.

Shpejtësia më e lartë e futjes, 3.7 sekonda, u arrit kur nuk ishte aktivizuar moda MSLAB, në një tabelë me një parti, me BlockCache të aktivizuar, BlockSize = 16, shënime prej 100 byte në 10 copë në paketë.
Shpejtësia më e ulët e futjes, 82.8 sekonda, u arrit kur ishte aktivizuar moda MSLAB, në një tabelë me një parti, me BlockCache të aktivizuar, BlockSize = 16, shënime prej 10000 byte në 1 copë.

Tani le të shohim modelin. Ne shohim cilësi të mirë të modelit sipas R2, por plotësisht e qartë se ekstrapolimi këtu është i padëshiruar. Sjellja e vërtetë e sistemit gjatë ndryshimit të parametreve do të jetë jo lineare, ky model është i nevojshëm, jo për prognoza, por për të kuptuar se çfarë ndodhi brenda parametrave të caktuara. Për shembull, këtu ne shohim sipas kritereve të Studentit, që për operacionin Put, parametrat BlockSize dhe BlockCache nuk kanë rëndësi (çka është në përgjithësi krejt e parashikueshme):

Teoria dhe praktika e përdorimit të HBase
E megjithatë, rritja e numrit të particioneve çon në një ulje të performancës, që është disi befasuese (ne kemi parë një ndikim pozitiv nga rritja e numrit të particioneve gjatë BulkLoad), ndonëse është e shpjegueshme. Së pari, për përpunim duhet të formohen kërkesa për 30 rajone në vend të një siç ishte më parë, dhe volumi i të dhënave nuk është i tillë që të ofrojë përfitime. Së dyti, koha total e punës përcaktohet nga RS më i ngadalshëm, dhe pasi numri i DataNode është më i vogël se numri i RS, disa rajone kanë lokalitet zero. Tani le të shikojmë pesë liderët:

Teoria dhe praktika e përdorimit të HBase
Tani le të vlerësojmë rezultatet e ekzekutimit të blloqeve Get:

Teoria dhe praktika e përdorimit të HBase
Numri i particioneve ka humbur rëndësinë, gjë që ndoshta shpjegohet nga fakti se të dhënat janë të mirë-kesh dhe keƥi për lexim është parametrat më të rëndësishëm (statistikisht). Natyrisht, rritja e numrit të mesazheve në kërkesë është gjithashtu shumë e dobishme për performancën. Rezultatet më të mira:

Teoria dhe praktika e përdorimit të HBase
Dhe së fundmi, le të shikojmë në modelin e bllokut që fillimisht kryente get, dhe pastaj put:

Teoria dhe praktika e përdorimit të HBase
Këtu të gjithë parametrat janë të rëndësishëm. Dhe rezultatet e liderëve:

Teoria dhe praktika e përdorimit të HBase

9. Testimi i ngarkesës

Dhe sĂ« fundmi, le tĂ« aktivizojmĂ« njĂ« ngarkesĂ« mĂ« tĂ« pranueshme, por gjithmonĂ« Ă«shtĂ« mĂ« interesante kur ka çfarĂ« tĂ« krahasojmĂ«. NĂ« faqen e internetit tĂ« DataStax – zhvilluesi kryesor i Cassandra, ka rezultatet HN tĂ« disa depozitave NoSQL, duke pĂ«rfshirĂ« HBase versionin 0.98.6-1. Ngarkesa u realizua me 40 rrjedha, madhĂ«sia e tĂ« dhĂ«nave 100 byte, disqet SSD. Rezultati i testit tĂ« operacioneve Read-Modify-Write tregoi kĂ«to rezultate.

Teoria dhe praktika e përdorimit të HBase
Sa kuptova, leximi u krye blok pas bloku prej 100 regjistrimesh dhe për 16 node HBase testi i DataStax tregoi një performancë prej 10 mijë operacioneve në sekondë.

ËshtĂ« e mirĂ« qĂ« nĂ« klasterin tonĂ« ka gjithashtu 16 nod dhe jo shumĂ« 'e mirĂ«' qĂ« nĂ« secilin ka 64 bĂ«rthama (rrjedha), ndĂ«rsa nĂ« testin DataStax vetĂ«m nga 4. Nga ana tjetĂ«r, ata kanĂ« dysk SSD, ndĂ«rsa ne kemi HDD dhe njĂ« version mĂ« tĂ« ri tĂ« HBase, dhe shfrytĂ«zimi i CPU gjatĂ« ngarkesĂ«s rritet praktikisht shumĂ« pak (vizualisht nga 5-10 pĂ«rqind). SidoqoftĂ«, do tĂ« pĂ«rpiqemi tĂ« startojmĂ« nĂ« kĂ«tĂ« konfigurim. CilĂ«simet e tabelave janĂ« pĂ«rparĂ«sisht, leximi kryhet nĂ« njĂ« interval çelesh nga 0 deri nĂ« 50 milion, nĂ« mĂ«nyrĂ« rastĂ«sore (dmth, pĂ«r sonin e vĂ«rtetĂ« çdo herĂ« njĂ« tĂ« ri). NĂ« tabelĂ« ka 50 milion regjistrime, tĂ« ndara nĂ« 64 pjesĂ«. ÇelĂ«sat janĂ« hash-uar sipas crc32. CilĂ«simet e tabelave janĂ« standarde, MSLAB Ă«shtĂ« aktiv. Duke filluar 40 rrjedha, secila rrjedhĂ« lexon njĂ« set prej 100 çelĂ«sash tĂ« rastĂ«sishĂ«m dhe menjĂ«herĂ« shkruan 100 byte tĂ« gjeneruara pas kĂ«tyre çelĂ«save.

Teoria dhe praktika e përdorimit të HBase
Stendi: 16 DataNode dhe 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 rrjedha). Versioni HBase 1.2.0-cdh5.14.2.

Rezultati mesatar Ă«shtĂ« mĂ« afĂ«r 40 mijĂ« operacioneve nĂ« sekondĂ«, qĂ« Ă«shtĂ« ndjeshĂ«m mĂ« mirĂ« sesa nĂ« testin DataStax. MegjithatĂ«, pĂ«r qĂ«llime eksperimentale, mund tĂ« ndryshojmĂ« pak kushtet. ËshtĂ« tepĂ«r e pabesueshme qĂ« tĂ« gjithĂ« punĂ«t do tĂ« kryhen ekskluzivisht me njĂ« tabelĂ« dhe vetĂ«m me çelĂ«sa unikĂ«. Le tĂ« supozojmĂ« se ka njĂ« grup 'tĂ« nxehtĂ«' çelĂ«sash qĂ« gjeneron ngarkesĂ«n kryesore. Prandaj, do tĂ« pĂ«rpiqemi tĂ« krijojmĂ« ngarkesĂ« me regjistrime mĂ« tĂ« mĂ«dha (10 KB), gjithashtu nĂ« grupe prej 100, nĂ« 4 tabela tĂ« ndryshme dhe duke kufizuar intervalin e çelĂ«save tĂ« kĂ«rkuar nĂ« 50 mijĂ«. NĂ« grafikun mĂ« poshtĂ« tregohet startimi i 40 rrjedhave, secila rrjedhĂ« lexon njĂ« set prej 100 çelĂ«sash dhe menjĂ«herĂ« shkruan tĂ« rastĂ«sishme 10 KB pas kĂ«tyre çelĂ«save pĂ«rsĂ«ri.

Teoria dhe praktika e përdorimit të HBase
Stendi: 16 DataNode dhe 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 rrjedha). Versioni HBase 1.2.0-cdh5.14.2.

Gjatë ngarkesës, disa herë është startuar kompakti major, siç u tregua më sipër, pa këtë procedurë performanca do të degradojë gradualisht, megjithatë gjatë ekzekutimit ndodhen gjithashtu ngarkesa shtesë. Rëniet shkaktohen nga shkak të ndryshëm. Ndonjëherë rrjedhat përfundonin punën dhe ndërsa ato rinisnin, ndodhte një pauzë, ndonjëherë aplikacione të tjera krijonin ngarkesë në klaster.

Leximi dhe menjëherë shkruaj, është një nga skenarët më të vështirë për punë për HBase. Nëse bëhen vetëm kërkesa put me madhësi të vogla, për shembull nga 100 byte, duke i bashkuar ato në paketa prej 10-50 mijë copësh, mund të arrihen qindra mijëra operacione në sekondë dhe ashtu ndodhin gjërat me kërkesat vetëm për lexim. Duhet të theksohet se rezultatet janë radikalisht më të mira se ato që u arritën nga DataStax kryesisht për shkak të kërkesave në grupe prej 50 mijë.

Teoria dhe praktika e përdorimit të HBase
Stendi: 16 DataNode dhe 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 rrjedha). Versioni HBase 1.2.0-cdh5.14.2.

10. Përfundime

Ky sistem konfiguracioni është mjaft fleksibël, megjithatë ndikimi i një numri të madh parametrash mbetet ende i panjohur. Disa prej tyre janë testuar, por nuk janë përfshirë në grupin e rezultateve. Për shembull, eksperimet preliminare treguan një rëndësi të vogël për parametrin si DATA_BLOCK_ENCODING, i cili kodon informacionin duke përdorur vlerat nga qelizat fqinje, gjë që është mjaft e shpjegueshme për të dhënat e gjeneruara në mënyrë të rastësishme. Në rastin e përdorimit të një numri të madh objektesh të përsëritura, fitimi mund të jetë i konsiderueshëm. Në përgjithësi, mund të thuhet se HBase bëhet një bazë të dhënash që duket mjaft serioze dhe e menduar, e cila gjatë operacioneve me blloqe të mëdha të të dhënave mund të jetë mjaft e fuqishme. Sidomos nëse ka mundësi të ndahen në kohë proceset e leximit dhe shkrimit.

Nëse mendoni se ndonjë gjë nuk është shpjeguar mjaftueshëm, jam i gatshëm të flas më shumë. E inkurajojmë të ndajmë përvojën tonë ose të diskutojmë nëse nuk pajtoheni me diçka.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster