Hej! Jag heter Danil Lipovoy, och vÄrt team pÄ Sbertech har börjat anvÀnda HBase som ett datalagringssystem. Under studiet av detta har vi samlat erfarenhet som vi ville systematisera och beskriva (vi hoppas att det blir till nytta för mÄnga). Alla experiment som beskrivs nedan utfördes med versionerna HBase 1.2.0-cdh5.14.2 och 2.0.0-cdh6.0.0-beta1.
- Ăvergripande arkitektur
- Skriva data till HBASE
- LÀsa data frÄn HBASE
- Cachning av data
- Batchbehandling av data MultiGet/MultiPut
- Strategi för uppdelning av tabeller i regioner (splitting)
- TÄlighet, komprimering och lokalitet av data
- InstÀllningar och prestanda
- Belastningstestning
- Slutsatser
1. Ăvergripande arkitektur

En reserv Master övervakar heartbeat frÄn den aktiva pÄ noden ZooKeeper och tar över masterfunktionen i hÀndelse av att den avaktiveras.
2. Skriva data till HBASE
Först tittar vi pĂ„ det enklaste fallet â att skriva ett nyckel-vĂ€rde-objekt till en viss tabell med hjĂ€lp av put(rowkey). Klienten mĂ„ste först ta reda pĂ„ var den rotregioner servern (Root Region Server â RRS) ligger, som lagrar tabellen hbase:meta. Denna information fĂ„r den frĂ„n ZooKeeper. DĂ€refter kontaktar den RRS och lĂ€ser tabellen hbase:meta, frĂ„n vilken den hĂ€mtar information om vilken RegionServer (RS) som ansvarar för att lagra data för den angivna nyckeln rowkey i den tabell som intresserar den. För framtida anvĂ€ndning cachar klienten metatabellen, och dĂ€rför gĂ„r de efterföljande förfrĂ„gningarna snabbare, direkt till RS.
DÀrefter skriver RS, efter att ha mottagit förfrÄgan, först in den i WriteAheadLog (WAL), vilket Àr nödvÀndigt för ÄterstÀllning vid ett systemhaveri. Sedan sparas data i MemStore. Detta Àr en minnesbuffer som innehÄller en sorterad uppsÀttning nycklar för denna region. Tabellen kan delas upp i regioner (partitioner), som var och en innehÄller en icke-överliggande uppsÀttning nycklar. Detta tillÄter, genom att placera regionerna pÄ olika servrar, att uppnÄ högre prestanda. Men trots att denna slutsats Àr uppenbar, kommer vi att se att det inte alltid fungerar pÄ detta sÀtt.
Efter att posten har lagts i MemStore fÄr klienten en bekrÀftelse pÄ att posten har sparats framgÄngsrikt. Den sparas dock egentligen bara i bufferten och kommer att överföras till disken först efter att en viss tidsperiod har passerat eller nÀr den har fyllts med nya data.

Vid utförandet av operationen "Delete" sker ingen fysisk radering av data. De markeras helt enkelt som raderade, och sjÀlva förstörelsen sker vid anrop av funktionen major compact, som beskrivs mer detaljerat i punkt 7.
Filer i HFile-format samlas i HDFS och med jÀmna mellanrum körs processen minor compact, som helt enkelt sammanfogar smÄ filer till större utan att radera nÄgot. Med tiden blir detta ett problem som endast visar sig vid lÀsning av data (detta kommer vi att Äterkomma till senare).
Förutom den beskrivna uppladdningsprocessen finns det en mycket effektivare procedur, som utgör kanske den starkaste sidan av denna databas â BulkLoad. Det handlar om att vi sjĂ€lva skapar HFiles och lĂ€gger in dem pĂ„ disken, vilket tillĂ„ter utmĂ€rkt skalning och uppnĂ„else av ganska anstĂ€ndiga hastigheter. I princip Ă€r det inte HBase som sĂ€tter grĂ€nser hĂ€r, utan hĂ„rdvarans kapabiliteter. Nedan visas resultaten av uppladdningen pĂ„ en kluster bestĂ„ende av 16 RegionServers och 16 NodeManager YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 trĂ„dar), version HBase 1.2.0-cdh5.14.2.

HÀr kan vi se att genom att öka antalet partitioner (regioner) i tabellen samt Spark-exekverare fÄr vi en ökning av uppladdningshastigheten. Hastigheten beror ocksÄ pÄ skrivvolymen. Stora block ger en ökning i mÄtt av MB/s, medan smÄ block ökar antalet inskrivna poster per tidsenhet, vid övriga lika förhÄllanden.
Det Ă€r ocksĂ„ möjligt att starta uppladdning i tvĂ„ tabeller samtidigt och fĂ„ en dubblering av hastigheten. Nedan kan vi se att skrivningen av 10 KB block direkt i tvĂ„ tabeller gĂ„r med en hastighet pĂ„ cirka 600 Mb/s i varje (totalt 1275 Mb/s), vilket stĂ€mmer överens med skrivhastigheten i en tabell pĂ„ 623 MB/s (se punkt â11 ovan).

Den andra körningen med 50 KB-inspelningar visar att uppladdningshastigheten ökar endast i begrÀnsad utstrÀckning, vilket indikerar att vi nÀrmar oss de maximala vÀrdena. HÀrvid bör man ha i Ätanke att HBASE i princip inte belastas alls, allt som krÀvs frÄn den Àr att först returnera data frÄn hbase:meta, och efter inlagan av HFiles, tömma BlockCache och spara MemStore-bufferten pÄ disken, om den inte Àr tom.
3. LÀsa data frÄn HBASE
Om vi antar att all information frÄn hbase:meta redan finns hos kunden (se p.2), gÄr förfrÄgan direkt till den RS dÀr den önskade nyckeln lagras. Först sker sökningen i MemCache. Oavsett om det finns data dÀr eller inte, sker sökningen ocksÄ i BlockCache och vid behov i HFiles. Om data hittas i filen placeras de i BlockCache och kommer att returneras snabbare vid nÀsta förfrÄgan. Sökningen i HFile sker relativt snabbt tack vare anvÀndningen av en Bloom-filter, det vill sÀga genom att lÀsa en liten mÀngd data kan det direkt avgöra om denna fil innehÄller den önskade nyckeln, och om inte, gÄr det vidare till nÀsta.

NÀr data har erhÄllits frÄn dessa tre kÀllor bildar RS svaret. I synnerhet kan det skicka flera hittade versioner av objektet om kunden har begÀrt versionering.
4. Cachning av data
Buffrarna MemStore och BlockCache tar upp till 80% av den tilldelade on-heap-minnet pÄ RS (resten Àr reserverat för tjÀnsteuppgifter i RS). Om den typiska anvÀndningen Àr sÄdan att processer skriver och omedelbart lÀser dessa samma data, Àr det meningsfullt att minska BlockCache och öka MemStore, eftersom data vid skrivning inte gÄr in i lÀscachen, vilket gör att anvÀndningen av BlockCache blir mindre frekvent. BlockCache-bufferten bestÄr av tvÄ delar: LruBlockCache (alltid on-heap) och BucketCache (vanligtvis off-heap eller pÄ SSD). BucketCache bör anvÀndas nÀr det finns mÄnga lÀsningsförfrÄgningar som inte fÄr plats i LruBlockCache, vilket leder till aktivt arbete av Garbage Collector. Vid detta tillfÀlle bör man inte förvÀnta sig en radikal ökning av prestanda frÄn anvÀndningen av lÀs-cache, men vi Äterkommer till detta i p. 8.

BlockCache Àr gemensam för hela RS, medan MemStore Àr specifik för varje tabell (en för varje Column Family).
Hur I teorin gÄr data inte in i cachen vid skrivning och faktiskt Àr sÄdana parametrar CACHE_DATA_ON_WRITE för tabellen och 'Cache DATA on Write' för RS instÀllda pÄ false. Men i praktiken, om man skriver data till MemStore, sedan spolar det till disk (ÄterstÀller dÀrmed), för att sedan ta bort den resulterande filen, kommer en get-förfrÄgan framgÄngsrikt att returnera data. Dessutom, Àven om BlockCache helt stÀngs av och tabellen fylls med nya data, för att sedan uppnÄ en spoling av MemStore till disk, radera dem och be om dem frÄn en annan session, kommer de ÀndÄ att hÀmtas frÄn nÄgonstans. SÄ HBase lagrar inte bara data utan Àven mystiska mysterier.
hbase(main):001:0> create 'ns:magic', 'cf'
Skapade tabell ns:magic
Tog 1.1533 sekunder
hbase(main):002:0> put 'ns:magic', 'key1', 'cf:c', 'try_to_delete_me'
Tog 0.2610 sekunder
hbase(main):003:0> flush 'ns:magic'
Tog 0.6161 sekunder
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
Parametern "Cache DATA on Read" Àr instÀlld pÄ false. Om det finns idéer, vÀlkomna att diskutera detta i kommentarerna.
5. Batchbearbetning av data MultiGet/MultiPut
Bearbetning av enskilda förfrÄgningar (Get/Put/Delete) Àr en ganska kostsam operation, sÄ det Àr bÀst att gruppera dem i List eller List, vilket ger en betydande prestandaökning. Detta gÀller sÀrskilt för skrivoperationer, men vid lÀsning finns följande fallgropp. I diagrammet nedan visas tiden för att lÀsa 50 000 poster frÄn MemStore. LÀsningen utfördes i en trÄd och pÄ den horisontella axeln visas antalet nycklar i förfrÄgan. HÀr kan vi se att nÀr antalet nycklar i en förfrÄgan ökar till tusen, minskar exekveringstiden, det vill sÀga hastigheten ökar. Men med standardlÀget för MSLAB börjar prestandan falla kraftigt efter denna tröskel, och ju större datamÀngden i posten Àr, desto mer ökar arbetstiden.

Tester utfördes pÄ en virtuell maskin med 8 kÀrnor, version HBase 2.0.0-cdh6.0.0-beta1.
MSLAB-lÀget syftar till att minska fragmenteringen av heap, vilket uppstÄr genom blandning av nya och gamla generationers data. För att lösa problemet, nÀr MSLAB Àr aktiverat, placeras data i relativt smÄ celler (chunk) och bearbetas i portioner. Som ett resultat, nÀr volymen i den begÀrda datapaketet överskrider den tilldelade storleken, minskar prestandan kraftigt. à andra sidan Àr det inte önskvÀrt att stÀnga av detta lÀge, eftersom det kan leda till stopp pÄ grund av GC vid intensiva databehandlingsmoment. En bra lösning Àr att öka storleken pÄ cellerna vid aktiv skrivning med put samtidigt som man lÀser. Det bör noteras att problemet inte uppstÄr om man efter skrivningen utför flush-kommandot som överför MemStore till disken eller om data laddas med hjÀlp av BulkLoad. I tabellen nedan visas att förfrÄgningar frÄn MemStore med större datamÀngder (och samma antal) leder till fördröjningar. Men genom att öka chunksize ÄterfÄr vi bearbetningstiden till det normala.

Förutom att öka chunksize Àr det ocksÄ effektivt att dela upp data efter regioner, det vill sÀga tabellsplittring. Detta innebÀr att varje region fÄr fÀrre förfrÄgningar och om de placeras i en cell, förblir svarstiden bra.
6. Strategi för att dela upp tabeller i regioner (splittring)
Eftersom HBase Àr en nyckel-vÀrde lagringslösning och partitioneringen sker baserat pÄ nyckel, Àr det mycket viktigt att fördela data jÀmnt över alla regioner. Till exempel kommer partitionering av en sÄdan tabell i tre delar att resultera i att data delas upp i tre regioner:

Det hÀnder att detta leder till en kraftig nedgradering, om den data som laddas in senare mestadels bestÄr av long-vÀrden som börjar med samma siffra, till exempel:
1000001
1000002
âŠ
1100003
Eftersom nycklarna lagras i form av byte-arrayer, kommer alla att börja likadant och tillhöra en region #1 som lagrar detta nyckelintervall. Det finns flera strategier för splittring:
HexStringSplit â Konverterar nyckeln till en strĂ€ng med hexadecimalt kodande inom intervallet «00000000» => «FFFFFFFF» och fyller vĂ€nster med nollor.
UniformSplit â Konverterar nyckeln till en byte-array med hexadecimalt kodande inom intervallet «00» => «FF» och fyller höger med nollor.
Dessutom kan man ange vilket intervall eller uppsÀttning av nycklar som helst för splittring och konfigurera automatisk splittring. Men en av de enklaste och mest effektiva metoderna Àr UniformSplit och att anvÀnda hash-konkatenation, till exempel den högsta byte-paret frÄn körningen av nyckeln genom CRC32(rowkey) funktionen och sjÀlva rowkey:
hash + rowkey
DÄ kommer alla data att fördelas jÀmnt över regionerna. Vid lÀsning kastas de första tvÄ bytesen helt enkelt bort och den ursprungliga nyckeln kvarstÄr. RS kontrollerar Àven mÀngden data och nycklar i regionen och bryter automatiskt upp den i delar nÀr grÀnserna överskrids.
7. Felresiliens och datalokalisering
Eftersom varje nyckelset bara ansvarar för en region Àr lösningen pÄ problem relaterade till RS-nederlag eller nedlÀggning att lagra all nödvÀndig data i HDFS. Vid ett RS-nederlag upptÀcker master detta genom att inte fÄ nÄgon heartbeat frÄn ZooKeeper-noden. DÄ tilldelar den en annan RS den drabbade regionen, och eftersom HFiles lagras i ett distribuerat filsystem, sÄ lÀser den nya Àgaren dem och fortsÀtter att betjÀna data. Emellertid, eftersom en del data kan vara i MemStore och Ànnu inte har kommit in i HFiles, anvÀnds WAL för att ÄterstÀlla operationernas historik, som ocksÄ lagras i HDFS. Efter att förÀndringar har genomförts kan RS svara pÄ förfrÄgningar, men flyttningen innebÀr att en del data och processer som hanterar dem hamnar pÄ olika noder, vilket reducerar lokalitet.
Lösningen pĂ„ problemet Ă€r major compaction â denna procedur flyttar filer till de noder som ansvarar för dem (dit dĂ€r deras regioner ligger), vilket resulterar i att belastningen pĂ„ nĂ€tverket och diskarna ökar kraftigt under denna procedur. Men senare förbĂ€ttras Ă„tkomsten till data markant. Dessutom utför major_compaction en sammanslagning av alla HFiles till en enda fil inom regionen och rensar data beroende pĂ„ tabellinstĂ€llningarna. Till exempel kan du stĂ€lla in antalet versioner av ett objekt som ska sparas eller dess livslĂ€ngd, efter vilken objektet tas bort fysiskt.
Denna procedur kan ha en mycket positiv effekt pÄ HBase:s prestanda. PÄ bilden nedan kan man se hur prestandan försÀmrades till följd av aktiv dataskrivning. HÀr syns hur 40 trÄdar skrev till en tabell och 40 trÄdar lÀste data samtidigt. Skrivraven genererar fler och fler HFiles som lÀses av andra trÄdar. Som resultat mÄste allt fler data tas bort frÄn minnet och till slut startar GC, som i stort sett lamnar hela arbetet. Starten av major compaction ledde till rensning av de uppkomna avlagringarna och ÄterstÀllande av prestandan.

Testet utfördes pÄ 3 DataNode och 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 trÄdar). HBase version 1.2.0-cdh5.14.2
Det Àr vÀrt att notera att major compaction kördes pÄ en "levande" tabell dÀr data aktivt skrivits och lÀsts. Det har pÄstÄtts pÄ nÀtet att detta kan leda till felaktiga svar vid lÀsning av data. För att verifiera detta startades en process som genererade nya data och skrev dem till tabellen. DÀrefter lÀstes dessa data omedelbart och jÀmfördes med det som hade skrivits. Under denna process kördes major compaction cirka 200 gÄnger och inga fel registrerades. Problemet kan eventuellt upptrÀda sÀllan och endast vid hög belastning, dÀrför Àr det mer sÀkert att planera stopp av skriv- och lÀsprocesser och utföra rensning för att undvika sÄdana GC-fall.
Dessutom pÄverkar major compaction inte tillstÄndet för MemStore; för att spola dess innehÄll till disk och kompaktera mÄste flush anvÀndas (connection.getAdmin().flush(TableName.valueOf(tblName))).
8. InstÀllningar och prestanda
Som redan nÀmnts visar HBase störst framgÄng dÀr det inte behöver utföra nÄgra ÄtgÀrder, vid anvÀndning av BulkLoad. Detta gÀller dock de flesta system och mÀnniskor. Men detta verktyg Àr mer lÀmpligt för massinsÀttning av data i stora block, medan om processen krÀver utförande av mÄnga konkurrerande lÀsa- och skrivförfrÄgningar anvÀnds de ovan beskrivna kommandona Get och Put. För att faststÀlla optimala parametrar genomfördes körningar med olika kombinationer av tabellparametrar och instÀllningar:
- 10 trÄdar kördes samtidigt tre gÄnger i rad (lÄt oss kalla detta en trÄdblock).
- Körtiden för alla trÄdar i blocket genomsnittades och var det slutgiltiga resultatet av blockets arbete.
- Alla trÄdar arbetade med samma tabell.
- Innan varje körning av trÄdblock utfördes en major compaction.
- Varje block utförde endast en av följande operationer:
â Put
â Get
â Get+Put
- Varje block utförde 50 000 upprepningar av sin operation.
- Storleken pÄ en post i blocket var 100 byte, 1000 byte eller 10000 byte (slumptal).
- Blocken kördes med varierande antal begÀrda nycklar (antingen en nyckel eller 10).
- Blocken kördes med olika tabellinstÀllningar. Följande parametrar Àndrades:
â BlockCache = aktiverad eller inaktiverad
â BlockSize = 65 KB eller 16 KB
â Partitioner = 1, 5 eller 30
â MSLAB = aktiverad eller inaktiverad
SÄ hÀr ser blocket ut:
a. MSLAB-lÀge aktiverades/avaktiverades.
b. En tabell skapades dÀr följande parametrar stÀlldes in: BlockCache = true/none, BlockSize = 65/16 Kb, Partitioner = 1/5/30.
c. GZ-komprimering stÀlldes in.
d. 10 trÄdar kördes samtidigt som utförde 1/10 operationer put/get/get+put till denna tabell med poster pÄ 100/1000/10000 byte, vilket resulterade i 50 000 pÄ varandra följande förfrÄgningar (nycklar slumpmÀssiga).
e. Punkt d upprepades tre gÄnger.
f. Den genomsnittliga körtiden för alla trÄdar berÀknades.
Alla möjliga kombinationer testades. Det var förutsÀgbart att med ökad poststorlek skulle hastigheten minska eller att inaktivering av cachelagring skulle leda till en nedgÄng. MÄlet var dock att förstÄ graden och betydelsen av pÄverkan av varje parameter, dÀrför matades de insamlade uppgifterna in i en linjÀr regressionsfunktion, vilket möjliggör att uppskatta tillförlitligheten med hjÀlp av t-statistik. Nedan framgÄr resultaten frÄn block som utför operationer Put. Den fullstÀndiga uppsÀttningen kombinationer 2*2*3*2*3 = 144 alternativ + 72, eftersom vissa genomfördes tvÄ gÄnger. SÄledes blev det sammanlagt 216 körningar:

Testning utfördes pÄ en mini-kluster bestÄende av 3 DataNodes och 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 trÄdar). HBase-version 1.2.0-cdh5.14.2.
Den högsta insÀttningstakten pÄ 3,7 sekunder uppnÄddes nÀr MSLAB-lÀget var avstÀngt, pÄ en tabell med en partition, med BlockCache aktiverat, BlockSize = 16, poster pÄ 100 byte i grupper om 10.
Den lÀgsta insÀttningstakten pÄ 82,8 sekunder uppnÄddes nÀr MSLAB-lÀget var aktiverat, pÄ en tabell med en partition, med BlockCache aktiverat, BlockSize = 16, poster pÄ 10000 byte i enstaka.
Nu ska vi titta pÄ modellen. Vi ser en bra kvalitet av modellen enligt R2, men det Àr helt klart att extrapolering hÀr inte rekommenderas. Det verkliga beteendet hos systemet vid parameterförÀndringar kommer att vara icke-linjÀrt, denna modell behövs inte för prognoser, utan för att förstÄ vad som hÀnde inom angivna parametrar. Till exempel ser vi hÀr enligt Student-kriteriet att för operationen Put har parametrarna BlockSize och BlockCache ingen betydelse (vilket Àr ganska förutsÀgbart):

Det Àr ganska ovÀntat att en ökning av antalet partitioner leder till en minskning av prestanda (vi har redan sett den positiva effekten av att öka antalet partitioner vid BulkLoad), Àven om det Àr förklarligt. För det första innebÀr det att man mÄste formulera förfrÄgningar till 30 regioner istÀllet för en, och datavolymen Àr inte tillrÀckligt stor för att ge vinst. För det andra definieras den totala svartiden av den lÄngsammaste RS, och eftersom antalet DataNodes Àr mindre Àn antalet RS har vissa regioner noll lokalitet. LÄt oss ocksÄ titta pÄ topp fem:

Nu fÄr vi utvÀrdera resultaten frÄn Get-blocken:

Antalet partitioner har förlorat sin betydelse, vilket troligen beror pÄ att datan cachas vÀl och att cachen för lÀsning Àr den mest betydelsefulla (statistiskt sett) parametern. Naturligtvis Àr det ocksÄ mycket fördelaktigt för prestandan att öka antalet meddelanden i förfrÄgan. BÀsta resultaten:

Och slutligen, lÄt oss titta pÄ modellen för blocket som först utförde get och sedan put:

HÀr Àr alla parametrar signifikanta. Och resultaten för ledarna:

9. Belastningstestning
Och slutligen ska vi köra en mer eller mindre anstĂ€ndig belastning, men det Ă€r alltid mer intressant nĂ€r man har nĂ„got att jĂ€mföra med. PĂ„ DataStax webbplats â den nyckelutvecklare för Cassandra - finns det NT av flera NoSQL-lagringar, inklusive HBase version 0.98.6-1. Inladdningen genomfördes med 40 trĂ„dar, datastorleken var 100 byte, SSD-diskar. Resultaten av testningen av Read-Modify-Write-operationerna visade följande resultat.

SÄvitt jag förstÄr genomfördes lÀsningen i block om 100 poster och för 16 noder visade DataStax test av HBase en prestanda pÄ 10 000 operationer per sekund.
Det Àr tur att vÄr kluster ocksÄ har 16 noder, men det Àr inte sÄ "turigt" att varje noder har 64 kÀrnor (trÄdar), medan i DataStax-testet har de bara 4. à andra sidan har de SSD-diskar, medan vi har HDD, och en nyare version av HBase, och CPU-anvÀndning under belastning ökade i stort sett inte mÀrkbart (visuellt med 5-10 procent). Men vi kommer ÀndÄ att försöka köra med denna konfiguration. StandardtabellinstÀllningar, lÀsning utförs inom nyckelintervallet frÄn 0 till 50 miljoner slumpmÀssigt (dvs. i grund och botten varje gÄng nya). Tabellen innehÄller 50 miljoner poster, uppdelade i 64 partitioner. Nycklarna Àr hashade med crc32. TabellinstÀllningarna Àr standard, MSLAB Àr aktiverat. 40 trÄdar startas, varje trÄd lÀser en uppsÀttning av 100 slumpmÀssiga nycklar och skriver omedelbart de genererade 100 byte till dessa nycklar.

Stand: 16 DataNode och 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 trÄdar). Version HBase 1.2.0-cdh5.14.2.
Det genomsnittliga resultatet ligger nÀrmare 40 000 operationer per sekund, vilket Àr avsevÀrt bÀttre Àn i DataStax-testet. Men för experimentets skull kan villkoren Àndras nÄgot. Det Àr ganska osannolikt att allt arbete kommer att utföras uteslutande med en tabell, och endast med unika nycklar. Anta att det finns en viss "het" uppsÀttning nycklar som genererar den största belastningen. DÀrför kommer vi att försöka skapa belastning med större poster (10 KB), ocksÄ i batchar om 100, i 4 olika tabeller och begrÀnsa nyckelintervallet till 50 000. PÄ grafen nedan visas starten av 40 trÄdar, varje trÄd lÀser en uppsÀttning av 100 nycklar och skriver omedelbart slumpmÀssiga 10 KB till dessa nycklar tillbaka.

Stand: 16 DataNode och 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 trÄdar). Version HBase 1.2.0-cdh5.14.2.
Under belastningen genomfördes flera gÄnger major compaction, som visades ovan utan denna procedur kommer prestandan gradvis att försÀmras, men under genomförandet uppstÄr ocksÄ en ytterligare belastning. Dips orsakas av olika skÀl. Ibland avslutade trÄdarna sitt arbete och medan de startades om uppstod det en paus, ibland skapade externa applikationer belastning pÄ klustret.
Att lÀsa och skriva direkt Àr ett av de mest krÀvande arbetsmönstren för HBase. Om man gör endast smÄ put-förfrÄgningar, till exempel 100 byte vardera, genom att kombinera dem i paket om 10-50 tusen, kan man uppnÄ hundratusentals operationer per sekund och likasÄ gÀller det för förfrÄgningar enbart för lÀsning. Det Àr vÀrt att notera att resultaten Àr radikalt bÀttre Àn de som erhölls av DataStax, frÀmst tack vare blockförfrÄgningar om 50 tusen.

Stand: 16 DataNode och 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 trÄdar). Version HBase 1.2.0-cdh5.14.2.
10. Slutsatser
Detta system kan konfigureras ganska flexibelt, men pÄverkan av ett stort antal parametrar Àr fortfarande oklar. Delar av dem har testats, men ingick inte i det slutgiltiga testsetet. Till exempel visade preliminÀra experiment en liten betydelse av parametern DATA_BLOCK_ENCODING, som kodar information genom att anvÀnda vÀrden frÄn nÀrliggande celler, vilket Àr helt förstÄeligt för slumpmÀssigt genererade data. I fallet med anvÀndning av ett stort antal upprepande objekt kan vinsten bli betydande. Generellt kan man sÀga att HBase ger intrycket av att vara en ganska seriös och genomtÀnkt databas som kan vara tillrÀckligt presterande vid operationer med stora datablokker. SÀrskilt om det finns möjlighet att sprida lÀs- och skrivprocesserna över tid.
Om du anser att nÄgot inte Àr tillrÀckligt utförligt, Àr jag redo att berÀtta mer. Vi föreslÄr att ni delar med er av er erfarenhet eller diskuterar om ni inte hÄller med om nÄgot.
KĂ€lla: habr.com
