Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Išẹ giga jẹ ọkan ninu awọn ibeere bọtini nigbati o n ṣiṣẹ pẹlu data nla. Ninu ẹka ikojọpọ data ni Sberbank, a fa fifa soke gbogbo awọn iṣowo sinu awọsanma data orisun Hadoop ati nitorinaa ṣe pẹlu awọn ṣiṣan alaye nla gaan. Nipa ti, a nigbagbogbo n wa awọn ọna lati mu ilọsiwaju ṣiṣẹ, ati ni bayi a fẹ lati sọ fun ọ bi a ṣe ṣakoso lati patch RegionServer HBase ati alabara HDFS, o ṣeun si eyiti a ni anfani lati mu iyara awọn iṣẹ kika pọ si ni pataki.
Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Bibẹẹkọ, ṣaaju gbigbe siwaju si ipilẹ ti awọn ilọsiwaju, o tọ lati sọrọ nipa awọn ihamọ ti, ni ipilẹ, ko le yika ti o ba joko lori HDD kan.

Kini idi ti HDD ati wiwọle yara yara ID ko ni ibamu
Bi o ṣe mọ, HBase, ati ọpọlọpọ awọn data data miiran, tọju data ni awọn bulọọki ti ọpọlọpọ awọn mewa ti kilobytes ni iwọn. Nipa aiyipada o jẹ nipa 64 KB. Bayi jẹ ki a fojuinu pe a nilo lati gba awọn baiti 100 nikan ati pe a beere HBase lati fun wa ni data yii nipa lilo bọtini kan. Niwọn igba ti iwọn bulọọki ni HFiles jẹ 64 KB, ibeere naa yoo jẹ awọn akoko 640 tobi (o kan iṣẹju kan!) Ju pataki.

Nigbamii ti, niwọn igba ti ibeere naa yoo lọ nipasẹ HDFS ati ẹrọ caching metadata rẹ ShortCircuitCache (eyiti o fun laaye wiwọle taara si awọn faili), eyi nyorisi kika tẹlẹ 1 MB lati disk. Sibẹsibẹ, eyi le ṣe atunṣe pẹlu paramita dfs.client.read.shortcircuit.buffer.size ati ni ọpọlọpọ igba o jẹ oye lati dinku iye yii, fun apẹẹrẹ si 126 KB.

Jẹ ki a sọ pe a ṣe eyi, ṣugbọn ni afikun, nigba ti a ba bẹrẹ kika data nipasẹ java api, gẹgẹbi awọn iṣẹ bi FileChannel.read ki o si beere fun ẹrọ ṣiṣe lati ka iye data ti a pato, o ka "o kan ni idi" 2 igba diẹ sii. , i.e. 256 KB ninu ọran tiwa. Eyi jẹ nitori java ko ni ọna ti o rọrun lati ṣeto asia FADV_RANDOM lati ṣe idiwọ ihuwasi yii.

Bi abajade, lati gba awọn baiti 100 wa, awọn akoko 2600 diẹ sii ni a ka labẹ hood. Yoo dabi pe ojutu naa han gbangba, jẹ ki a dinku iwọn bulọọki si kilobyte kan, ṣeto asia ti a mẹnuba ati gba isare imole nla. Ṣugbọn iṣoro naa ni pe nipa idinku iwọn bulọki nipasẹ awọn akoko 2, a tun dinku nọmba awọn baiti ti a ka ni ẹyọkan akoko nipasẹ awọn akoko 2.

Diẹ ninu awọn ere lati ṣeto asia FADV_RANDOM le ṣee gba, ṣugbọn pẹlu multithreading giga nikan ati pẹlu iwọn bulọki ti 128 KB, ṣugbọn eyi jẹ o pọju ti tọkọtaya mewa ti ogorun:

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Awọn idanwo ni a ṣe lori awọn faili 100, ọkọọkan 1 GB ni iwọn ati pe o wa lori awọn HDD 10.

Jẹ ki a ṣe iṣiro ohun ti a le, ni ipilẹ, ka lori ni iyara yii:
Jẹ ki a sọ pe a ka lati awọn disiki 10 ni iyara ti 280 MB / iṣẹju-aaya, i.e. 3 million igba 100 baiti. Ṣugbọn bi a ṣe ranti, data ti a nilo jẹ awọn akoko 2600 kere ju ohun ti a ka lọ. Nitorinaa, a pin 3 million nipasẹ 2600 ati gba 1100 igbasilẹ fun keji.

Ibanujẹ, ṣe kii ṣe bẹ? iseda niyen Random Wiwọle wiwọle si data lori HDD - laiwo ti awọn Àkọsílẹ iwọn. Eyi ni opin ti ara ti iwọle laileto ko si si data data ti o le fun pọ diẹ sii labẹ iru awọn ipo.

Bawo ni lẹhinna awọn apoti isura infomesonu ṣe aṣeyọri awọn iyara ti o ga julọ? Lati dahun ibeere yii, jẹ ki a wo ohun ti n ṣẹlẹ ninu aworan atẹle:

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Nibi a rii pe fun awọn iṣẹju diẹ akọkọ iyara jẹ looto nipa ẹgbẹrun awọn igbasilẹ fun iṣẹju kan. Sibẹsibẹ, siwaju sii, nitori otitọ pe ọpọlọpọ diẹ sii ju ti a beere lọ, data naa pari ni buff / kaṣe ti ẹrọ iṣẹ (linux) ati pe iyara pọ si 60 ẹgbẹrun diẹ sii fun iṣẹju-aaya.

Nitorinaa, siwaju a yoo ṣe pẹlu iraye si iyara nikan si data ti o wa ninu kaṣe OS tabi ti o wa ni awọn ẹrọ ibi ipamọ SSD/NVMe ti iyara iwọle afiwera.

Ninu ọran wa, a yoo ṣe awọn idanwo lori ibujoko ti awọn olupin 4, ọkọọkan wọn ni idiyele bi atẹle:

Sipiyu: Xeon E5-2680 v4 @ 2.40GHz 64 awọn okun.
Iranti: 730 GB.
Java version: 1.8.0_111

Ati pe aaye bọtini ni iye data ninu awọn tabili ti o nilo lati ka. Otitọ ni pe ti o ba ka data lati ori tabili ti o ti gbe patapata sinu kaṣe HBase, lẹhinna kii yoo paapaa wa si kika lati buff / kaṣe ẹrọ ẹrọ. Nitori HBase nipasẹ aiyipada sọtọ 40% ti iranti si eto ti a pe ni BlockCache. Ni pataki eyi jẹ ConcurrentHashMap, nibiti bọtini jẹ orukọ faili + aiṣedeede ti bulọọki, ati pe iye naa jẹ data gangan ni aiṣedeede yii.

Bayi, nigba kika nikan lati yi be, a a ri o tayọ iyara, bi awọn ibeere miliọnu kan fun iṣẹju-aaya. Ṣugbọn jẹ ki a fojuinu pe a ko le pin awọn ọgọọgọrun gigabytes ti iranti nikan fun awọn iwulo data, nitori ọpọlọpọ awọn ohun iwulo miiran ti nṣiṣẹ lori awọn olupin wọnyi.

Fun apẹẹrẹ, ninu ọran wa, iwọn didun BlockCache lori RS kan jẹ nipa 12 GB. A gbe RS meji lori ipade kan, i.e. 96 GB ti wa ni sọtọ fun BlockCache lori gbogbo awọn apa. Ati pe ọpọlọpọ igba diẹ sii data, fun apẹẹrẹ, jẹ ki o jẹ awọn tabili 4, awọn agbegbe 130 kọọkan, ninu eyiti awọn faili jẹ 800 MB ni iwọn, fisinuirindigbindigbin nipasẹ FAST_DIFF, i.e. apapọ 410 GB (eyi jẹ data mimọ, ie laisi akiyesi ifosiwewe ẹda).

Nitorinaa, BlockCache jẹ nikan nipa 23% ti iwọn didun data lapapọ ati pe eyi sunmọ pupọ si awọn ipo gidi ti ohun ti a pe ni BigData. Ati pe eyi ni ibiti igbadun naa bẹrẹ - nitori o han gedegbe, kaṣe ti o dinku, iṣẹ ṣiṣe buru si. Lẹhinna, ti o ba padanu, iwọ yoo ni lati ṣe ọpọlọpọ iṣẹ - i.e. sọkalẹ lọ si awọn iṣẹ eto pipe. Sibẹsibẹ, eyi ko le yago fun, nitorinaa jẹ ki a wo abala ti o yatọ patapata - kini o ṣẹlẹ si data inu kaṣe naa?

Jẹ ki a rọrun ipo naa ki o ro pe a ni kaṣe kan ti o baamu ohun kan nikan. Eyi jẹ apẹẹrẹ ti ohun ti yoo ṣẹlẹ nigbati a ba gbiyanju lati ṣiṣẹ pẹlu iwọn didun data ni awọn akoko 1 tobi ju kaṣe lọ, a yoo ni lati:

1. Gbe Àkọsílẹ 1 ni kaṣe
2. Yọ Àkọsílẹ 1 lati kaṣe
3. Gbe Àkọsílẹ 2 ni kaṣe
4. Yọ Àkọsílẹ 2 lati kaṣe
5. Gbe Àkọsílẹ 3 ni kaṣe

Awọn iṣe 5 ti pari! Sibẹsibẹ, ipo yii ko le pe ni deede; ni otitọ, a n fi ipa mu HBase lati ṣe opo kan ti iṣẹ asan patapata. O n ka data nigbagbogbo lati kaṣe OS, gbe e si BlockCache, nikan lati jabọ jade lẹsẹkẹsẹ nitori apakan tuntun ti data ti de. Idaraya ti o wa ni ibẹrẹ ifiweranṣẹ fihan idi ti iṣoro naa - Akojọpọ idoti n lọ kuro ni iwọn, oju-aye ti ngbona, Greta kekere ti o jinna ati Sweden ti o gbona n binu. Ati pe awa eniyan IT ko fẹran rẹ gaan nigbati awọn ọmọde ba banujẹ, nitorinaa a bẹrẹ lati ronu nipa ohun ti a le ṣe nipa rẹ.

Kini ti o ko ba fi gbogbo awọn bulọọki sinu kaṣe, ṣugbọn nikan ni ipin kan ninu wọn, ki kaṣe ko ni apọju? Jẹ ki a bẹrẹ nipa fifi awọn laini koodu diẹ kun si ibẹrẹ iṣẹ naa fun fifi data sinu BlockCache:

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

Ojuami nibi ni atẹle yii: aiṣedeede jẹ ipo ti bulọọki ninu faili naa ati awọn nọmba ti o kẹhin rẹ jẹ laileto ati pinpin ni deede lati 00 si 99. Nitorinaa, a yoo foju nikan awọn ti o ṣubu sinu ibiti a nilo.

Fun apẹẹrẹ, ṣeto cacheDataBlockPercent = 20 ki o wo ohun ti o ṣẹlẹ:

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Abajade jẹ kedere. Ninu awọn aworan ti o wa ni isalẹ, o han gbangba idi ti iru isare bẹ waye - a fipamọ ọpọlọpọ awọn orisun GC laisi ṣiṣe iṣẹ Sisyphean ti gbigbe data sinu kaṣe nikan lati jabọ lẹsẹkẹsẹ si isalẹ sisan ti awọn aja Martian:

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Ni akoko kanna, lilo Sipiyu pọ si, ṣugbọn o kere pupọ ju iṣelọpọ lọ:

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

O tun ṣe akiyesi pe awọn bulọọki ti a fipamọ sinu BlockCache yatọ. Pupọ julọ, nipa 95%, jẹ data funrararẹ. Ati iyokù jẹ metadata, gẹgẹbi awọn asẹ Bloom tabi LEAF_INDEX ati ati be be lo.. Data yii ko to, ṣugbọn o wulo pupọ, nitori ṣaaju ki o to wọle si data taara, HBase yipada si meta lati loye boya o jẹ dandan lati wa nibi siwaju ati, ti o ba jẹ bẹ, nibiti o wa ni pato idinaki iwulo.

Nitorinaa, ninu koodu a rii ipo ayẹwo kan buf.getBlockType ().isData () ati ọpẹ si meta yii, a yoo fi silẹ ni kaṣe ni eyikeyi ọran.

Bayi jẹ ki ká mu awọn fifuye ati die-die Mu soke ẹya ara ẹrọ ni ọkan lọ. Ni akọkọ igbeyewo ti a ṣe awọn cutoff ogorun = 20 ati BlockCache ti a die-die underutilized. Bayi jẹ ki a ṣeto si 23% ki o ṣafikun awọn okun 100 ni gbogbo iṣẹju 5 lati rii ni aaye wo ni itẹlọrun waye:

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Nibi ti a rii pe ẹya atilẹba ti fẹrẹ de lu aja ni iwọn 100 ẹgbẹrun awọn ibeere fun iṣẹju kan. Lakoko ti alemo naa funni ni isare ti to 300 ẹgbẹrun. Ni akoko kanna, o han gbangba pe isare siwaju ko si “ọfẹ” mọ; Lilo Sipiyu tun n pọ si.

Sibẹsibẹ, eyi kii ṣe ojutu yangan pupọ, nitori a ko mọ tẹlẹ kini ipin ogorun awọn bulọọki nilo lati wa ni ipamọ, o da lori profaili fifuye. Nitorinaa, a ṣe imuse ẹrọ kan lati ṣatunṣe paramita yii laifọwọyi da lori iṣẹ ṣiṣe ti awọn iṣẹ kika.

Awọn aṣayan mẹta ti ṣafikun lati ṣakoso eyi:

hbase.lru.cache.heavy.eviction.count.limit - ṣeto iye igba ilana ti yiyọ data kuro lati kaṣe yẹ ki a ṣiṣẹ ṣaaju lilo iṣapeye (ie awọn bulọọki fo). Nipa aiyipada o jẹ dogba si MAX_INT = 2147483647 ati ni otitọ tumọ si pe ẹya naa kii yoo bẹrẹ ṣiṣẹ pẹlu iye yii. Nitori ilana imukuro bẹrẹ ni gbogbo iṣẹju 5 - 10 (o da lori ẹru) ati 2147483647 * 10/60/60/24/365 = 680 ọdun. Sibẹsibẹ, a le ṣeto paramita yii si 0 ati jẹ ki ẹya naa ṣiṣẹ lẹsẹkẹsẹ lẹhin ifilọlẹ.

Sibẹsibẹ, isanwo tun wa ninu paramita yii. Ti ẹru wa ba jẹ iru awọn kika kukuru kukuru (sọ lakoko ọsan) ati awọn kika igba pipẹ (ni alẹ) ti wa ni idawọle nigbagbogbo, lẹhinna a le rii daju pe ẹya naa wa ni titan nikan nigbati awọn iṣẹ ṣiṣe kika gigun ba wa ni ilọsiwaju.

Fun apẹẹrẹ, a mọ pe awọn kika igba kukuru maa n ṣiṣe ni bii iṣẹju kan. Ko si ye lati bẹrẹ sisọ awọn bulọọki jade, kaṣe kii yoo ni akoko lati di igba atijọ ati lẹhinna a le ṣeto paramita yii dogba si, fun apẹẹrẹ, 1. Eyi yoo yorisi otitọ pe iṣapeye yoo bẹrẹ ṣiṣẹ nikan nigbati gun- igba kika ti nṣiṣe lọwọ ti bẹrẹ, i.e. ni 10 aaya. Nitorinaa, ti a ba ni kika igba kukuru, lẹhinna gbogbo awọn bulọọki yoo lọ sinu kaṣe ati pe yoo wa (ayafi fun awọn ti yoo jade nipasẹ boṣewa algorithm). Ati pe nigba ti a ba ṣe awọn kika igba pipẹ, ẹya naa wa ni titan ati pe a yoo ni iṣẹ ṣiṣe ti o ga julọ.

hbase.lru.cache.eru.eviction.mb.size.limit - ṣeto iye megabyte ti a yoo fẹ lati gbe sinu kaṣe (ati, dajudaju, jade) ni iṣẹju-aaya 10. Ẹya naa yoo gbiyanju lati de iye yii ati ṣetọju rẹ. Oro naa ni eyi: ti a ba fi gigabytes sinu kaṣe, lẹhinna a yoo ni lati jade gigabytes, ati pe eyi, bi a ti ri loke, jẹ gidigidi gbowolori. Sibẹsibẹ, o yẹ ki o ko gbiyanju lati ṣeto o kere ju, nitori eyi yoo fa ipo foo bulọki lati jade laipẹ. Fun awọn olupin ti o lagbara (nipa awọn ohun kohun 20-40), o dara julọ lati ṣeto nipa 300-400 MB. Fun kilasi arin (~ 10 ohun kohun) 200-300 MB. Fun awọn eto alailagbara (awọn ohun kohun 2-5) 50-100 MB le jẹ deede (kii ṣe idanwo lori iwọnyi).

Jẹ ki a wo bii eyi ṣe n ṣiṣẹ: jẹ ki a sọ pe a ṣeto hbase.lru.cache.heavy.eviction.mb.size.limit = 500, iru ẹru kan wa (kika) ati lẹhinna ni gbogbo ~ 10 iṣẹju a ṣe iṣiro iye awọn baiti jẹ jade nipa lilo agbekalẹ:

Lori oke = Freed Bytes Sum (MB) * 100 / Idiwọn (MB) - 100;

Ti o ba jẹ pe ni otitọ 2000 MB ti yọ kuro, lẹhinna Olori jẹ dọgba si:

2000 * 100/500 - 100 = 300%

Awọn algoridimu gbiyanju lati ṣetọju ko si ju awọn mewa diẹ ninu ogorun, nitorinaa ẹya naa yoo dinku ipin ogorun ti awọn bulọọki ti a fipamọ, nitorinaa imuse ẹrọ atunwi adaṣe.

Bibẹẹkọ, ti ẹru naa ba lọ silẹ, jẹ ki a sọ pe 200 MB nikan ni a yọ kuro ati Ikọja naa di odi (eyiti a pe ni overshooting):

200 * 100/500 - 100 = -60%

Ni ilodi si, ẹya naa yoo pọ si ipin ogorun awọn bulọọki ti a fipamọ titi ti oke yoo di rere.

Ni isalẹ jẹ apẹẹrẹ ti bii eyi ṣe n wo data gidi. Ko si ye lati gbiyanju lati de ọdọ 0%, ko ṣee ṣe. O dara pupọ nigbati o jẹ nipa 30 - 100%, eyi ṣe iranlọwọ lati yago fun ijade ti tọjọ lati ipo iṣapeye lakoko awọn igba diẹ.

hbase.lru.cache.heavy.eviction.overhead.coefficient - ṣeto bi yarayara a yoo fẹ lati gba abajade. Ti a ba mọ daju pe awọn kika wa gun pupọ ati pe ko fẹ lati duro, a le pọ si ipin yii ki o gba iṣẹ giga ni iyara.

Fun apẹẹrẹ, a ṣeto onisọdipúpọ = 0.01. Eyi tumọ si pe Oke (wo loke) yoo jẹ isodipupo nipasẹ nọmba yii nipasẹ abajade abajade ati pe ipin ogorun awọn bulọọki ti a fipamọ yoo dinku. Jẹ ki a ro pe Overhead = 300% ati olùsọdipúpọ = 0.01, lẹhinna ipin ogorun awọn bulọọki ti a fipamọ yoo dinku nipasẹ 3%.

Iru kannaa "Backpressure" tun jẹ imuse fun awọn iye Aṣeju odi (overshooting). Niwọn igba ti awọn iyipada igba kukuru ni iwọn kika ati awọn imukuro nigbagbogbo ṣee ṣe, ẹrọ yii ngbanilaaye lati yago fun ijade ti tọjọ lati ipo iṣapeye. Backpressure ni o ni ohun inverted kannaa: awọn ni okun awọn overshooting, awọn diẹ ohun amorindun ti wa ni cache.

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

koodu imuse

        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;
       }

Jẹ ki a ni bayi wo gbogbo eyi nipa lilo apẹẹrẹ gidi kan. A ni iwe afọwọkọ idanwo atẹle:

  1. Jẹ ki a bẹrẹ ṣiṣe Ṣiṣayẹwo (awọn okun 25, ipele = 100)
  2. Lẹhin awọn iṣẹju 5, ṣafikun ọpọlọpọ-gba (awọn okun 25, ipele = 100)
  3. Lẹhin iṣẹju 5, pa ọpọlọpọ awọn gba (iṣayẹwo nikan wa lẹẹkansi)

A ṣe meji gbalaye, akọkọ hbase.lru.cache.heavy.eviction.count.limit = 10000 (eyi ti kosi mu ẹya ara ẹrọ), ati ki o si ṣeto iye to = 0 (mu awọn ti o).

Ninu awọn akọọlẹ ti o wa ni isalẹ a rii bii ẹya ti wa ni titan ati tunto Overshooting si 14-71%. Lati akoko si akoko fifuye dinku, eyi ti o wa ni titan Backpressure ati HBase caches diẹ sii awọn bulọọki lẹẹkansi.

Wọle RegionServer
ti jade (MB): 0, ipin 0.0, lori (%): -100, kika idasile eru: 0, DataBlock caching lọwọlọwọ (%): 100
ti jade (MB): 0, ipin 0.0, lori (%): -100, kika idasile eru: 0, DataBlock caching lọwọlọwọ (%): 100
ti jade (MB): 2170, ipin 1.09, lori (%): 985, kika idasile eru: 1, DataBlock caching lọwọlọwọ (%): 91 <bẹrẹ
jade (MB): 3763, ipin 1.08, lori (%): 1781, eru ilekuro counter: 2, DataBlock caching lọwọlọwọ (%): 76
jade (MB): 3306, ipin 1.07, lori (%): 1553, eru ilekuro counter: 3, DataBlock caching lọwọlọwọ (%): 61
jade (MB): 2508, ipin 1.06, lori (%): 1154, eru ilekuro counter: 4, DataBlock caching lọwọlọwọ (%): 50
jade (MB): 1824, ipin 1.04, lori (%): 812, eru ilekuro counter: 5, DataBlock caching lọwọlọwọ (%): 42
jade (MB): 1482, ipin 1.03, lori (%): 641, eru ilekuro counter: 6, DataBlock caching lọwọlọwọ (%): 36
jade (MB): 1140, ipin 1.01, lori (%): 470, eru ilekuro counter: 7, DataBlock caching lọwọlọwọ (%): 32
jade (MB): 913, ipin 1.0, lori (%): 356, eru ilekuro counter: 8, DataBlock caching lọwọlọwọ (%): 29
jade (MB): 912, ipin 0.89, lori (%): 356, eru ilekuro counter: 9, DataBlock caching lọwọlọwọ (%): 26
jade (MB): 684, ipin 0.76, lori (%): 242, eru ilekuro counter: 10, DataBlock caching lọwọlọwọ (%): 24
jade (MB): 684, ipin 0.61, lori (%): 242, eru ilekuro counter: 11, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 456, ipin 0.51, lori (%): 128, eru ilekuro counter: 12, DataBlock caching lọwọlọwọ (%): 21
jade (MB): 456, ipin 0.42, lori (%): 128, eru ilekuro counter: 13, DataBlock caching lọwọlọwọ (%): 20
jade (MB): 456, ipin 0.33, lori (%): 128, eru ilekuro counter: 14, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 15, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 342, ipin 0.32, lori (%): 71, eru ilekuro counter: 16, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 342, ipin 0.31, lori (%): 71, eru ilekuro counter: 17, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 228, ipin 0.3, lori (%): 14, eru ilekuro counter: 18, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 228, ipin 0.29, lori (%): 14, eru ilekuro counter: 19, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 228, ipin 0.27, lori (%): 14, eru ilekuro counter: 20, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 228, ipin 0.25, lori (%): 14, eru ilekuro counter: 21, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 228, ipin 0.24, lori (%): 14, eru ilekuro counter: 22, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 228, ipin 0.22, lori (%): 14, eru ilekuro counter: 23, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 228, ipin 0.21, lori (%): 14, eru ilekuro counter: 24, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 228, ipin 0.2, lori (%): 14, eru ilekuro counter: 25, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 228, ipin 0.17, lori (%): 14, eru ilekuro counter: 26, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 456, ratio 0.17, lori (%): 128, eru ilekuro counter: 27, lọwọlọwọ caching DataBlock (%): 18 <fikun n gba (ṣugbọn tabili kanna)
jade (MB): 456, ipin 0.15, lori (%): 128, eru ilekuro counter: 28, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 342, ipin 0.13, lori (%): 71, eru ilekuro counter: 29, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 342, ipin 0.11, lori (%): 71, eru ilekuro counter: 30, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 342, ipin 0.09, lori (%): 71, eru ilekuro counter: 31, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 228, ipin 0.08, lori (%): 14, eru ilekuro counter: 32, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 228, ipin 0.07, lori (%): 14, eru ilekuro counter: 33, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 228, ipin 0.06, lori (%): 14, eru ilekuro counter: 34, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 228, ipin 0.05, lori (%): 14, eru ilekuro counter: 35, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 228, ipin 0.05, lori (%): 14, eru ilekuro counter: 36, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 228, ipin 0.04, lori (%): 14, eru ilekuro counter: 37, DataBlock caching lọwọlọwọ (%): 17
ti jade (MB): 109, ipin 0.04, lori (%): -46, kika idasile eru: 37, DataBlock caching lọwọlọwọ (%): 22 <titẹ ẹhin
jade (MB): 798, ipin 0.24, lori (%): 299, eru ilekuro counter: 38, DataBlock caching lọwọlọwọ (%): 20
jade (MB): 798, ipin 0.29, lori (%): 299, eru ilekuro counter: 39, DataBlock caching lọwọlọwọ (%): 18
jade (MB): 570, ipin 0.27, lori (%): 185, eru ilekuro counter: 40, DataBlock caching lọwọlọwọ (%): 17
jade (MB): 456, ipin 0.22, lori (%): 128, eru ilekuro counter: 41, DataBlock caching lọwọlọwọ (%): 16
jade (MB): 342, ipin 0.16, lori (%): 71, eru ilekuro counter: 42, DataBlock caching lọwọlọwọ (%): 16
jade (MB): 342, ipin 0.11, lori (%): 71, eru ilekuro counter: 43, DataBlock caching lọwọlọwọ (%): 16
jade (MB): 228, ipin 0.09, lori (%): 14, eru ilekuro counter: 44, DataBlock caching lọwọlọwọ (%): 16
jade (MB): 228, ipin 0.07, lori (%): 14, eru ilekuro counter: 45, DataBlock caching lọwọlọwọ (%): 16
jade (MB): 228, ipin 0.05, lori (%): 14, eru ilekuro counter: 46, DataBlock caching lọwọlọwọ (%): 16
jade (MB): 222, ipin 0.04, lori (%): 11, eru ilekuro counter: 47, DataBlock caching lọwọlọwọ (%): 16
ti jade (MB): 104, ipin 0.03, loke (%): -48, kika idasile eru: 47, DataBlock caching lọwọlọwọ (%): 21 < Idilọwọ n gba
jade (MB): 684, ipin 0.2, lori (%): 242, eru ilekuro counter: 48, DataBlock caching lọwọlọwọ (%): 19
jade (MB): 570, ipin 0.23, lori (%): 185, eru ilekuro counter: 49, DataBlock caching lọwọlọwọ (%): 18
jade (MB): 342, ipin 0.22, lori (%): 71, eru ilekuro counter: 50, DataBlock caching lọwọlọwọ (%): 18
jade (MB): 228, ipin 0.21, lori (%): 14, eru ilekuro counter: 51, DataBlock caching lọwọlọwọ (%): 18
jade (MB): 228, ipin 0.2, lori (%): 14, eru ilekuro counter: 52, DataBlock caching lọwọlọwọ (%): 18
jade (MB): 228, ipin 0.18, lori (%): 14, eru ilekuro counter: 53, DataBlock caching lọwọlọwọ (%): 18
jade (MB): 228, ipin 0.16, lori (%): 14, eru ilekuro counter: 54, DataBlock caching lọwọlọwọ (%): 18
jade (MB): 228, ipin 0.14, lori (%): 14, eru ilekuro counter: 55, DataBlock caching lọwọlọwọ (%): 18
ti jade (MB): 112, ipin 0.14, lori (%): -44, kika idasile eru: 55, DataBlock caching lọwọlọwọ (%): 23 <titẹ ẹhin
jade (MB): 456, ipin 0.26, lori (%): 128, eru ilekuro counter: 56, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.31, lori (%): 71, eru ilekuro counter: 57, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 58, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 59, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 60, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 61, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 62, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 63, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.32, lori (%): 71, eru ilekuro counter: 64, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 65, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 66, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.32, lori (%): 71, eru ilekuro counter: 67, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 68, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.32, lori (%): 71, eru ilekuro counter: 69, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.32, lori (%): 71, eru ilekuro counter: 70, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 71, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 72, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 73, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 74, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 75, DataBlock caching lọwọlọwọ (%): 22
jade (MB): 342, ipin 0.33, lori (%): 71, eru ilekuro counter: 76, DataBlock caching lọwọlọwọ (%): 22
ti jade (MB): 21, ipin 0.33, lori (%): -90, kika idasile eru: 76, DataBlock caching lọwọlọwọ (%): 32
ti jade (MB): 0, ipin 0.0, lori (%): -100, kika idasile eru: 0, DataBlock caching lọwọlọwọ (%): 100
ti jade (MB): 0, ipin 0.0, lori (%): -100, kika idasile eru: 0, DataBlock caching lọwọlọwọ (%): 100

A nilo awọn ọlọjẹ naa lati ṣafihan ilana kanna ni irisi ayaworan ti ibatan laarin awọn apakan kaṣe meji - ẹyọkan (nibiti awọn bulọọki ti ko ti beere tẹlẹ tẹlẹ) ati pupọ (data “beere” o kere ju lẹẹkan ti wa ni ipamọ nibi):

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Ati nikẹhin, kini iṣẹ ti awọn paramita dabi ni irisi iwọn kan. Fun lafiwe, kaṣe naa ti wa ni pipa patapata ni ibẹrẹ, lẹhinna HBase ti ṣe ifilọlẹ pẹlu caching ati idaduro ibẹrẹ iṣẹ iṣapeye nipasẹ awọn iṣẹju 5 (awọn akoko imukuro 30).

Kikun koodu le ri ni Fa Ibere HBASE 23887 lori github.

Sibẹsibẹ, 300 ẹgbẹrun kika fun iṣẹju-aaya kii ṣe gbogbo ohun ti o le ṣee ṣe lori ohun elo yii labẹ awọn ipo wọnyi. Otitọ ni pe nigba ti o nilo lati wọle si data nipasẹ HDFS, ọna ẹrọ ShortCircuitCache (eyiti o tọka si SSC) ni a lo, eyiti o fun ọ laaye lati wọle si data taara, yago fun awọn ibaraenisọrọ nẹtiwọọki.

Profaili fihan pe botilẹjẹpe ẹrọ yii n funni ni ere nla, o tun ni aaye kan di igo, nitori pe gbogbo awọn iṣẹ ṣiṣe ti o wuwo waye ninu titiipa kan, eyiti o yori si idinamọ ni ọpọlọpọ igba.

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Lehin ti o ti mọ eyi, a rii pe iṣoro naa le ni iyipo nipa ṣiṣẹda ọpọlọpọ awọn SSCs olominira:

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

Ati lẹhinna ṣiṣẹ pẹlu wọn, laisi awọn ikorita tun ni nọmba aiṣedeede ti o kẹhin:

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

Bayi o le bẹrẹ idanwo. Lati ṣe eyi, a yoo ka awọn faili lati HDFS pẹlu ohun elo olona-asapo ti o rọrun. Ṣeto awọn paramita:

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

Ati ki o kan ka awọn faili:

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);
}

A ṣe koodu yii ni awọn okun lọtọ ati pe a yoo mu nọmba awọn faili ka nigbakanna (lati 10 si 200 - ipo petele) ati nọmba awọn kaṣe (lati 1 si 10 - awọn aworan). Iwọn inaro ṣe afihan isare ti o jẹ abajade lati ilosoke ninu SSC ni ibatan si ọran nigbati kaṣe kan nikan wa.

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Bii o ṣe le ka aworan naa: Akoko ipaniyan fun 100 ẹgbẹrun kika ni awọn bulọọki 64 KB pẹlu kaṣe kan nilo awọn aaya 78. Lakoko pẹlu awọn caches 5 o gba iṣẹju-aaya 16. Awon. isare ti ~5 igba wa. Gẹgẹbi a ti le rii lati ori aworan naa, ipa naa ko ṣe akiyesi pupọ fun nọmba kekere ti awọn kika afiwera; o bẹrẹ lati ṣe ipa ti o ṣe akiyesi nigbati o ba wa diẹ sii ju okun 50. O tun ṣe akiyesi pe jijẹ nọmba awọn SSC lati 6 ati loke yoo fun a significantly kere išẹ ilosoke.

Akiyesi 1: niwọn bi awọn abajade idanwo jẹ iyipada pupọ (wo isalẹ), awọn ṣiṣe 3 ni a ṣe ati awọn iye abajade jẹ aropin.

Akiyesi 2: Ere iṣẹ lati atunto iwọle laileto jẹ kanna, botilẹjẹpe iraye si funrararẹ lọra diẹ.

Sibẹsibẹ, o jẹ dandan lati ṣalaye pe, ko dabi ọran pẹlu HBase, isare yii kii ṣe ọfẹ nigbagbogbo. Nibi a “ṣii” agbara Sipiyu lati ṣe iṣẹ diẹ sii, dipo adiye lori awọn titiipa.

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Nibi o le ṣe akiyesi pe, ni gbogbogbo, ilosoke ninu nọmba awọn caches n funni ni alekun isunmọ ni ilo Sipiyu. Sibẹsibẹ, nibẹ ni o wa die-die siwaju sii gba awọn akojọpọ.

Fun apẹẹrẹ, jẹ ki a wo isunmọ si eto SSC = 3. Ilọsoke iṣẹ ṣiṣe lori iwọn jẹ nipa awọn akoko 3.3. Ni isalẹ wa awọn abajade lati gbogbo awọn ṣiṣe lọtọ mẹta.

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Lakoko ti agbara Sipiyu pọ si nipa awọn akoko 2.8. Iyatọ naa ko tobi pupọ, ṣugbọn Greta kekere ti dun tẹlẹ ati pe o le ni akoko lati lọ si ile-iwe ati gba awọn ẹkọ.

Nitorinaa, eyi yoo ni ipa rere fun eyikeyi ọpa ti o lo iwọle olopobobo si HDFS (fun apẹẹrẹ Spark, bbl), pese pe koodu ohun elo jẹ iwuwo fẹẹrẹ (ie pulọọgi naa wa ni ẹgbẹ alabara HDFS) ati pe agbara Sipiyu ọfẹ wa . Lati ṣayẹwo, jẹ ki a ṣe idanwo ipa wo ni apapọ lilo BlockCache iṣapeye ati yiyi SSC fun kika lati HBase yoo ni.

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

O le rii pe labẹ iru awọn ipo ipa ko tobi bi ninu awọn idanwo ti a tunṣe (kika laisi eyikeyi sisẹ), ṣugbọn o ṣee ṣe pupọ lati fun pọ 80K afikun nibi. Ni apapọ, awọn iṣapeye mejeeji pese soke si iyara 4x.

A tun ṣe PR fun iṣapeye yii [HDFS-15202], eyiti a ti dapọ ati pe iṣẹ ṣiṣe yoo wa ni awọn idasilẹ ọjọ iwaju.

Ati nikẹhin, o jẹ ohun ti o nifẹ lati ṣe afiwe iṣẹ kika ti ibi-ipamọ data jakejado-iwe, Cassandra ati HBase.

Lati ṣe eyi, a ṣe ifilọlẹ awọn apẹẹrẹ ti IwUlO idanwo fifuye YCSB boṣewa lati ọdọ awọn ogun meji (awọn okun 800 lapapọ). Ni ẹgbẹ olupin - awọn iṣẹlẹ 4 ti RegionServer ati Cassandra lori awọn ọmọ-ogun 4 (kii ṣe awọn ibi ti awọn alabara nṣiṣẹ, lati yago fun ipa wọn). Awọn kika wa lati awọn tabili ti iwọn:

HBase – 300 GB lori HDFS (100 GB data mimọ)

Cassandra - 250 GB (ifojusi ẹda = 3)

Awon. iwọn didun jẹ isunmọ kanna (ni HBase diẹ diẹ sii).

Awọn paramita HBase:

dfs.client.short.circuit.num = 5 (Imudara alabara HDFS)

hbase.lru.cache.heavy.eviction.count.limit = 30 - Eyi tumọ si pe alemo yoo bẹrẹ ṣiṣẹ lẹhin awọn imukuro 30 (~ iṣẹju 5)

hbase.lru.cache.heavy.eviction.mb.size.limit = 300 - iwọn ibi-afẹde ti caching ati yiyọ kuro

Awọn iwe-ipamọ YCSB ni a ṣe itupalẹ ati ṣajọ sinu awọn aworan Tayo:

Bii o ṣe le mu iyara kika pọ si lati HBase si awọn akoko 3 ati lati HDFS to awọn akoko 5

Bii o ti le rii, awọn iṣapeye wọnyi jẹ ki o ṣee ṣe lati ṣe afiwe iṣẹ ti awọn apoti isura infomesonu labẹ awọn ipo wọnyi ati ṣaṣeyọri 450 ẹgbẹrun kika fun iṣẹju-aaya.

A nireti pe alaye yii le wulo fun ẹnikan lakoko Ijakadi igbadun fun iṣelọpọ.

orisun: www.habr.com

Fi ọrọìwòye kun