Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Ny fampisehoana avo dia iray amin'ireo fepetra fototra rehefa miasa miaraka amin'ny angona lehibe. Ao amin'ny sampan-draharahan'ny fametahana angon-drakitra ao amin'ny Sberbank, dia saika ny fifampiraharahana rehetra no alefanay ao amin'ny Cloud Data miorina amin'ny Hadoop ary noho izany dia miatrika fampahafantarana be dia be izahay. Mazava ho azy fa mitady fomba hanatsarana ny fampandehanana foana izahay, ary ankehitriny dia te-hilaza aminao ny fomba nahavitanay ny fametahana ny RegionServer HBase sy ny mpanjifa HDFS, noho izany dia afaka nampitombo be ny hafainganam-pandehan'ny famakiana.
Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Na izany aza, alohan'ny hirosoana amin'ny fototry ny fanatsarana dia ilaina ny miresaka momba ny fameperana izay, amin'ny ankapobeny, dia tsy azo esorina raha mipetraka amin'ny HDD ianao.

Nahoana no tsy mifanaraka ny HDD sy ny famakiana Random Access haingana
Araka ny fantatrao, ny HBase, sy ny angon-drakitra maro hafa, dia mitahiry angon-drakitra amin'ny sakana misy kilobytes am-polony. Amin'ny alΓ lan'ny default dia manodidina ny 64 KB. Andeha hojerentsika izao fa mila mahazo 100 bytes fotsiny isika ary mangataka amin'ny HBase hanome antsika an'io data io amin'ny fampiasana fanalahidy iray. Koa satria 64 KB ny haben'ny sakana ao amin'ny HFiles, dia ho 640 heny ny fangatahana (minitra fotsiny!)

Manaraka, satria ny fangatahana dia handeha amin'ny HDFS sy ny mekanisma caching metadata ShortCircuitCache (izay ahafahana miditra mivantana amin'ny rakitra), izany dia mitarika amin'ny famakiana efa 1 MB avy amin'ny kapila. Na izany aza, izany dia azo ahitsy amin'ny parameter dfs.client.read.shortcircuit.buffer.size ary amin'ny tranga maro dia misy dikany ny fampihenana io sanda io, ohatra amin'ny 126 KB.

Aoka hatao hoe manao izany isika, fa ankoatra izany, rehefa manomboka mamaky angon-drakitra amin'ny alΓ lan'ny java api isika, toy ny fiasa toy ny FileChannel.read ary angataho ny rafitra fandidiana mba hamaky ny habetsaky ny angon-drakitra voatondro, dia mivaky "raha sanatria" in-2 bebe kokoa. , i.e. 256 KB amin'ity tranga ity. Izany dia satria ny java dia tsy manana fomba mora hametrahana ny saina FADV_RANDOM mba hisorohana izany fihetsika izany.

Vokatr'izany, mba hahazoana 100 bytes, 2600 heny no vakiana ao ambanin'ny saron-tava. Toa hita fa miharihary ny vahaolana, andao hampihena ny haben'ny sakana ho kilobyte, hametraka ny sainam-pirenena voatonona ary hahazo fanafainganana lehibe. Ny olana anefa dia ny fampihenana in-2 ny haben'ny sakana dia ahena in-2 ihany koa ny isan'ny bytes vakiana isaky ny fotoana.

Ny tombony sasany amin'ny fametrahana ny saina FADV_RANDOM dia azo alaina, saingy amin'ny alΓ lan'ny kofehy marobe avo lenta sy amin'ny haben'ny sakana 128 KB, fa avo roa heny isan-jato izany:

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Ny fitsapana dia natao tamin'ny rakitra 100, 1 GB ny haben'ny tsirairay ary hita amin'ny HDD 10.

Andeha isika hanao kajy izay azontsika, amin'ny ankapobeny, isaina amin'ity hafainganam-pandeha ity:
Andao atao hoe mamaky avy amin'ny kapila 10 amin'ny hafainganam-pandeha 280 MB/sec, i.e. 3 tapitrisa in 100 bytes. Saingy raha tadidintsika, ny angon-drakitra ilaintsika dia 2600 heny noho ny vakiana. Noho izany, mizara 3 tapitrisa amin'ny 2600 isika ary mahazo 1100 isa-tsegondra.

Mahakivy, sa tsy izany? Izany no natiora Fidirana an-tsokosoko fidirana amin'ny angona ao amin'ny HDD - na inona na inona haben'ny sakana. Io no fetra ara-batana amin'ny fidirana kisendrasendra ary tsy misy angon-drakitra afaka misintona bebe kokoa amin'ny toe-javatra toy izany.

Ahoana ary no ahazoan'ny databases ny hafainganam-pandeha ambony kokoa? Mba hamaliana io fanontaniana io, andeha hojerentsika ny zava-mitranga amin'ity sary manaraka ity:

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Hitantsika eto fa ao anatin'ny minitra vitsy voalohany ny hafainganam-pandeha dia tena eo amin'ny arivo firaketana isan-tsegondra. Na izany aza, ankoatra izany, noho ny zava-misy fa betsaka kokoa ny vakina noho ny nangatahana, ny angon-drakitra dia miafara amin'ny buff/cache an'ny rafitra miasa (linux) ary ny hafainganam-pandeha dia mitombo ho 60 arivo isan-tsegondra.

Noho izany, dia hiatrika ny fanafainganana ny fidirana afa-tsy ny angon-drakitra ao amin'ny cache OS na hita ao amin'ny fitahirizana SSD/NVMe amin'ny hafainganam-pandeha azo ampitahaina.

Amin'ity tranga ity dia hanao fitsapana amin'ny dabilio misy mpizara 4 izahay, izay samy voampanga toy izao manaraka izao:

CPU: Xeon E5-2680 v4 @ 2.40GHz 64 kofehy.
Memory: 730 GB.
java version: 1.8.0_111

Ary eto ny hevi-dehibe dia ny habetsaky ny angona ao amin'ny tabilao mila vakiana. Ny zava-misy dia raha mamaky angon-drakitra avy amin'ny latabatra iray izay napetraka tanteraka ao amin'ny cache HBase ianao, dia tsy ho tonga amin'ny famakiana ny buff/cache an'ny rafitra fandidiana. Satria ny HBase amin'ny alΓ lan'ny default dia manome 40% ny fahatsiarovana ho an'ny rafitra antsoina hoe BlockCache. Amin'ny ankapobeny dia ConcurrentHashMap ity, izay ny lakile dia ny anaran'ny rakitra + offset an'ny sakana, ary ny sandany dia ny angona marina amin'ity offset ity.

Noho izany, rehefa mamaky fotsiny avy amin'ity rafitra ity isika mahita hafainganam-pandeha tena tsara isika, toy ny fangatahana an-tapitrisany isan-tsegondra. Fa andeha hojerentsika fa tsy afaka manome fahatsiarovana an-jatony gigabytes ho an'ny filan'ny angona fotsiny isika, satria misy zavatra mahasoa maro hafa mandeha amin'ireo lohamilina ireo.

Ohatra, amin'ny tranga misy antsika, ny habetsaky ny BlockCache amin'ny RS iray dia manodidina ny 12 GB. Nandeha RS roa izahay tamin'ny node iray, i.e. 96 GB dia natokana ho an'ny BlockCache amin'ny nodes rehetra. Ary misy angon-drakitra im-betsaka, ohatra, avelao ho tabilao 4, faritra 130 tsirairay avy, izay misy rakitra 800 MB ny habeny, compresse amin'ny FAST_DIFF, i.e. 410 GB ny fitambarany (angona madio io, izany hoe tsy misy fiheverana ny anton'ny replication).

Noho izany, ny BlockCache dia eo amin'ny 23% amin'ny totalin'ny angon-drakitra manontolo ary izany dia manakaiky kokoa ny tena fepetra amin'ny antsoina hoe BigData. Ary eto no manomboka ny fahafinaretana - satria mazava ho azy, ny kely kokoa ny cache hits, ny ratsy ny fampisehoana. Rehefa dinihina tokoa, raha diso ianao, dia tsy maintsy manao asa be dia be - i.e. midina mankany amin'ny fiantsoana ny fiasan'ny rafitra. Na izany aza, tsy azo ialana izany, ka andeha hojerentsika ny lafiny hafa tanteraka - inona no mitranga amin'ny angona ao anaty cache?

Andao hanatsotra ny toe-javatra ary heverintsika fa manana cache izay mifanaraka amin'ny zavatra 1 fotsiny isika. Ity misy ohatra iray amin'ny zavatra hitranga rehefa manandrana miasa miaraka amin'ny volume data in-3 avo kokoa noho ny cache isika, dia tsy maintsy:

1. Apetraho ao anaty cache ny sakana 1
2. Esory ny sakana 1 amin'ny cache
3. Apetraho ao anaty cache ny sakana 2
4. Esory ny sakana 2 amin'ny cache
5. Apetraho ao anaty cache ny sakana 3

5 hetsika vita! Na izany aza, ity toe-javatra ity dia tsy azo antsoina hoe ara-dalΓ na; raha ny marina, manery ny HBase hanao andiana asa tsy misy ilana azy tanteraka izahay. Mamaky angona avy amin'ny cache OS tsy tapaka izy, mametraka azy ao amin'ny BlockCache, mba hanary azy avy hatrany satria tonga ny ampahany vaovao. Ny sary mihetsika eo amin'ny fiandohan'ny lahatsoratra dia mampiseho ny fototry ny olana - Miala amin'ny ambaratonga ny mpanangona fako, mihamafana ny atmosfera, tezitra i Greta kely any Soeda lavitra sy mafana. Ary izahay IT dia tena tsy tia rehefa malahelo ny ankizy, ka manomboka mieritreritra izay azonay atao momba izany.

Ahoana raha tsy ny bloc rehetra no apetrakao ao anaty cache, fa ny isan-jaton'izy ireo ihany, mba tsy hihoatra ny cache? Andeha isika hanomboka amin'ny fampidirana andalana vitsivitsy fotsiny amin'ny fanombohan'ny fiasa amin'ny fametrahana angona ao amin'ny BlockCache:

  public void cacheBlock(BlockCacheKey cacheKey, Cacheable buf, boolean inMemory) {
    if (cacheDataBlockPercent != 100 && buf.getBlockType().isData()) {
      if (cacheKey.getOffset() % 100 >= cacheDataBlockPercent) {
        return;
      }
    }
...

Ny teboka eto dia izao manaraka izao: ny offset dia ny toeran'ny sakana ao amin'ny rakitra ary ny isa farany dia mizara kisendrasendra sy mitovy amin'ny 00 ka hatramin'ny 99. Noho izany, ireo izay tafiditra ao anatin'ny faritra ilaintsika ihany no hotsidihana.

Ohatra, mametraka cacheDataBlockPercent = 20 ary jereo izay mitranga:

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Mazava ny vokany. Ao amin'ny grafika etsy ambany dia mazava ny antony nitrangan'ny fanafainganana toy izany - mitahiry loharanon-karena GC be dia be isika nefa tsy manao ny asan'ny Sisyphean amin'ny fametrahana angon-drakitra ao amin'ny cache mba hanipy azy avy hatrany any amin'ny lalan'ny alika maritiana:

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Mandritra izany fotoana izany, mitombo ny fampiasana CPU, saingy kely kokoa noho ny famokarana:

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Tsara ihany koa ny manamarika fa ny sakana voatahiry ao amin'ny BlockCache dia hafa. Ny ankamaroany, manodidina ny 95%, dia angon-drakitra mihitsy. Ary ny ambiny dia metadata, toy ny sivana Bloom na LEAF_INDEX ary Sns. Tsy ampy io angon-drakitra io, fa tena ilaina tokoa, satria alohan'ny hidirana mivantana amin'ny angon-drakitra dia mitodika any amin'ny meta ny HBase mba hahatakarana raha ilaina ny mikaroka bebe kokoa eto ary, raha izany, aiza marina no misy ny sakana mahaliana.

Noho izany, ao amin'ny code dia mahita fepetra fanamarinana isika buf.getBlockType().isData() ary noho ity meta ity dia avelanay ao anaty cache izany na ahoana na ahoana.

Andeha isika hampitombo ny entana ary hanamafy kely ny endri-javatra indray mandeha. Tamin'ny fitsapana voalohany dia nanao ny isan-jaton'ny cutoff = 20 ary ny BlockCache dia somary tsy nampiasaina. Andeha hojerentsika amin'ny 23% izany ary ampio kofehy 100 isaky ny 5 minitra hahitana hoe inona no mitranga:

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Eto isika dia mahita fa ny dikan-teny tany am-boalohany dia saika tonga hatrany amin'ny valindrihana amin'ny fangatahana 100 arivo isan-tsegondra. Fa ny patch dia manome fanafainganana hatramin'ny 300 arivo. Mandritra izany fotoana izany, mazava ho azy fa tsy "maimaim-poana" intsony ny fanafainganana bebe kokoa; mitombo ihany koa ny fampiasana CPU.

Na izany aza, tsy vahaolana tena kanto izany, satria tsy fantatsika mialoha hoe firy ny isan-jaton'ny sakana tokony hapetraka, miankina amin'ny mombamomba ny entana izany. Noho izany, nisy mekanika nampiharina mba hanitsiana ho azy an'io mari-pamantarana io arakaraka ny asan'ny famakiana.

Safidy telo no nampiana mba hifehezana izany:

hbase.lru.cache.heavy.eviction.count.limit - mamaritra hoe impiry ny fizotran'ny fandroahana angon-drakitra ao amin'ny cache alohan'ny hanombohantsika mampiasa optimization (izany hoe mitsambikina sakana). Amin'ny alΓ lan'ny default dia mitovy amin'ny MAX_INT = 2147483647 ary raha ny marina dia midika fa tsy hanomboka hiasa amin'io sanda io mihitsy ilay endri-javatra. Satria ny dingana fandroahana dia manomboka isaky ny 5 - 10 segondra (miankina amin'ny entana) ary 2147483647 * 10 / 60 / 60 / 24 / 365 = 680 taona. Na izany aza, azontsika atao ny mametraka an'io mari-pamantarana io ho 0 ary manao asa avy hatrany aorian'ny fandefasana ilay endri-javatra.

Na izany aza, misy ihany koa ny enta-mavesatra amin'ity parameter ity. Raha toa ny enta-mavesatsika ka ny famakiana fohy (milaza amin'ny antoandro) sy ny famakiana maharitra (amin'ny alina) dia mifanelanelana tsy tapaka, dia afaka mahazo antoka isika fa ny fampiasa dia tsy mandeha raha tsy rehefa mandeha ny asa famakiana lava be.

Ohatra, fantatsika fa ny famakiana fotoana fohy dia maharitra 1 minitra eo ho eo. Tsy ilaina ny manomboka manipy sakana, ny cache dia tsy hanam-potoana ho lany andro ary avy eo dia afaka mametraka izany parameter mitovy amin'ny, ohatra, 10. Izany dia hitarika ho amin'ny zava-misy fa ny optimization dia hanomboka hiasa raha tsy ela- nanomboka ny teny famakian-teny mavitrika, i.e. ao anatin'ny 100 segondra. Noho izany, raha manana vakiteny fohy isika, dia hiditra ao amin'ny cache ny sakana rehetra ary ho azo (afa-tsy ireo izay esorina amin'ny algorithm mahazatra). Ary rehefa manao vakiteny maharitra isika dia alefa ilay endri-javatra ary hanana fampisehoana ambony kokoa isika.

hbase.lru.cache.heavy.eviction.mb.size.limit β€” mametraka hoe firy megabytes tiantsika hapetraka ao anaty cache (ary mazava ho azy, handroaka) ao anatin'ny 10 segondra. Ny endri-javatra dia hiezaka hahatratra io sanda io ary hitazona azy io. Ny teboka dia izao: raha atsipintsika ny gigabytes ao anaty cache, dia tsy maintsy handroaka gigabytes isika, ary ity, araka ny hitantsika etsy ambony, dia lafo be. Na izany aza, tsy tokony hiezaka ny hametraka azy io kely loatra ianao, satria izany dia hahatonga ny fomba fandinganana sakana hivoaka aloha loatra. Ho an'ny mpizara matanjaka (eo amin'ny 20-40 cores ara-batana), dia tsara indrindra ny mametraka 300-400 MB. Ho an'ny kilasy antonony (~ 10 cores) 200-300 MB. Ho an'ny rafitra malemy (2-5 cores) 50-100 MB dia mety ho ara-dalΓ na (tsy voasedra amin'ireo).

Andeha hojerentsika ny fomba fiasan'izany: ndao atao hoe mametraka hbase.lru.cache.heavy.eviction.mb.size.limit = 500, misy karazana entana (mamaky) ary isaky ny ~ 10 segondra dia manao kajy ny isan'ny bytes. noroahina tamin'ny alalan'ny formula:

Overhead = Vola ota (MB) * 100 / fetra (MB) - 100;

Raha ny marina dia 2000 MB no voaroaka, dia mitovy amin'ny:

2000 * 100 / 500 - 100 = 300%

Ny algorithm dia manandrana mitazona tsy mihoatra ny am-polony isan-jato, noho izany dia hampihena ny isan-jaton'ny sakana voatahiry ilay endri-javatra, ka hampihatra mekanika auto-tuning.

Na izany aza, raha mihena ny entana dia aleo atao hoe 200 MB ihany no esorina ary lasa ratsy ny Overhead (ilay antsoina hoe overshooting):

200 * 100 / 500 - 100 = -60%

Mifanohitra amin'izany, hampitombo ny isan-jaton'ny sakana voatahiry ilay endri-javatra mandra-pahatongan'ny Overhead ho tsara.

Ity ambany ity ny ohatra iray amin'ny fomba fijery amin'ny angon-drakitra tena izy. Tsy ilaina ny manandrana mahatratra 0%, tsy azo atao izany. Tena tsara izany rehefa eo amin'ny 30 - 100% eo ho eo, manampy amin'ny fisorohana ny fivoahana aloha loatra amin'ny fomba fanatsarana mandritra ny fisondrotana fohy.

hbase.lru.cache.heavy.eviction.overhead.coefficient β€” mametraka ny fomba haingana tiantsika hahazoana ny vokatra. Raha fantatsika tsara fa lava be ny vakinay ary tsy te hiandry, dia afaka mampitombo io tahan'ny io izahay ary mahazo fampisehoana avo lenta kokoa.

Ohatra, mametraka ity coefficient ity isika = 0.01. Midika izany fa ny Overhead (jereo etsy ambony) dia ampitomboina amin'io isa io amin'ny vokatra azo ary hihena ny isan-jaton'ny sakana voatahiry. Andao atao hoe Overhead = 300% sy coefficient = 0.01, dia hihena 3% ny isan-jaton'ny bloc cache.

Ny lojika "Backpressure" mitovy amin'izany dia ampiharina ihany koa ho an'ny soatoavina Overhead ratsy (mihoatra). Satria azo atao foana ny fiovaovan'ny fotoana fohy amin'ny habetsahan'ny famakiana sy ny fandroahana, ity mekanika ity dia ahafahanao misoroka ny fivoahana aloha loatra amin'ny fomba fanatsarana. Ny backpressure dia manana lojika mivadika: ny mahery kokoa ny overshoot, ny sakana bebe kokoa voatahiry.

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Kaody fampiharana

        LruBlockCache cache = this.cache.get();
        if (cache == null) {
          break;
        }
        freedSumMb += cache.evict()/1024/1024;
        /*
        * Sometimes we are reading more data than can fit into BlockCache
        * and it is the cause a high rate of evictions.
        * This in turn leads to heavy Garbage Collector works.
        * So a lot of blocks put into BlockCache but never read,
        * but spending a lot of CPU resources.
        * Here we will analyze how many bytes were freed and decide
        * decide whether the time has come to reduce amount of caching blocks.
        * It help avoid put too many blocks into BlockCache
        * when evict() works very active and save CPU for other jobs.
        * More delails: https://issues.apache.org/jira/browse/HBASE-23887
        */

        // First of all we have to control how much time
        // has passed since previuos evict() was launched
        // This is should be almost the same time (+/- 10s)
        // because we get comparable volumes of freed bytes each time.
        // 10s because this is default period to run evict() (see above this.wait)
        long stopTime = System.currentTimeMillis();
        if ((stopTime - startTime) > 1000 * 10 - 1) {
          // Here we have to calc what situation we have got.
          // We have the limit "hbase.lru.cache.heavy.eviction.bytes.size.limit"
          // and can calculte overhead on it.
          // We will use this information to decide,
          // how to change percent of caching blocks.
          freedDataOverheadPercent =
            (int) (freedSumMb * 100 / cache.heavyEvictionMbSizeLimit) - 100;
          if (freedSumMb > cache.heavyEvictionMbSizeLimit) {
            // Now we are in the situation when we are above the limit
            // But maybe we are going to ignore it because it will end quite soon
            heavyEvictionCount++;
            if (heavyEvictionCount > cache.heavyEvictionCountLimit) {
              // It is going for a long time and we have to reduce of caching
              // blocks now. So we calculate here how many blocks we want to skip.
              // It depends on:
             // 1. Overhead - if overhead is big we could more aggressive
              // reducing amount of caching blocks.
              // 2. How fast we want to get the result. If we know that our
              // heavy reading for a long time, we don't want to wait and can
              // increase the coefficient and get good performance quite soon.
              // But if we don't sure we can do it slowly and it could prevent
              // premature exit from this mode. So, when the coefficient is
              // higher we can get better performance when heavy reading is stable.
              // But when reading is changing we can adjust to it and set
              // the coefficient to lower value.
              int change =
                (int) (freedDataOverheadPercent * cache.heavyEvictionOverheadCoefficient);
              // But practice shows that 15% of reducing is quite enough.
              // We are not greedy (it could lead to premature exit).
              change = Math.min(15, change);
              change = Math.max(0, change); // I think it will never happen but check for sure
              // So this is the key point, here we are reducing % of caching blocks
              cache.cacheDataBlockPercent -= change;
              // If we go down too deep we have to stop here, 1% any way should be.
              cache.cacheDataBlockPercent = Math.max(1, cache.cacheDataBlockPercent);
            }
          } else {
            // Well, we have got overshooting.
            // Mayby it is just short-term fluctuation and we can stay in this mode.
            // It help avoid permature exit during short-term fluctuation.
            // If overshooting less than 90%, we will try to increase the percent of
            // caching blocks and hope it is enough.
            if (freedSumMb >= cache.heavyEvictionMbSizeLimit * 0.1) {
              // Simple logic: more overshooting - more caching blocks (backpressure)
              int change = (int) (-freedDataOverheadPercent * 0.1 + 1);
              cache.cacheDataBlockPercent += change;
              // But it can't be more then 100%, so check it.
              cache.cacheDataBlockPercent = Math.min(100, cache.cacheDataBlockPercent);
            } else {
              // Looks like heavy reading is over.
              // Just exit form this mode.
              heavyEvictionCount = 0;
              cache.cacheDataBlockPercent = 100;
            }
          }
          LOG.info("BlockCache evicted (MB): {}, overhead (%): {}, " +
            "heavy eviction counter: {}, " +
            "current caching DataBlock (%): {}",
            freedSumMb, freedDataOverheadPercent,
            heavyEvictionCount, cache.cacheDataBlockPercent);

          freedSumMb = 0;
          startTime = stopTime;
       }

Andeha hojerentsika izany rehetra izany amin'ny fampiasana ohatra tena izy. Manana ity script fitsapana manaraka ity izahay:

  1. Andeha isika hanomboka hanao Scan (25 kofehy, batch = 100)
  2. Rehefa afaka 5 minitra, ampio multi-gets (25 kofehy, batch = 100)
  3. Rehefa afaka 5 minitra dia vonoy ny multi-gets (scannera sisa no tavela)

Manao hazakazaka roa izahay, voalohany hbase.lru.cache.heavy.eviction.count.limit = 10000 (izay tena manafoana ny endri-javatra), ary avy eo mametraka fetra = 0 (mamela azy).

Ao amin'ny logs etsy ambany dia hitantsika ny fomba fampandehanana ny endri-javatra ary mamerina ny Overshooting amin'ny 14-71%. Mihena tsindraindray ny entana, izay mamadika ny Backpressure ary ny HBase dia mitahiry sakana bebe kokoa.

Log RegionServer
voaroaka (MB): 0, salan'isa 0.0, ambony (%): -100, counter fandroahana mavesatra: 0, DataBlock cache ankehitriny (%): 100
voaroaka (MB): 0, salan'isa 0.0, ambony (%): -100, counter fandroahana mavesatra: 0, DataBlock cache ankehitriny (%): 100
voaroaka (MB): 2170, ratio 1.09, ambony (%): 985, counter fandroahana mavesatra: 1, DataBlock cache ankehitriny (%): 91 <manomboka
voaroaka (MB): 3763, ratio 1.08, ambony (%): 1781, counter fandroahana mavesatra: 2, DataBlock cache ankehitriny (%): 76
voaroaka (MB): 3306, ratio 1.07, ambony (%): 1553, counter fandroahana mavesatra: 3, DataBlock cache ankehitriny (%): 61
voaroaka (MB): 2508, ratio 1.06, ambony (%): 1154, counter fandroahana mavesatra: 4, DataBlock cache ankehitriny (%): 50
voaroaka (MB): 1824, ratio 1.04, ambony (%): 812, counter fandroahana mavesatra: 5, DataBlock cache ankehitriny (%): 42
voaroaka (MB): 1482, ratio 1.03, ambony (%): 641, counter fandroahana mavesatra: 6, DataBlock cache ankehitriny (%): 36
voaroaka (MB): 1140, ratio 1.01, ambony (%): 470, counter fandroahana mavesatra: 7, DataBlock cache ankehitriny (%): 32
voaroaka (MB): 913, ratio 1.0, ambony (%): 356, counter fandroahana mavesatra: 8, DataBlock cache ankehitriny (%): 29
voaroaka (MB): 912, ratio 0.89, ambony (%): 356, counter fandroahana mavesatra: 9, DataBlock cache ankehitriny (%): 26
voaroaka (MB): 684, ratio 0.76, ambony (%): 242, counter fandroahana mavesatra: 10, DataBlock cache ankehitriny (%): 24
voaroaka (MB): 684, ratio 0.61, ambony (%): 242, counter fandroahana mavesatra: 11, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 456, ratio 0.51, ambony (%): 128, counter fandroahana mavesatra: 12, DataBlock cache ankehitriny (%): 21
voaroaka (MB): 456, ratio 0.42, ambony (%): 128, counter fandroahana mavesatra: 13, DataBlock cache ankehitriny (%): 20
voaroaka (MB): 456, ratio 0.33, ambony (%): 128, counter fandroahana mavesatra: 14, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 15, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 342, ratio 0.32, ambony (%): 71, counter fandroahana mavesatra: 16, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 342, ratio 0.31, ambony (%): 71, counter fandroahana mavesatra: 17, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 228, ratio 0.3, ambony (%): 14, counter fandroahana mavesatra: 18, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 228, ratio 0.29, ambony (%): 14, counter fandroahana mavesatra: 19, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 228, ratio 0.27, ambony (%): 14, counter fandroahana mavesatra: 20, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 228, ratio 0.25, ambony (%): 14, counter fandroahana mavesatra: 21, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 228, ratio 0.24, ambony (%): 14, counter fandroahana mavesatra: 22, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 228, ratio 0.22, ambony (%): 14, counter fandroahana mavesatra: 23, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 228, ratio 0.21, ambony (%): 14, counter fandroahana mavesatra: 24, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 228, ratio 0.2, ambony (%): 14, counter fandroahana mavesatra: 25, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 228, ratio 0.17, ambony (%): 14, counter fandroahana mavesatra: 26, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 456, ratio 0.17, ambony (%): 128, counter fandroahana mavesatra: 27, DataBlock cache ankehitriny (%): 18 <ampiana mahazo (saingy mitovy ny latabatra)
voaroaka (MB): 456, ratio 0.15, ambony (%): 128, counter fandroahana mavesatra: 28, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 342, ratio 0.13, ambony (%): 71, counter fandroahana mavesatra: 29, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 342, ratio 0.11, ambony (%): 71, counter fandroahana mavesatra: 30, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 342, ratio 0.09, ambony (%): 71, counter fandroahana mavesatra: 31, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 228, ratio 0.08, ambony (%): 14, counter fandroahana mavesatra: 32, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 228, ratio 0.07, ambony (%): 14, counter fandroahana mavesatra: 33, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 228, ratio 0.06, ambony (%): 14, counter fandroahana mavesatra: 34, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 228, ratio 0.05, ambony (%): 14, counter fandroahana mavesatra: 35, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 228, ratio 0.05, ambony (%): 14, counter fandroahana mavesatra: 36, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 228, ratio 0.04, ambony (%): 14, counter fandroahana mavesatra: 37, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 109, tahan'ny 0.04, ambony (%): -46, counter fandroahana mavesatra: 37, DataBlock cache ankehitriny (%): 22 < tsindry miverina
voaroaka (MB): 798, ratio 0.24, ambony (%): 299, counter fandroahana mavesatra: 38, DataBlock cache ankehitriny (%): 20
voaroaka (MB): 798, ratio 0.29, ambony (%): 299, counter fandroahana mavesatra: 39, DataBlock cache ankehitriny (%): 18
voaroaka (MB): 570, ratio 0.27, ambony (%): 185, counter fandroahana mavesatra: 40, DataBlock cache ankehitriny (%): 17
voaroaka (MB): 456, ratio 0.22, ambony (%): 128, counter fandroahana mavesatra: 41, DataBlock cache ankehitriny (%): 16
voaroaka (MB): 342, ratio 0.16, ambony (%): 71, counter fandroahana mavesatra: 42, DataBlock cache ankehitriny (%): 16
voaroaka (MB): 342, ratio 0.11, ambony (%): 71, counter fandroahana mavesatra: 43, DataBlock cache ankehitriny (%): 16
voaroaka (MB): 228, ratio 0.09, ambony (%): 14, counter fandroahana mavesatra: 44, DataBlock cache ankehitriny (%): 16
voaroaka (MB): 228, ratio 0.07, ambony (%): 14, counter fandroahana mavesatra: 45, DataBlock cache ankehitriny (%): 16
voaroaka (MB): 228, ratio 0.05, ambony (%): 14, counter fandroahana mavesatra: 46, DataBlock cache ankehitriny (%): 16
voaroaka (MB): 222, ratio 0.04, ambony (%): 11, counter fandroahana mavesatra: 47, DataBlock cache ankehitriny (%): 16
voaroaka (MB): 104, ratio 0.03, ambony (%): -48, counter fandroahana mavesatra: 47, DataBlock cache ankehitriny (%): 21 < mahazo
voaroaka (MB): 684, ratio 0.2, ambony (%): 242, counter fandroahana mavesatra: 48, DataBlock cache ankehitriny (%): 19
voaroaka (MB): 570, ratio 0.23, ambony (%): 185, counter fandroahana mavesatra: 49, DataBlock cache ankehitriny (%): 18
voaroaka (MB): 342, ratio 0.22, ambony (%): 71, counter fandroahana mavesatra: 50, DataBlock cache ankehitriny (%): 18
voaroaka (MB): 228, ratio 0.21, ambony (%): 14, counter fandroahana mavesatra: 51, DataBlock cache ankehitriny (%): 18
voaroaka (MB): 228, ratio 0.2, ambony (%): 14, counter fandroahana mavesatra: 52, DataBlock cache ankehitriny (%): 18
voaroaka (MB): 228, ratio 0.18, ambony (%): 14, counter fandroahana mavesatra: 53, DataBlock cache ankehitriny (%): 18
voaroaka (MB): 228, ratio 0.16, ambony (%): 14, counter fandroahana mavesatra: 54, DataBlock cache ankehitriny (%): 18
voaroaka (MB): 228, ratio 0.14, ambony (%): 14, counter fandroahana mavesatra: 55, DataBlock cache ankehitriny (%): 18
voaroaka (MB): 112, tahan'ny 0.14, ambony (%): -44, counter fandroahana mavesatra: 55, DataBlock cache ankehitriny (%): 23 < tsindry miverina
voaroaka (MB): 456, ratio 0.26, ambony (%): 128, counter fandroahana mavesatra: 56, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.31, ambony (%): 71, counter fandroahana mavesatra: 57, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 58, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 59, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 60, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 61, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 62, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 63, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.32, ambony (%): 71, counter fandroahana mavesatra: 64, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 65, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 66, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.32, ambony (%): 71, counter fandroahana mavesatra: 67, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 68, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.32, ambony (%): 71, counter fandroahana mavesatra: 69, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.32, ambony (%): 71, counter fandroahana mavesatra: 70, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 71, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 72, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 73, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 74, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 75, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 342, ratio 0.33, ambony (%): 71, counter fandroahana mavesatra: 76, DataBlock cache ankehitriny (%): 22
voaroaka (MB): 21, salan'isa 0.33, ambony (%): -90, counter fandroahana mavesatra: 76, DataBlock cache ankehitriny (%): 32
voaroaka (MB): 0, salan'isa 0.0, ambony (%): -100, counter fandroahana mavesatra: 0, DataBlock cache ankehitriny (%): 100
voaroaka (MB): 0, salan'isa 0.0, ambony (%): -100, counter fandroahana mavesatra: 0, DataBlock cache ankehitriny (%): 100

Ny scans dia nilaina mba hampisehoana ny dingana mitovy amin'ny endrika grafika ny fifandraisana misy eo amin'ny fizarana cache roa - tokana (izay misy blocs izay mbola tsy nangatahana hatrizay) sy multi (angona "nangatahana" farafaharatsiny indray mandeha no voatahiry eto):

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Ary farany, toy ny ahoana ny fiasan'ny masontsivana amin'ny endrika grafika. Ho fampitahana, nesorina tanteraka ny cache tany am-piandohana, avy eo dia natomboka tamin'ny caching ny HBase ary nanemotra 5 minitra ny fanombohan'ny asa fanatsarana (tsingerin'ny fandroahana 30).

Ny kaody feno dia azo jerena ao amin'ny Pull Request HBASE 23887 amin'ny github.

Na izany aza, ny famakiana 300 arivo isan-tsegondra dia tsy izay rehetra azo atao amin'ity fitaovana ity ao anatin'ireo fepetra ireo. Ny zava-misy dia rehefa mila miditra angon-drakitra amin'ny alΓ lan'ny HDFS ianao, dia ampiasaina ny mekanika ShortCircuitCache (antsoina hoe SSC), izay ahafahanao miditra mivantana amin'ny angona, misoroka ny fifandraisana amin'ny tambajotra.

Nasehon'ny profiling fa na dia manome tombony lehibe aza io mekanika io, dia lasa sakana ihany koa izy io amin'ny fotoana iray, satria saika ny hetsika mavesatra rehetra dia mitranga ao anaty hidin-trano, izay mitarika amin'ny fanakanana ny ankamaroan'ny fotoana.

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Rehefa nahatsapa izany izahay dia nahatsapa fa ny olana dia azo fehezina amin'ny famoronana karazana SSC tsy miankina:

private final ShortCircuitCache[] shortCircuitCache;
...
shortCircuitCache = new ShortCircuitCache[this.clientShortCircuitNum];
for (int i = 0; i < this.clientShortCircuitNum; i++)
  this.shortCircuitCache[i] = new ShortCircuitCache(…);

Ary avy eo miara-miasa amin'izy ireo, tsy tafiditra ao amin'ny sampanan-dalana ihany koa amin'ny isa offset farany:

public ShortCircuitCache getShortCircuitCache(long idx) {
    return shortCircuitCache[(int) (idx % clientShortCircuitNum)];
}

Afaka manomboka fitsapana ianao izao. Mba hanaovana izany, dia hamaky rakitra avy amin'ny HDFS miaraka amin'ny fampiharana tsotra maromaro misy kofehy. Mametraka ny masontsivana:

conf.set("dfs.client.read.shortcircuit", "true");
conf.set("dfs.client.read.shortcircuit.buffer.size", "65536"); // ΠΏΠΎ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Ρƒ = 1 ΠœΠ‘ ΠΈ это сильно замСдляСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, поэтому Π»ΡƒΡ‡ΡˆΠ΅ привСсти Π² соотвСтствиС ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π½ΡƒΠΆΠ΄Π°ΠΌ
conf.set("dfs.client.short.circuit.num", num); // ΠΎΡ‚ 1 Π΄ΠΎ 10

Ary vakio fotsiny ireo rakitra:

FSDataInputStream in = fileSystem.open(path);
for (int i = 0; i < count; i++) {
    position += 65536;
    if (position > 900000000)
        position = 0L;
    int res = in.read(position, byteBuffer, 0, 65536);
}

Ity fehezan-dalΓ na ity dia tanterahina amin'ny kofehy misaraka ary hampitombo ny isan'ny rakitra mamaky miaraka (avy amin'ny 10 ka hatramin'ny 200 - axis horizontaly) ary ny isan'ny caches (avy amin'ny 1 ka hatramin'ny 10 - sary). Ny axis mitsangana dia mampiseho ny hafainganana vokatry ny fitomboan'ny SSC raha oharina amin'ny tranga raha tsy misy afa-tsy cache iray.

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Ahoana ny famakiana ny grafika: Mitaky 100 segondra ny fotoana hanatanterahana ny famakiana 64 arivo amin'ny sakana 78 KB miaraka amin'ny cache iray. Fa amin'ny cache 5 dia mila 16 segondra. Ireo. misy fanafainganana ~ 5 heny. Araka ny hita amin'ny grafika dia tsy dia hita loatra ny fiantraikany amin'ny famakiana parallèle vitsivitsy, manomboka mitana anjara toerana lehibe izy rehefa misy kofehy mamaky mihoatra ny 50. Hita ihany koa fa mitombo ny isan'ny SSC amin'ny 6. ary etsy ambony dia manome fisondrotan-javatra kely kokoa.

Fanamarihana 1: satria ny valin'ny fitsapana dia somary miovaova (jereo eto ambany), dia natao ny hazakazaka 3 ary ny sandan'ny vokatra dia salan'isa.

Fanamarihana 2: Ny tombony azo amin'ny fampandehanana ny fidirana kisendrasendra dia mitovy, na dia somary miadana kokoa aza ny fidirana.

Na izany aza, ilaina ny manazava fa, tsy toy ny tranga amin'ny HBase, dia tsy maimaim-poana foana io fanafainganana io. Eto isika dia "mamaha" ny fahafahan'ny CPU manao asa bebe kokoa, fa tsy mihantona amin'ny hidin-trano.

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Eto ianao dia afaka mahita fa, amin'ny ankapobeny, ny fitomboan'ny isan'ny cache dia manome fitomboana mitovitovy amin'ny fampiasana CPU. Na izany aza, misy fitambarana mandresy kely kokoa.

Ohatra, andeha hojerentsika akaiky ny fametrahana SSC = 3. Ny fitomboan'ny zava-bita eo amin'ny sehatra dia manodidina ny 3.3 heny. Ireto ambany ireto ny vokatra avy amin'ireo hazakazaka telo samihafa.

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Raha mitombo in-2.8 eo ho eo ny fanjifana CPU. Tsy dia lehibe loatra ny fahasamihafana, fa i Greta kely dia efa faly ary mety hanam-potoana hanatrehana fianarana sy hianatra.

Noho izany, hisy fiantraikany tsara amin'ny fitaovana rehetra mampiasa fidirana betsaka amin'ny HDFS (ohatra Spark, sns.), raha toa ka maivana ny fehezan-dalΓ na fampiharana (izany hoe eo amin'ny lafiny mpanjifa HDFS ny plug) ary misy herin'ny CPU maimaim-poana. . Mba hanamarinana, andeha hojerentsika hoe inona no mety ho fiantraikan'ny fampiasana mitambatra ny BlockCache optimization sy ny SSC Tuning amin'ny famakiana avy amin'ny HBase.

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Hita fa amin'ny toe-javatra toy izany dia tsy dia lehibe toy ny tamin'ny fitsapana voadio (mamaky tsy misy fanodinana), fa azo atao ny manindry fanampiny 80K eto. Miaraka, ny fanatsarana roa dia manome haingana 4x.

Nisy PR natao ihany koa ho an'ity fanatsarana ity [HDFS-15202], izay natambatra ary ity fampiasa ity dia ho hita amin'ny famoahana ho avy.

Ary farany, nahaliana ny mampitaha ny fahombiazan'ny famakiana ny angon-drakitra tsanganana midadasika mitovy, Cassandra sy HBase.

Mba hanaovana izany, dia namoaka ohatra momba ny fitaovana fitiliana entana YCSB mahazatra avy amin'ny mpampiantrano roa (tady 800 amin'ny fitambarany). Eo amin'ny lafiny mpizara - tranga 4 an'ny RegionServer sy Cassandra amin'ny mpampiantrano 4 (fa tsy ireo izay mihazakazaka ny mpanjifa, mba hialana amin'ny fiantraikany). Avy amin'ny latabatra misy habe ny vakiteny:

HBase - 300 GB amin'ny HDFS (100 GB angona madio)

Cassandra - 250 GB (antony replication = 3)

Ireo. mitovy ihany ny volume (ao amin'ny HBase kely kokoa).

Parameter HBase:

dfs.client.short.circuit.num = 5 (fanatsarana ny mpanjifa HDFS)

hbase.lru.cache.heavy.eviction.count.limit = 30 - midika izany fa manomboka miasa ny patch aorian'ny fandroahana 30 (~5 minitra)

hbase.lru.cache.heavy.eviction.mb.size.limit = 300 - ny habetsahan'ny caching sy ny fandroahana

Ny diarin'ny YCSB dia nozaraina ary natambatra ho grafika Excel:

Ahoana ny fampitomboana ny hafainganan'ny famakiana avy amin'ny HBase hatramin'ny in-3 ary avy amin'ny HDFS hatramin'ny in-5

Araka ny hitanao, ireo fanatsarana ireo dia ahafahana mampitaha ny fahombiazan'ireo angona ireo ao anatin'ireo fepetra ireo ary mahatratra 450 arivo isa-tsegondra.

Manantena izahay fa ity fampahalalana ity dia mety hahasoa olona iray mandritra ny tolona mampientanentana ho an'ny famokarana.

Source: www.habr.com

Add a comment