ããã° ããŒã¿ãæ±ãå Žåãé«ãããã©ãŒãã³ã¹ãéèŠãªèŠä»¶ã® 1 ã€ã§ãã Sberbank ã®ããŒã¿èªã¿èŸŒã¿éšéã§ã¯ãã»ãŒãã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ã Hadoop ããŒã¹ã®ããŒã¿ ã¯ã©ãŠãã«éã蟌ããããéåžžã«å€§éã®æ
å ±ãããŒãåŠçããŸããåœç¶ã®ããšãªãããç§ãã¡ã¯ããã©ãŒãã³ã¹ãåäžãããæ¹æ³ãåžžã«æš¡çŽ¢ããŠããŸãããããŠä»åã¯ãRegionServer HBase ãš HDFS ã¯ã©ã€ã¢ã³ãã«ã©ã®ããã«ããããé©çšããã®ãã説æããããšæããŸãããã®ãããã§ãèªã¿åãæäœã®é床ã倧å¹
ã«åäžãããããšãã§ããŸããã
ãã ããæ¹åã®æ¬è³ªã«é²ãåã«ãHDD ã䜿çšããŠããå Žåã¯ååãšããŠåé¿ã§ããªãå¶éã«ã€ããŠè©±ããŠãã䟡å€ããããŸãã
HDD ãšé«éã©ã³ãã ã¢ã¯ã»ã¹èªã¿åãã«äºææ§ããªãçç±
ãåç¥ã®ãšãããHBase ããã®ä»ã®å€ãã®ããŒã¿ããŒã¹ã¯ããµã€ãºãæ°åãããã€ãã®ãããã¯ã«ããŒã¿ãä¿åããŸããããã©ã«ãã§ã¯çŽ 64 KB ã§ããããã§ã100 ãã€ãã ããååŸããå¿
èŠããããç¹å®ã®ããŒã䜿çšããŠãã®ããŒã¿ãæäŸããããã« HBase ã«èŠæ±ãããšæ³åããŠã¿ãŸãããã HFiles ã®ããã㯠ãµã€ãºã¯ 64 KB ã§ããããããªã¯ãšã¹ãã¯å¿
èŠãªãµã€ãºã® 640 å (ããã XNUMX å!) ã«ãªããŸãã
次ã«ããªã¯ãšã¹ã㯠HDFS ãšãã®ã¡ã¿ããŒã¿ ãã£ãã·ã¥ ã¡ã«ããºã ãééããããã ç絡ãã£ãã·ã¥ (ãã¡ã€ã«ãžã®çŽæ¥ã¢ã¯ã»ã¹ãå¯èœã«ãªããŸã)ãããã«ããããã£ã¹ã¯ãããã§ã« 1 MB ãèªã¿åãããããšã«ãªããŸãã ãã ããããã¯ãã©ã¡ãŒã¿ã§èª¿æŽã§ããŸã dfs.client.read.shortcircuit.buffer.size ãããŠå€ãã®å Žåããã®å€ãããšãã° 126 KB ã«æžããããšãåççã§ãã
ãããå®è¡ãããšããŸãããã ããããã«ãFileChannel.read ãªã©ã®é¢æ°ãªã©ã® Java API ãä»ããŠããŒã¿ã®èªã¿åããéå§ããæå®ãããéã®ããŒã¿ãèªã¿åãããã«ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«èŠæ±ãããšãã念ã®ãããããã« 2 åã®èªã¿åããè¡ãããŸãã ãã€ãŸãç§ãã¡ã®å Žå㯠256 KBãããã¯ãJava ã«ã¯ããã®åäœãé²ãããã® FADV_RANDOM ãã©ã°ãèšå®ããç°¡åãªæ¹æ³ããªãããã§ãã
ãã®çµæã100 ãã€ããååŸããããã«ãå éšã§ã¯ 2600 å以äžã®ããŒã¿ãèªã¿åãããŸãã 解決çã¯æããã ãšæãããŸããããã㯠ãµã€ãºã 2 ãããã€ãã«åæžããåè¿°ã®ãã©ã°ãèšå®ããŠãåçºãå€§å¹ ã«å éããŸãããã ãããåé¡ã¯ãããã㯠ãµã€ãºã 2 åã«æžãããšãåäœæéãããã«èªã¿åããããã€ãæ°ã XNUMX åã«æžå°ããããšã§ãã
FADV_RANDOM ãã©ã°ãèšå®ãããšãããçšåºŠã®å©çãåŸãããŸãããããã¯é«ãã«ãã¹ã¬ããã§ããã㯠ãµã€ãºã 128 KB ã®å Žåã«éãããŸãããããã¯æ倧ã§æ°åããŒã»ã³ãã§ãã
ãã¹ãã¯ã100 å°ã® HDD äžã«ãã 1 GB ã®ãµã€ãºã® 10 åã®ãã¡ã€ã«ã«å¯ŸããŠå®è¡ãããŸããã
ååãšããŠããã®é床ã§äœãæåŸ
ã§ããããèšç®ããŠã¿ãŸãããã
10 æã®ãã£ã¹ã¯ãã 280 MB/ç§ã®é床ã§èªã¿åããšããŸãã 3äžÃ100ãã€ããããããèŠããŠãããšãããå¿
èŠãªããŒã¿ã¯èªã¿åãããããŒã¿ã® 2600 åã® 3 ã§ãããããã£ãŠã2600 äžã XNUMX ã§å²ããšã次ã®ããã«ãªããŸãã 1100 ç§ããã XNUMX ã¬ã³ãŒãã
æ鬱ã§ããã ãããèªç¶ã§ã ã©ã³ãã ã¢ã¯ã»ã¹ ãããã¯ãµã€ãºã«é¢ä¿ãªããHDD äžã®ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸããããã¯ã©ã³ãã ã¢ã¯ã»ã¹ã®ç©ççãªå¶éã§ããããã®ãããªæ¡ä»¶äžã§ã¯ããŒã¿ããŒã¹ã¯ãã以äžã«çµãåºãããšãã§ããŸããã
ã§ã¯ãããŒã¿ããŒã¹ã¯ã©ã®ããã«ããŠé«éåãå®çŸã§ããã®ã§ãããã?ãã®è³ªåã«çããããã«ã次ã®å³ã§äœãèµ·ãã£ãŠããããèŠãŠã¿ãŸãããã
ããã§ãæåã®æ°åéã®é床ã¯ãå®éã«ã¯ 60 ç§ãããçŽ XNUMX ã¬ã³ãŒãã§ããããšãããããŸãããã ããèŠæ±ããããããã¯ããã«å€ãã®ããŒã¿ãèªã¿åããããããããŒã¿ã¯ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã (Linux) ã®ãã/ãã£ãã·ã¥ã«ä¿åãããé床ã¯ããã«ãŸãšã㪠XNUMX ç§ããã XNUMX ã«å¢å ããŸãã
ãããã£ãŠãOS ãã£ãã·ã¥å ã«ããããŒã¿ããŸãã¯åçã®ã¢ã¯ã»ã¹é床㮠SSD/NVMe ã¹ãã¬ãŒãž ããã€ã¹ã«ããããŒã¿ã®ã¿ãžã®ã¢ã¯ã»ã¹ã®é«éåã«ããã«å¯ŸåŠããŸãã
ç§ãã¡ã®å Žåã4 å°ã®ãµãŒããŒãããªããã³ãã§ãã¹ããå®æœããŸããåãµãŒããŒã«ã¯æ¬¡ã®ããã«èª²éãããŸãã
CPU: Xeon E5-2680 v4 @ 2.40GHz 64 ã¹ã¬ããã
ã¡ã¢ãªïŒ730GBã
Java ããŒãžã§ã³: 1.8.0_111
ããã§éèŠãªç¹ã¯ãèªã¿åãå¿ èŠãããããŒãã«å ã®ããŒã¿ã®éã§ããå®éãHBase ãã£ãã·ã¥ã«å®å šã«é 眮ãããŠããããŒãã«ããããŒã¿ãèªã¿åãå Žåããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã® buff/ãã£ãã·ã¥ããã®èªã¿åãã¯è¡ãããŸãããããã¯ãHBase ãããã©ã«ãã§ã¡ã¢ãªã® 40% ã BlockCache ãšåŒã°ããæ§é ã«å²ãåœãŠãããã§ããåºæ¬çã«ãã㯠ConcurrentHashMap ã§ãããŒã¯ãã¡ã€ã«å + ãããã¯ã®ãªãã»ãããå€ã¯ãã®ãªãã»ããã®å®éã®ããŒã¿ã§ãã
ãããã£ãŠããã®æ§é ã ããèªã¿åããšã
ããšãã°ãç§ãã¡ã®å Žåã12 ã€ã® RS äžã® BlockCache ã®ããªã¥ãŒã ã¯çŽ 96 GB ã§ãã 4 ã€ã®ããŒãã« 130 ã€ã® RS ãé 眮ããŸãããã€ãŸãããã¹ãŠã®ããŒã㧠BlockCache ã« 800 GB ãå²ãåœãŠãããŸãããããŠããã®äœåãã®ããŒã¿ããããŸããããšãã°ã410 ã€ã®ããŒãã«ããããã XNUMX é åãããããã¡ã€ã«ã®ãµã€ãºã XNUMX MB ã§ãFAST_DIFF ã§å§çž®ãããŠãããšããŸããåèš XNUMX GB (ããã¯çŽç²ãªããŒã¿ãã€ãŸãã¬ããªã±ãŒã·ã§ã³ä¿æ°ãèæ ®ããŠããªã)ã
ãããã£ãŠãBlockCache ã¯ç·ããŒã¿éã®çŽ 23% ã«ããããããã¯ãããã BigData ã®å®éã®ç¶æ ã«ã¯ããã«è¿ããã®ã«ãªããŸãããããŠãããããã楜ãã¿ã®å§ãŸãã§ããæããã«ããã£ãã·ã¥ ããããå°ãªãã»ã©ãããã©ãŒãã³ã¹ãäœäžããããã§ããçµå±ã®ãšãããéããå Žåã¯ãå€ãã®äœæ¥ãè¡ãå¿ èŠããããŸããã·ã¹ãã é¢æ°ã®åŒã³åºãã«é²ã¿ãŸãããã ããããã¯é¿ããããªãã®ã§ããŸã£ããå¥ã®åŽé¢ãã€ãŸããã£ãã·ã¥å ã®ããŒã¿ã¯ã©ããªãã®ããèŠãŠã¿ãŸãããã
ç¶æ³ãåçŽåããŠã1 ã€ã®ãªããžã§ã¯ãã®ã¿ã«é©åãããã£ãã·ã¥ããããšä»®å®ããŸãããã 以äžã¯ããã£ãã·ã¥ã® 3 åã®ããŒã¿ ããªã¥ãŒã ãåŠçããããšãããšäœãèµ·ãããã®äŸã§ãã次ã®ããšãè¡ãå¿ èŠããããŸãã
1. ããã㯠1 ããã£ãã·ã¥ã«é
眮ããŸã
2. ããã㯠1 ããã£ãã·ã¥ããåé€ããŸã
3. ããã㯠2 ããã£ãã·ã¥ã«é
眮ããŸã
4. ããã㯠2 ããã£ãã·ã¥ããåé€ããŸã
5. ããã㯠3 ããã£ãã·ã¥ã«é
眮ããŸã
5ã€ã®ã¢ã¯ã·ã§ã³ãå®äºããŸããïŒ ãã ãããã®ç¶æ³ã¯æ£åžžãšã¯èšããŸãããå®éãHBase ã«ãŸã£ããç¡é§ãªäœæ¥ã匷å¶ããŠããããšã«ãªããŸãã åžžã« OS ãã£ãã·ã¥ããããŒã¿ãèªã¿åããBlockCache ã«é 眮ããŸãããããŒã¿ã®æ°ããéšåãå°çãããããã»ãŒããã«ããŒã¿ãç Žæ£ããŸãã æçš¿ã®åé ã®ã¢ãã¡ãŒã·ã§ã³ã¯åé¡ã®æ¬è³ªã瀺ããŠããŸã - ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯èŠæš¡ãè¶ ããé°å²æ°ã¯å ç±ããŠãããé ãé¢ããæãã¹ãŠã§ãŒãã³ã®å°ããªã°ã¬ã¿ããã¯åæºããŠããŸãã ãããŠãç§ãã¡ IT æ åœè ã¯ãåäŸãã¡ãæ²ããã§ããã®ãæ¬åœã«å«ãªã®ã§ãããã«å¯ŸããŠäœãã§ããããèãå§ããŸãã
ãã£ãã·ã¥ããªãŒããŒãããŒããªãããã«ããã¹ãŠã®ãããã¯ããã£ãã·ã¥ã«å ¥ããã®ã§ã¯ãªããç¹å®ã®å²åã ãããã£ãã·ã¥ã«å ¥ãããã©ããªãã§ãããã? ãŸãã¯ãBlockCache ã«ããŒã¿ãå ¥ããããã®é¢æ°ã®å é ã«æ°è¡ã®ã³ãŒããè¿œå ããã ãã§ãã
public void cacheBlock(BlockCacheKey cacheKey, Cacheable buf, boolean inMemory) {
if (cacheDataBlockPercent != 100 && buf.getBlockType().isData()) {
if (cacheKey.getOffset() % 100 >= cacheDataBlockPercent) {
return;
}
}
...
ããã§ã®ãã€ã³ãã¯æ¬¡ã®ãšããã§ãããªãã»ããã¯ãã¡ã€ã«å ã®ãããã¯ã®äœçœ®ã§ããããã®æåŸã®æ°å㯠00 ãã 99 ãŸã§ã©ã³ãã ãã€åçã«ååžããŸãããããã£ãŠãå¿ èŠãªç¯å²ã«è©²åœãããã®ã ããã¹ãããããŸãã
ããšãã°ãcacheDataBlockPercent = 20 ã«èšå®ãããšãäœãèµ·ãããã確èªããŸãã
çµæã¯æããã§ãã 以äžã®ã°ã©ãã§ã¯ããªããã®ãããªå éãèµ·ãã£ãã®ããæããã§ããããŒã¿ããã£ãã·ã¥ã«çœ®ããšããã·ã·ã¥ãã§ã®ãããªäœæ¥ãè¡ããã«ã倧éã® GC ãªãœãŒã¹ãç¯çŽããŠããã®ã§ããããã ã¡ã«ç«æã®ç¬ã®ããã«æšãŠãŠããã ãã§ãã
åæã«ãCPU 䜿çšçãå¢å ããŸãããçç£æ§ãããã¯ããã«äœããªããŸãã
BlockCache ã«ä¿åããããããã¯ãç°ãªãããšã«ã泚æããŠãã ãããã»ãšãã© (çŽ 95%) ã¯ããŒã¿ãã®ãã®ã§ããæ®ãã¯ãã«ãŒã ãã£ã«ã¿ãŒã LEAF_INDEX ãªã©ã®ã¡ã¿ããŒã¿ã§ãã
ãããã£ãŠãã³ãŒãã«ã¯ãã§ãã¯æ¡ä»¶ããããŸãã buf.getBlockType().isData() ãã®ã¡ã¿ã®ãããã§ããããªãå Žåã§ããã£ãã·ã¥ã«æ®ããŠãããŸãã
次ã«ãè² è·ãå¢ãããŠæ©èœãäžåºŠã«å°ãç· ããŠã¿ãŸãããã æåã®ãã¹ãã§ã¯ã«ãããªã ããŒã»ã³ããŒãž = 20 ã«èšå®ããBlockCache ã¯ãããã«ååã«æŽ»çšãããŠããŸããã§ããã 次ã«ãããã 23% ã«èšå®ãã100 åããšã« 5 ã¹ã¬ãããè¿œå ããŠãã©ã®æç¹ã§é£œåãçºçãããã確èªããŠã¿ãŸãããã
ããã§ã¯ãå
ã®ããŒãžã§ã³ã§ã¯ 100 ç§ãããçŽ 300 ãªã¯ãšã¹ããã»ãŒããã«äžéã«éããŠããããšãããããŸããäžæ¹ããããã§ã¯æ倧 XNUMX ã®å éãåŸãããŸããåæã«ããããªãé«éåããã¯ããç¡æãã§ã¯ãªããªã£ãŠããããšã¯æããã§ãããCPU 䜿çšçãå¢å ããŠããŸãã
ãã ããããã¯ããŸãæŽç·Žããã解決çã§ã¯ãããŸããããã£ãã·ã¥ã«å¿ èŠãªãããã¯ã®å²åãäºåã«åããããè² è·ãããã¡ã€ã«ã«äŸåããããã§ãããããã£ãŠãèªã¿åãæäœã®ã¢ã¯ãã£ããã£ã«å¿ããŠãã®ãã©ã¡ãŒã¿ãèªåçã«èª¿æŽããã¡ã«ããºã ãå®è£ ãããŸããã
ãããå¶åŸ¡ããããã« 3 ã€ã®ãªãã·ã§ã³ãè¿œå ãããŸããã
hbase.lru.cache.heavy.eviction.count.limit â æé©å (ã€ãŸãããããã¯ã®ã¹ããã) ã®äœ¿çšãéå§ããåã«ããã£ãã·ã¥ããããŒã¿ãåé€ããããã»ã¹ãå®è¡ããåæ°ãèšå®ããŸãã ããã©ã«ãã§ã¯ããã㯠MAX_INT = 2147483647 ã«çãããå®éããã®å€ã§ã¯æ©èœãåäœãéå§ããªãããšãæå³ããŸãã ãšãã¯ã·ã§ã³ããã»ã¹ã¯ 5 ïœ 10 ç§ããšã«éå§ããããã (è² è·ã«ãã£ãŠç°ãªããŸã)ã2147483647 * 10 / 60 / 60 / 24 / 365 = 680 幎ãšãªããŸãã ãã ãããã®ãã©ã¡ãŒã¿ã 0 ã«èšå®ããŠãèµ·åçŽåŸã«æ©èœãåäœãããããšãã§ããŸãã
ãã ãããã®ãã©ã¡ãŒã¿ã«ã¯ãã€ããŒãããããŸããè² è·ãçæèªã¿åã (æ¥äžãªã©) ãšé·æèªã¿åã (å€é) ãåžžã«æ£åšãããããªå Žåã¯ãé·æèªã¿åãæäœãé²è¡äžã®å Žåã«ã®ã¿ãã®æ©èœããªã³ã«ããããšãã§ããŸãã
ããšãã°ãçæéã®èªã¿åãã¯éåžžçŽ 1 åéç¶ãããšãããã£ãŠããŸãã ãããã¯ãå»æ£ãå§ããå¿ èŠã¯ãããŸããããã£ãã·ã¥ãå€ããªãããšã¯ãããŸããããã®åŸããã®ãã©ã¡ãŒã¿ãããšãã° 10 ã«èšå®ã§ããŸããããã«ãããæé©åã¯é·æéå®è¡ãããå Žåã«ã®ã¿æ©èœãå§ãããšããäºå®ã«ãªããŸããã¢ã¯ãã£ããªãŒãã£ã³ã°ãšããçšèªãå§ãŸããŸããã 100ç§ä»¥å ã«ã ãããã£ãŠãçæéã®èªã¿åããããå Žåããã¹ãŠã®ãããã¯ããã£ãã·ã¥ã«å ¥ãã䜿çšå¯èœã«ãªããŸã (æšæºã¢ã«ãŽãªãºã ã«ãã£ãŠåé€ããããããã¯ãé€ã)ã ãŸããé·æèªã¿åããè¡ãå Žåããã®æ©èœããªã³ã«ãªããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
hbase.lru.cache.heavy.eviction.mb.size.limit â 10 ç§éã«ãã£ãã·ã¥ã«ä¿åãã (ãããŠãã¡ããåé€ãã) ã¡ã¬ãã€ãæ°ãèšå®ããŸãããã®æ©èœã¯ããã®å€ã«å°éãããããç¶æããããšããŸããéèŠãªã®ã¯ãã®ã¬ãã€ãããã£ãã·ã¥ã«æŒã蟌ããšãã®ã¬ãã€ããè¿œãåºãå¿ èŠããããäžã§èŠãããã«ãããã«ã¯éåžžã«ã³ã¹ããããããšããããšã§ãããã ããããã㯠ã¹ããã ã¢ãŒããéäžã§çµäºããŠããŸããããå°ããããå€ãèšå®ããªãã§ãã ããã匷åãªãµãŒã㌠(çŽ 20 ïœ 40 ã®ç©çã³ã¢) ã®å ŽåãçŽ 300 ïœ 400 MB ãèšå®ããã®ãæé©ã§ããããã«ã¯ã©ã¹ (~10 ã³ã¢) ã®å Žå㯠200 ïœ 300 MBã匱ãã·ã¹ãã (2 ïœ 5 ã³ã¢) ã®å Žåã50 ïœ 100 MB ãæ£åžžã§ããå¯èœæ§ããããŸã (ãããã§ã¯ãã¹ããããŠããŸãã)ã
ãããã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã hbase.lru.cache.heavy.eviction.mb.size.limit = 500 ã«èšå®ãããšããŸããäœããã®è² è· (èªã¿åã) ãããããã®åŸãçŽ 10 ç§ããšã«ãã©ã®ãããã®ãã€ãæ°ããã£ãããèšç®ããŸãã次ã®åŒã䜿çšããŠåé€ãããŸãã
ãªãŒããŒããã = 解æŸããããã€ãã®åèš (MB) * 100 / å¶é (MB) - 100;
å®éã« 2000 MB ãåé€ãããå ŽåããªãŒããŒãããã¯æ¬¡ã®ããã«ãªããŸãã
2000 * 100 / 500 - 100 = 300%
ã¢ã«ãŽãªãºã ã¯æ°åããŒã»ã³ã以äžãç¶æããããšããããããã®æ©èœã¯ãã£ãã·ã¥ããããããã¯ã®å²åãæžãããããã«ãã£ãŠèªå調æŽã¡ã«ããºã ãå®è£ ããŸãã
ãã ããè² è·ãäœäžããå Žåã200 MB ã®ã¿ãæé€ããããªãŒããŒãããããã€ãã¹ã«ãªããšããŸã (ãããããªãŒããŒã·ã¥ãŒã)ã
200 * 100 / 500 - 100 = -60%
éã«ããã®æ©èœã¯ãªãŒããŒããããæ£ã«ãªããŸã§ãã£ãã·ã¥ããããããã¯ã®å²åãå¢ãããŸãã
以äžã¯ããããå®éã®ããŒã¿ã§ã©ã®ããã«èŠãããã瀺ãäŸã§ãã 0%ã«å°éããããšããå¿ èŠã¯ãããŸãããããã¯äžå¯èœã§ããçŽ 30 ïœ 100% ã«ãããšéåžžã«åªããŠãããããã¯çæéã®ãµãŒãžäžã«æé©åã¢ãŒããæ©æã«çµäºããããšãåé¿ããã®ã«åœ¹ç«ã¡ãŸãã
hbase.lru.cache.heavy.eviction.overhead.coefficient â çµæãåŸããŸã§ã®æéãèšå®ããŸãã èªã¿åããã»ãšãã©é·ããåŸ ã¡ãããªãããšã確å®ã«ããã£ãŠããå Žåã¯ããã®æ¯çãé«ããŠãããéãé«ãããã©ãŒãã³ã¹ãåŸãããšãã§ããŸãã
ããšãã°ããã®ä¿æ°ã 0.01 ã«èšå®ããŸããããã¯ãçµæãšããŠãªãŒããŒããã (äžèšãåç §) ã«ãã®æ°å€ãä¹ç®ããããã£ãã·ã¥ããããããã¯ã®å²åãæžå°ããããšãæå³ããŸãããªãŒããŒããã = 300%ãä¿æ° = 0.01 ã§ãããšä»®å®ãããšããã£ãã·ã¥ããããããã¯ã®å²å㯠3% æžå°ããŸãã
åæ§ã®ãããã¯ãã¬ãã·ã£ãŒãããžãã¯ã¯ãè² ã®ãªãŒããŒããã (ãªãŒããŒã·ã¥ãŒã) å€ã«ãå®è£ ãããŸããèªã¿åãããã³ãšãã¯ã·ã§ã³ã®éã®çæçãªå€åã¯åžžã«èµ·ããåŸãããããã®ã¡ã«ããºã ã䜿çšãããšãæé©åã¢ãŒãããã®éäžã§ã®çµäºãåé¿ã§ããŸããããã¯ãã¬ãã·ã£ãŒã«ã¯éã®ããžãã¯ãããããªãŒããŒã·ã¥ãŒãã匷ãã»ã©ãããå€ãã®ãããã¯ããã£ãã·ã¥ãããŸãã
å®è£ ã³ãŒã
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;
}
å®éã®äŸã䜿çšããŠããããã¹ãŠãèŠãŠã¿ãŸãããã 次ã®ãã¹ã ã¹ã¯ãªããããããŸãã
- ã¹ãã£ã³ãéå§ããŸããã (25 ã¹ã¬ãããããã = 100)
- 5 ååŸããã«ãã²ãããè¿œå ããŸã (25 ã¹ã¬ãããããã = 100)
- 5 ååŸããã«ãã²ããããªãã«ããŸã (åã³ã¹ãã£ã³ã®ã¿ãæ®ããŸã)ã
10000 ã€ã®å®è¡ãè¡ããŸããæåã« hbase.lru.cache.heavy.eviction.count.limit = 0 (å®éã«æ©èœãç¡å¹ã«ããŸã)ã次ã«ãlimit = XNUMX (æ©èœãæå¹ã«ããŸã) ãèšå®ããŸãã
以äžã®ãã°ã§ã¯ããã®æ©èœããªã³ã«ãªã£ãŠãªãŒããŒã·ã¥ãŒãã 14 ïœ 71% ã«ãªã»ãããããæ§åãããããŸããæã è² è·ãæžå°ãããšãããã¯ãã¬ãã·ã£ãŒããªã³ã«ãªããHBase ã¯åã³ããå€ãã®ãããã¯ããã£ãã·ã¥ããŸãã
ãã°é åãµãŒããŒ
ãšãã¯ã·ã§ã³ (MB): 0ãæ¯ç 0.0ããªãŒããŒããã (%): -100ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 0ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 100
ãšãã¯ã·ã§ã³ (MB): 0ãæ¯ç 0.0ããªãŒããŒããã (%): -100ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 0ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 100
ãšãã¯ã·ã§ã³ (MB): 2170ãæ¯ç 1.09ããªãŒããŒããã (%): 985ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 1ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 91 < éå§
ãšãã¯ã·ã§ã³ (MB): 3763ãæ¯ç 1.08ããªãŒããŒããã (%): 1781ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 2ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 76
ãšãã¯ã·ã§ã³ (MB): 3306ãæ¯ç 1.07ããªãŒããŒããã (%): 1553ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 3ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 61
ãšãã¯ã·ã§ã³ (MB): 2508ãæ¯ç 1.06ããªãŒããŒããã (%): 1154ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 4ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 50
ãšãã¯ã·ã§ã³ (MB): 1824ãæ¯ç 1.04ããªãŒããŒããã (%): 812ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 5ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 42
ãšãã¯ã·ã§ã³ (MB): 1482ãæ¯ç 1.03ããªãŒããŒããã (%): 641ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 6ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 36
ãšãã¯ã·ã§ã³ (MB): 1140ãæ¯ç 1.01ããªãŒããŒããã (%): 470ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 7ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 32
ãšãã¯ã·ã§ã³ (MB): 913ãæ¯ç 1.0ããªãŒããŒããã (%): 356ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 8ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 29
ãšãã¯ã·ã§ã³ (MB): 912ãæ¯ç 0.89ããªãŒããŒããã (%): 356ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 9ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 26
ãšãã¯ã·ã§ã³ (MB): 684ãæ¯ç 0.76ããªãŒããŒããã (%): 242ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 10ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 24
ãšãã¯ã·ã§ã³ (MB): 684ãæ¯ç 0.61ããªãŒããŒããã (%): 242ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 11ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 456ãæ¯ç 0.51ããªãŒããŒããã (%): 128ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 12ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 21
ãšãã¯ã·ã§ã³ (MB): 456ãæ¯ç 0.42ããªãŒããŒããã (%): 128ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 13ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 20
ãšãã¯ã·ã§ã³ (MB): 456ãæ¯ç 0.33ããªãŒããŒããã (%): 128ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 14ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 15ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.32ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 16ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.31ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 17ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.3ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 18ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.29ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 19ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.27ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 20ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.25ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 21ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.24ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 22ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.22ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 23ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.21ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 24ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.2ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 25ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.17ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 26ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 456ãæ¯ç 0.17ããªãŒããŒããã (%): 128ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 27ãçŸåšã®ãã£ãã·ã¥ DataBlock (%): 18 < è¿œå ãããååŸ (ãã ãããŒãã«ã¯åã)
ãšãã¯ã·ã§ã³ (MB): 456ãæ¯ç 0.15ããªãŒããŒããã (%): 128ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 28ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.13ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 29ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.11ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 30ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.09ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 31ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.08ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 32ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.07ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 33ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.06ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 34ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.05ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 35ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.05ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 36ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.04ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 37ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 109ãæ¯ç 0.04ããªãŒããŒããã (%): -46ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 37ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22 < ãã㯠ãã¬ãã·ã£ãŒ
ãšãã¯ã·ã§ã³ (MB): 798ãæ¯ç 0.24ããªãŒããŒããã (%): 299ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 38ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 20
ãšãã¯ã·ã§ã³ (MB): 798ãæ¯ç 0.29ããªãŒããŒããã (%): 299ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 39ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 18
ãšãã¯ã·ã§ã³ (MB): 570ãæ¯ç 0.27ããªãŒããŒããã (%): 185ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 40ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 17
ãšãã¯ã·ã§ã³ (MB): 456ãæ¯ç 0.22ããªãŒããŒããã (%): 128ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 41ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 16
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.16ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 42ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 16
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.11ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 43ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 16
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.09ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 44ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 16
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.07ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 45ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 16
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.05ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 46ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 16
ãšãã¯ã·ã§ã³ (MB): 222ãæ¯ç 0.04ããªãŒããŒããã (%): 11ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 47ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 16
ãšãã¯ã·ã§ã³ (MB): 104ãæ¯ç 0.03ããªãŒããŒããã (%): -48ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 47ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 21 < å²ã蟌ã¿ã®ååŸ
ãšãã¯ã·ã§ã³ (MB): 684ãæ¯ç 0.2ããªãŒããŒããã (%): 242ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 48ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 19
ãšãã¯ã·ã§ã³ (MB): 570ãæ¯ç 0.23ããªãŒããŒããã (%): 185ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 49ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 18
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.22ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 50ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 18
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.21ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 51ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 18
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.2ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 52ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 18
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.18ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 53ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 18
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.16ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 54ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 18
ãšãã¯ã·ã§ã³ (MB): 228ãæ¯ç 0.14ããªãŒããŒããã (%): 14ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 55ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 18
ãšãã¯ã·ã§ã³ (MB): 112ãæ¯ç 0.14ããªãŒããŒããã (%): -44ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 55ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 23 < ãã㯠ãã¬ãã·ã£ãŒ
ãšãã¯ã·ã§ã³ (MB): 456ãæ¯ç 0.26ããªãŒããŒããã (%): 128ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 56ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.31ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 57ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 58ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 59ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 60ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 61ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 62ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 63ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.32ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 64ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 65ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 66ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.32ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 67ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 68ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.32ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 69ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.32ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 70ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 71ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 72ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 73ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 74ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 75ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 342ãæ¯ç 0.33ããªãŒããŒããã (%): 71ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 76ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 22
ãšãã¯ã·ã§ã³ (MB): 21ãæ¯ç 0.33ããªãŒããŒããã (%): -90ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 76ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 32
ãšãã¯ã·ã§ã³ (MB): 0ãæ¯ç 0.0ããªãŒããŒããã (%): -100ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 0ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 100
ãšãã¯ã·ã§ã³ (MB): 0ãæ¯ç 0.0ããªãŒããŒããã (%): -100ããããŒãšãã¯ã·ã§ã³ ã«ãŠã³ã¿: 0ãçŸåšã®ãã£ãã·ã¥ ããŒã¿ããã㯠(%): 100
ã¹ãã£ã³ã¯ãXNUMX ã€ã®ãã£ãã·ã¥ ã»ã¯ã·ã§ã³ (ãããŸã§ã«ãªã¯ãšã¹ããããããšããªããããã¯) ãšãã«ã (å°ãªããšã XNUMX åããªã¯ãšã¹ãããããããŒã¿ãããã«ä¿åããã) ã® XNUMX ã€ã®ãã£ãã·ã¥ ã»ã¯ã·ã§ã³éã®é¢ä¿ãã°ã©ãã®åœ¢åŒã§ç€ºãããã«ãåãããã»ã¹ã衚瀺ããå¿ èŠããããŸããã
æåŸã«ããã©ã¡ãŒã¿ãŒã®æäœãã°ã©ãã®åœ¢åŒã§ã©ã®ããã«èŠãããã瀺ããŸãã æ¯èŒã®ããã«ãæåã«ãã£ãã·ã¥ãå®å
šã«ãªãã«ãªãããã®åŸãã£ãã·ã¥ã䜿çšã㊠HBase ãèµ·åãããæé©åäœæ¥ã®éå§ã 5 å (30 ãšãã¯ã·ã§ã³ ãµã€ã¯ã«) é
延ãããŸããã
å®å
šãªã³ãŒãã¯ãã«ãªã¯ãšã¹ãã«ãããŸã
ãã ãããã®æ¡ä»¶äžã§ãã®ããŒããŠã§ã¢ã§éæã§ããã®ã¯ 300 ç§ããã XNUMX äžèªã¿åãã ãã§ã¯ãããŸããã å®éãHDFS çµç±ã§ããŒã¿ã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã¯ãShortCircuitCache (以äžãSSC) ã¡ã«ããºã ã䜿çšããããããã¯ãŒã¯ã®çžäºäœçšãåé¿ããŠããŒââã¿ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã
ãããã¡ã€ãªã³ã°ã®çµæããã®ã¡ã«ããºã ã¯å€§ããªå©ç¹ããããããŸãããããæç¹ã§ããã«ããã¯ã«ãªãããšãããããŸãããããã¯ãã»ãšãã©ãã¹ãŠã®éãæäœãããã¯å ã§çºçããã»ãšãã©ã®å Žåãããã¯ã«ã€ãªããããã§ãã
ãããç解ããåŸãç¬ç«ãã SSC ã®é
åãäœæããããšã§åé¡ãåé¿ã§ããããšãããããŸããã
private final ShortCircuitCache[] shortCircuitCache;
...
shortCircuitCache = new ShortCircuitCache[this.clientShortCircuitNum];
for (int i = 0; i < this.clientShortCircuitNum; i++)
this.shortCircuitCache[i] = new ShortCircuitCache(âŠ);
次ã«ãæåŸã®ãªãã»ããæ¡ã®äº€å·®ãé€å€ããŠãããããæäœããŸãã
public ShortCircuitCache getShortCircuitCache(long idx) {
return shortCircuitCache[(int) (idx % clientShortCircuitNum)];
}
ããã§ãã¹ããéå§ã§ããŸãããããè¡ãã«ã¯ãåçŽãªãã«ãã¹ã¬ãã ã¢ããªã±ãŒã·ã§ã³ã䜿çšã㊠HDFS ãããã¡ã€ã«ãèªã¿åããŸãããã©ã¡ãŒã¿ãèšå®ããŸãã
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
ãããŠãã¡ã€ã«ãèªãã ãã§ã:
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);
}
ãã®ã³ãŒãã¯å¥ã®ã¹ã¬ããã§å®è¡ãããåæã«èªã¿åããã¡ã€ã«ã®æ° (暪軞 10 ãã 200) ãšãã£ãã·ã¥ã®æ° (ã°ã©ãã£ãã¯ã¹ 1 ãã 10) ãå¢ãããŸãã瞊軞ã¯ããã£ãã·ã¥ã XNUMX ã€ãããªãå Žåãšæ¯èŒãã SSC ã®å¢å ã«ããå é床ã瀺ããŸãã
ã°ã©ãã®èŠæ¹: 100 ã€ã®ãã£ãã·ã¥ã䜿çšãã 64 KB ãããã¯ã§ã® 78 äžåã®èªã¿åãã®å®è¡æé㯠5 ç§ããããŸãã äžæ¹ã16 ã€ã®ãã£ãã·ã¥ã§ã¯ 5 ç§ããããŸãã ãããã®ã çŽ50åã®å éããããŸãã ã°ã©ããããããããã«ã䞊åèªã¿åãã®æ°ãå°ãªãå Žåãå¹æã¯ããŸãé¡èã§ã¯ãããŸããããã¹ã¬ããèªã¿åãã 6 ãè¶
ãããšé¡èãªåœ¹å²ãæããå§ããŸãããŸããSSC ã®æ°ã XNUMX ããå¢å ããŠããããšã泚ç®ã«å€ããŸãã以äžã®å Žåãããã©ãŒãã³ã¹ã®åäžã¯å€§å¹
ã«å°ãããªããŸãã
泚 1: ãã¹ãçµæã¯éåžžã«äžå®å®ã§ãããã (äžèšãåç §)ã3 åã®å®è¡ãå®è¡ããçµæã®å€ãå¹³åããŸããã
泚 2: ã©ã³ãã ã¢ã¯ã»ã¹ã®æ§æã«ããããã©ãŒãã³ã¹ã®åäžã¯åãã§ãããã¢ã¯ã»ã¹èªäœã¯è¥å¹²é ããªããŸãã
ãã ããHBase ã®å Žåãšã¯ç°ãªãããã®é«éåã¯åžžã«ç¡æã§ããããã§ã¯ãªãããšãæ確ã«ããå¿ èŠããããŸãã ããã§ã¯ãããã¯ã«äŸåããã®ã§ã¯ãªããCPU ã®èœåããããã¯è§£é€ãããŠãããå€ãã®äœæ¥ãå®è¡ã§ããããã«ããŸãã
ããã§ã¯ãäžè¬ã«ããã£ãã·ã¥ã®æ°ãå¢å ãããšãCPU 䜿çšçãã»ãŒæ¯äŸããŠå¢å ããããšãããããŸãããã ããããå°ãå€ãã®åã¡ã®çµã¿åããããããŸãã
ããšãã°ãSSC = 3 ã®èšå®ã詳ããèŠãŠã¿ãŸããããã¬ã³ãžã§ã®ããã©ãŒãã³ã¹ã®åäžã¯çŽ 3.3 åã§ãã以äžã¯ãXNUMX ã€ã®åå¥ã®å®è¡ãã¹ãŠã®çµæã§ãã
ãã ããCPU æ¶è²»éã¯çŽ 2.8 åã«ãªããŸãããã®å·®ã¯ããã»ã©å€§ãããããŸããããå°ããªã°ã¬ã¿ããã¯ãã§ã«å¹žãã§ãåŠæ ¡ã«éã£ãŠã¬ãã¹ã³ãåããæéããããããããŸããã
ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ ã³ãŒãã軜é (ã€ãŸãããã©ã°ã HDFS ã¯ã©ã€ã¢ã³ãåŽã«ãã) ã§ãCPU ãã¯ãŒã«ç©ºããããå Žåããã㯠HDFS ãžã®äžæ¬ã¢ã¯ã»ã¹ã䜿çšããããŒã« (Spark ãªã©) ã«ãšã£ãŠãã©ã¹ã®å¹æããããŸãã ã 確èªããããã«ãBlockCache ã®æé©åãš HBase ããã®èªã¿åãçšã® SSC ãã¥ãŒãã³ã°ãçµã¿åãããŠäœ¿çšââãããšã©ã®ãããªåœ±é¿ããããããã¹ãããŠã¿ãŸãããã
ãã®ãããªæ¡ä»¶äžã§ã¯ãå¹æã¯æŽç·Žããããã¹ã (åŠçãè¡ããã«èªã¿åã) ã»ã©å€§ãããªãããšãããããŸãããããã§ããã« 80K ãçµãåºãããšã¯ååã«å¯èœã§ããäž¡æ¹ã®æé©åãçµã¿åããããšãæ倧 4 åã®é«éåãå®çŸããŸãã
ä»åã®æé©åã«ã€ããŠãPRãè¡ããŸãã
æåŸã«ãåæ§ã®ã¯ã€ãã«ã©ã ããŒã¿ããŒã¹ã§ãã Cassandra ãš HBase ã®èªã¿åãããã©ãŒãã³ã¹ãæ¯èŒããã®ã¯èå³æ·±ãããšã§ããã
ãããè¡ãããã«ãæšæºã® YCSB è² è·ãã¹ã ãŠãŒãã£ãªãã£ã®ã€ã³ã¹ã¿ã³ã¹ã 800 ã€ã®ãã¹ã (åèš 4ââ4 ã¹ã¬ãã) ããèµ·åããŸããã ãµãŒããŒåŽ - XNUMX ã€ã®ãã¹ãäžã«ãRegionServer ãš Cassandra ã® XNUMX ã€ã®ã€ã³ã¹ã¿ã³ã¹ (ã¯ã©ã€ã¢ã³ãã®åœ±é¿ãé¿ãããããã¯ã©ã€ã¢ã³ããå®è¡ãããŠãããã¹ãã§ã¯ãããŸãã)ã 枬å®å€ã¯æ¬¡ã®ãµã€ãºã®ããŒãã«ããååŸãããŸããã
HBase â HDFS äžã§ 300 GB (çŽç²ãªããŒã¿ã¯ 100 GB)
Cassandra - 250 GB (ã¬ããªã±ãŒã·ã§ã³ä¿æ° = 3)
ãããã®ãããªã¥ãŒã ã¯ã»ãŒåãã§ãã (HBase ã§ã¯ããå°ã)ã
HBase ãã©ã¡ãŒã¿:
dfs.client.short.circuit.num = 5 (HDFS ã¯ã©ã€ã¢ã³ãã®æé©å)
hbase.lru.cache.heavy.eviction.count.limit = 30 - ããã¯ããããã 30 åã®ãšãã¯ã·ã§ã³ (çŽ 5 å) åŸã«æ©èœãå§ããããšãæå³ããŸãã
hbase.lru.cache.heavy.eviction.mb.size.limit = 300 â ãã£ãã·ã¥ãšãšãã¯ã·ã§ã³ã®ç®æšé
YCSB ãã°ã¯è§£æãããExcel ã°ã©ãã«ã³ã³ãã€ã«ãããŸããã
ã芧ã®ãšããããããã®æé©åã«ããããããã®æ¡ä»¶äžã§ãããã®ããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ãæ¯èŒãã450 ç§ããã XNUMX äžåã®èªã¿åããéæããããšãå¯èœã«ãªããŸãã
ãã®æ
å ±ããçç£æ§ãæ±ãããšããµã€ãã£ã³ã°ãªéãã®æäžã«èª°ãã®åœ¹ã«ç«ã€ããšãé¡ã£ãŠããŸãã
åºæïŒ habr.com