資料庫讀寫性能分析
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占用的不同。
主要瓶頸還是在網絡傳輸速度上。