数据库读写性能分析
1、 单机类比集群测试
测试环境:
由3台服务器组成的hadoop集群组成分散式文件系统
由一台单独的机器单机类比Hbase集群
由一台机器单机测试Mysql
测试规模:50万条记录以上,单线程、多线程测试
测试结果:
|
| HBase | Mysql |
单线程 | 插入 100 条记录 | 155 ms / 154ms | 243 ms / 198ms |
插入 1000 条记录 | 740 ms / 884ms | 1506 ms / 1554ms | |
插入 10000 条记录 | 8304ms/ 6610ms | 14110ms/ 12839m | |
插入 100000 条记录 | 43090ms /64715ms | 108082ms /110664ms | |
读取 500000左右的条记录 | 640 ms / 721ms | 2779 ms / 2794ms? | |
100线程 | 插入 100 条记录 | 5929ms / 3825ms / 4134ms | 15352ms / 12912ms / 12853ms |
插入 1000 条记录 | 35684ms / 52677ms / 34208ms | 135839ms / 161711ms / 119909ms | |
读取 500000左右的条记录 | 最快的 1104 ms/最慢的 110897 ms | 如果不加limit,数据库连接超时 | |
1000线程 | 插入 100 条记录 | 325907ms / 322465ms / 342163ms | 17455ms / 18953ms / 15169ms |
读取500000左右的条记录 | 最快的 717 ms | 如果不加limit,数据库连接超时 |
HBase不同于一般的关联数据库,它是一个适合于非结构化资料存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式(栏位内容都是char).
上面两种 特性,导致HBase的资料表结构非常松散,栏位内容单一,表与表之前没有任何关联,正因爲这样在查询的时候效率非常高
HBase资料表的性能选项:
MAX_VERSIONS:每一个单元保存多少版本的资料(默认是3)
MAX_LENGTH:每个单元中的版本能够保存多少字节的资料(默认字节数是32位元有符号整数最大值)
COMPRESSION:资料压缩,有BLOCK压缩和RECORD压缩
IN_MEMORY:将这个列组装载资料到存储器,加快读写速度,缺点耗费存储器和干预HDFS的备份
BLOOMFILTER:如果这个列组支援布隆过滤器(BLOOMFILTER),那麽在存储器中有个索引来快速地判断要查找的列是否存在这个行中,减少磁盘IO操作.如
果在这个列组你拥有大量的列,每一个列的资料包含的资料非常小,你可能需要在这个列组中应用布隆过滤器(BLOOMFILTER)
2、 列族测试:
测试目标:测试列族增长对性能的影响
测试资料:建表时候定义列族数量,每个列族写入1000字节资料,读取5000次,随机读取任意一列。
测试结果:
单机集群
列族数量 | 10 | 100 | 500 | 1000 |
建表时间 | 12.3 | 19.2 | 45.9 | Timeout |
每秒写入 | 164 | 323 | 419 | Timeout |
每秒读取 | 99 | 139 | 122 | Timeout |
5机器集群
列族数量 | 10 | 100 | 500 | 1000 |
建表时间 | 12.2 | 18.7 | 46.4 | Timeout |
每秒写入 | 29 | 153 | 376 | Timeout |
每秒读取 | 119 | 111 | 120 | Timeout |
测试结论:
Hbase建表时间过长,对大列族的时候支援不好
写入速度在多机集群的时候提高较快
3、排序测试
测试目标:Hbase的行排序是根据主键排序,测试动态或者反序插入时候的性能。
测试资料:动态生成字母资料,zzzzz-aaaaa,还有随机插入
测试结果:
单机集群(每秒多少行)
写入行 | 10,000 | 100,000 | 1,000,000 |
顺序 | 485 | 432 | 334 |
反序 | 451 | 477 | 354 |
随机 | 462 | 421 | 334 |
5机集群(每秒多少行)
写入行 | 10,000 | 100,000 | 1,000,000 |
顺序 | 488 | 440 | 346 |
反序 | 522 | 387 | 343 |
随机 | 468 | 441 | 370 |
测试结论:
采用B树存储和写入缓存,写入数量和顺序对速度影响并不大,应该只是cpu占用的不同。
主要瓶颈还是在网络传输速度上。