[ 
https://issues.apache.org/jira/browse/HBASE-20312?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16422246#comment-16422246
 ] 

Ted Yu commented on HBASE-20312:
--------------------------------

I ran test suite locally with patch and saw the following in test output of 
TestGetClosestAtOrBefore#testUsingMetaAndBinary :
{code}
2018-04-02 11:26:45,380 DEBUG [Time-limited test] regionserver.HRegion(1585): 
Failed flush hbase:meta,,1.1588230740 , Exception:region: hbase:meta,,1
org.apache.hadoop.hbase.DroppedSnapshotException: region: hbase:meta,,1
  at 
org.apache.hadoop.hbase.regionserver.HRegion.internalFlushCacheAndCommit(HRegion.java:2706)
  at 
org.apache.hadoop.hbase.regionserver.HRegion.internalFlushcache(HRegion.java:2383)
  at 
org.apache.hadoop.hbase.regionserver.HRegion.internalFlushcache(HRegion.java:2355)
  at 
org.apache.hadoop.hbase.regionserver.HRegion.internalFlushcache(HRegion.java:2346)
  at org.apache.hadoop.hbase.regionserver.HRegion.doClose(HRegion.java:1561)
  at org.apache.hadoop.hbase.regionserver.HRegion.close(HRegion.java:1466)
  at org.apache.hadoop.hbase.regionserver.HRegion.close(HRegion.java:1416)
  at 
org.apache.hadoop.hbase.HBaseTestingUtility.closeRegionAndWAL(HBaseTestingUtility.java:391)
  at 
org.apache.hadoop.hbase.regionserver.TestGetClosestAtOrBefore.testUsingMetaAndBinary(TestGetClosestAtOrBefore.java:157)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at 
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
  at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at 
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
  at 
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
  at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
  at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
  at 
org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)
  at 
org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)
  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.AssertionError: Key 
A,\x00~,1522668405203.2704c6f3f2f44706c250ec0530d297f4./info:regioninfo/1522668405203/Put/vlen=41/seqid=65/PBUF\x08\xD3\x83\xF0\xB0\xA8,\x12\x0C\x0A\x07default\x12\x01A\x1A\x02\x00~"\x04\x00\x00\x00\x80(\x000\x008\x00
 followed by a smaller key 
A,,1522668405122.18e143e59a9f63d05e9113dc41713a2f./info:regioninfo/1522668405127/Put/vlen=39/seqid=2/PBUF\x08\x82\x83\xF0\xB0\xA8,\x12\x0C\x0A\x07default\x12\x01A\x1A\x00"\x04\x00\x00\x00\x02(\x000\x008\x00
 in cf info
  at 
org.apache.hadoop.hbase.regionserver.StoreScanner.checkScanOrder(StoreScanner.java:946)
  at 
org.apache.hadoop.hbase.regionserver.StoreScanner.next(StoreScanner.java:563)
  at 
org.apache.hadoop.hbase.regionserver.StoreFlusher.performFlush(StoreFlusher.java:128)
  at 
org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher.flushSnapshot(DefaultStoreFlusher.java:69)
  at org.apache.hadoop.hbase.regionserver.HStore.flushCache(HStore.java:1011)
  at 
org.apache.hadoop.hbase.regionserver.HStore$StoreFlusherImpl.flushCache(HStore.java:2278)
  at 
org.apache.hadoop.hbase.regionserver.HRegion.internalFlushCacheAndCommit(HRegion.java:2642)
  ... 30 more
{code}

> CCSMap: A faster, GC-friendly, less memory Concurrent Map for memstore
> ----------------------------------------------------------------------
>
>                 Key: HBASE-20312
>                 URL: https://issues.apache.org/jira/browse/HBASE-20312
>             Project: HBase
>          Issue Type: New Feature
>          Components: regionserver
>            Reporter: Xiang Wang
>            Assignee: Chance Li
>            Priority: Major
>             Fix For: 3.0.0
>
>         Attachments: HBASE-20312-1.3.2.patch, HBASE-20312-master.v1.patch, 
> ccsmap-branch-1.1.patch, jira1.png, jira2.png, jira3.png
>
>
> Now hbase use ConcurrentSkipListMap as memstore's data structure.
> Although MemSLAB reduces memory fragment brought by key-value pairs.
> Hundred of millions key-value pairs still make young generation 
> garbage-collection(gc) stop time long.
>  
> These are 2 gc problems of ConcurrentSkipListMap:
> 1. HBase needs 3 objects to store one key-value on expectation. One 
> Index(skiplist's average node height is 1), one Node, and one KeyValue. Too 
> many objects are created for memstore.
> 2. Recent inserted KeyValue and its map structure(Index, Node) are assigned 
> on young generation.The card table (for CMS gc algorithm) or RSet(for G1 gc 
> algorithm) will change frequently on high writing throughput, which makes YGC 
> slow.
>  
> We devleoped a new skip-list map called CompactdConcurrentSkipListMap(CCSMap 
> for short),
> which provides similary features like ConcurrentSkipListMap but get rid of 
> Objects for every key-value pairs.
> CCSMap's memory structure is like this picture:
> !jira1.png!
>  
> One CCSMap consists of a certain number of Chunks. One Chunk consists of a 
> certain number of nodes. One node is corresspding one element. This element's 
> all information and its key-value is encoded on a continuous memory segment 
> without any objects.
> Features:
> 1. all insert,update,delete operations is lock-free on CCSMap.
> 2. Consume less memory, it brings 40% memory saving for 50Byte key-value.
> 3. Faster on small key-value because of better cacheline usage. 20~30% better 
> read/write troughput than ConcurrentSkipListMap for 50Byte key-value.
> CCSMap do not support recyle space when deleting element. But it doesn't 
> matter for hbase because of region flush.
> CCSMap has been running on Alibaba's hbase clusters over 17 months, it cuts 
> down YGC time significantly. here are 2 graph of before and after.
> !jira2.png!
> !jira3.png!
>  
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to