Not every test is created equal, different tests are testing different
things, and different environments/setups/configurations can yield
different results.
I posted the utility (HBench) I used to generate the statistics from
those slides up in a jira. You can grab it and try it out to see what
you get:
https://issues.apache.org/jira/browse/HBASE-1501
However, the primary reason that I think you're seeing significantly
lower scan performance is that PerformanceEvaluation was (incorrectly)
not pre-fetching any rows. So, only a single row is returned for each
round-trip. This ends up basically benchmarking RPC performance, not
what we're after.
In the real world, if you know you want to scan a large number of rows,
you should use HTable.setScannerCaching(N) where N is the number of rows
to grab on each trip. The scanner will still work as normal (you just
continue to call next() on it), but it will be caching N results and
serving from that.
We just fixed up PerformanceEvaluation on TRUNK, so if you update your
trunk and retest you should see a good boost in performance. It is now
set to 30 for PE.
When running tests on your own data, you should play with this parameter
to see how it will affect your performance in your environment and with
your data.
Regarding cache warm-up, it exists for two reasons.
First, the system caches io with available memory, so once you've read
something off of HDFS there's a good chance it will be cached the next
time around.
Second, there is an internal read block cache. This should help
performance significantly when your blocks are available in the cache.
The reason you did not see performance boosts in scans after warm-up was
because of what i describe above; it was really measuring RPC
performance because in an open scanner with small rows, the fetch of
each row (from a block already sitting in memory) is sub-ms.
Thanks JD for fixing PE :)
Jonathan Gray
Qingyan(Evan) Liu wrote:
Dear J-D,
Here's my another two tests. I changed the order of the tests. Before each
test, I restarted both hbase & hadoop. All are 50,000 rows with sizeof 1KB.
(1) randomWrite-randomRead-randomRead-scan-scan-randomRead
7117ms-15966ms-16678ms-10429ms-10730ms-15641ms
(2) randomWrite-scan-scan-randomRead-randomRead-scan
6587ms-14671ms-12153ms-20264ms-18521ms-15619ms
From the above results, I think there're three major conclusions:
a) "cache warm-up" phenomenon exists
b) cache doesn't improve scan performance very much
c) scan performance is much lower than it's announced in these slides:
http://www.docstoc.com/docs/7493304/HBase-Goes-Realtime
*(in page 10, this doc reports that the scan speed of 117ms/10,000rows, that
is, just 585ms/50,000rows. 585ms is much much shorter than my test result,
10429ms!)*
So, no matter what the cache warm-up affects, I cannot tune the scan speed
up to the reported 117ms/10,000rows. I think it's my fault, or the
reporter's fault.
I'm also curious about your testing results of randomRead and scan. Can you
be so kind to show me the results for my information? Thanks a lot!
P.S. TestTable attributes:
TestTable <http://localhost:60010/table.jsp?name=TestTable>
- Parameters
- is_root: false
- is_meta: false
- Families
- Name: info
- bloomfilter: false
- compression: none
- versions: 3
- ttl: 2147483647
- blocksize: 65536
- in_memory: false
- blockcache: true
sincerely,
Evan
2009/7/9 Jean-Daniel Cryans <jdcry...@apache.org>
Even,
The scan probably warmed the cache here. Do the same experiment with a
fresh HBase for the scan and the random reads.
J-D
On Thu, Jul 9, 2009 at 5:14 AM, Qingyan(Evan) Liu<qingyan...@gmail.com>
wrote:
dears,
I'm fresh to hbase. I just checkout hbase trunk rev-792389, and test its
performance by means of org.apache.hadoop.hbase.PerformanceEvaluation
(Detailed testing results are listed below). It's strange that the scan
speed is as slower as randomRead. I haven't change any configuration
parameters in xml files. Anyone can help me to tune the scan performance?
Thanks a lot.
Hardware: HP Compaq nx6320, CPU Centrino Duo 2 GHz, 1 GB Memory
OS: ubuntu jaunty 9.04
Hbase: hadoop HDFS namenode + datanode + hbase master + zookeeper +
regionserver are all on localhost.
Test commands:
$ bin/hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=50000
randomWrite 1
$ bin/hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=50000
scan
1
$ bin/hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=50000
randomRead 1
Test results:
randomWrite, time cost: 6858ms
scan, time cost: 18836ms
randomRead, time cost: 16829ms
I suppose that the scan speed should be much more faster than randomRead.
However, it isn't. Why?
sincerely,
Evan