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

Chao Shi commented on HBASE-9969:
---------------------------------

To [[email protected]]:
bq. In what condition would numOpenStreams become negative ?
There must be some bug if this happens, such as multi-threading access.

bq. Should the return value from loserTree.isEmpty() be negated ?
Yes, you are correct. It seems this return value is ignored by 
RegionScannerImpl, so the tests do not catch this.

bq. For benchmark B, can you try ColumnPaginationFilter with smaller offset ?
This optimization is only effective when it is skipping a large number of KVs. 
So I think such filter is required.

bq. Giving percentage improvement in the tables is desirable.
Yes, I will update the table once these issues you guys mentioned are fixed.

To [~vrodionov]:
bq. I just ran StoreScanner with 8 store files and the same test after 
compaction. All data is in block cache in both runs. The results I can not 
explain. Scanner after compaction is slower: 3.7 sec vs 3.5 sec. The effect of 
KeyValueHeap sub-par implementation is probably negligible.

I guess other things are the dominant overhead in your case, such as RPC? This 
patch optimize the case scanning with filter that rarely accepts a KV. Perhaps 
[~lhofhansl]'s case on phoenix is a good one.

To [~lhofhansl]:
bq. Chao Shi, are these numbers on top of HBASE-9915? Or are they on top a 
release version of HBase?
These numbers are from a one-month-ago trunk. It does not have HBASE-9915. The 
benchmark I ran does not use encoded blocks, so HBASE-9915 should have no 
effects on this.

bq. Did a quick port to 0.94, tested with Phoenix and a fully flushed and 
compacted table (i.e. the worst case for this patch). Still found a few percent 
performance improvement - no slowdown. Will test with a some more HFiles next.
Glad to hear that. I'm looking forward to your numbers.

To [~mcorgan]:
bq. With 8 storefiles, the normal case would go from ~3 comparisons down to 1. 
I think the behavior could be reversed by negating the comparator.

I don't quite understand this. The one I understood to improve is to compare 
against the previous second top value (i.e. tree\[1\]) before going through 
leaf to root comparisions. But this will add one more comparison on the worst 
case. 

> Improve KeyValueHeap using loser tree
> -------------------------------------
>
>                 Key: HBASE-9969
>                 URL: https://issues.apache.org/jira/browse/HBASE-9969
>             Project: HBase
>          Issue Type: Improvement
>          Components: Performance, regionserver
>            Reporter: Chao Shi
>            Assignee: Chao Shi
>             Fix For: 0.98.0, 0.96.1
>
>         Attachments: hbase-9969-v2.patch, hbase-9969.patch, hbase-9969.patch, 
> kvheap-benchmark.png, kvheap-benchmark.txt
>
>
> LoserTree is the better data structure than binary heap. It saves half of the 
> comparisons on each next(), though the time complexity is on O(logN).
> Currently A scan or get will go through two KeyValueHeaps, one is merging KVs 
> read from multiple HFiles in a single store, the other is merging results 
> from multiple stores. This patch should improve the both cases whenever CPU 
> is the bottleneck (e.g. scan with filter over cached blocks, HBASE-9811).
> All of the optimization work is done in KeyValueHeap and does not change its 
> public interfaces. The new code looks more cleaner and simpler to understand.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to