Mongodb和Hbase的對比
- 1.Mongodb bson文檔型數據庫,整個數據都存在磁盤中,hbase是列式數據庫,集羣部署時每一個familycolumn保存在單獨的hdfs文件中。
- 2.Mongodb 主鍵是「_id」,主鍵上面能夠不建索引,記錄插入的順序和存放的順序同樣,hbase的主鍵就是row key,能夠是任意字符串(最大長度是 64KB,實際應用中長度通常爲 10-100bytes),在hbase內部,row key保存爲字節數組。存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將常常一塊兒讀取的行存儲放到一塊兒。 字典序對int排序的結果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的天然序,行鍵必須用0做左填充。
- 3.Mongodb支持二級索引,而hbase自己不支持二級索引
- 4.Mongodb支持集合查找,正則查找,範圍查找,支持skip和limit等等,是最像mysql的nosql數據庫,而hbase只支持三種查找:經過單個row key訪問,經過row key的range,全表掃描
- 5.mongodb的update是update-in-place,也就是原地更新,除非原地容納不下更新後的數據記錄。而hbase的修改和添加都是同一個命令:put,若是put傳入的row key已經存在就更新原記錄,實際上hbase內部也不是更新,它只是將這一份數據已不一樣的版本保存下來而已,hbase默認的保存版本的歷史數量是3。
- 6.mongodb的delete會將該行的數據標示爲已刪除,由於mongodb在刪除記錄時並非真把記錄從內存或文件中remove,而是將該刪除記錄數據置空(寫0或特殊數字加以標識)同時將該記錄所在地址放到一個list列表「釋放列表」中,這樣作的好就是就是若是有用戶要執行插入記錄操做時,mongodb會首先從該「釋放列表」中獲取size合適的「已刪除記錄」地址返回,這種方法會提高性能(避免了malloc內存操做),同時mongodb也使用了bucket size數組來定義多個大小size不一樣的列表,用於將要刪除的記錄根據其size大小放到合適的「釋放列表」中。Hbase的delete是先新建一個tombstonemarkers,而後讀的時候會和tombstonemarkers作merge,在 發生major compaction時delete的數據記錄纔會真真刪除。
- 7.mongodb和hbase都支持mapreduce,不過mongodb的mapreduce支持不夠強大,若是沒有使用mongodb分片,mapreduce實際上不是並行執行的
- 8.mongodb支持shard分片,hbase根據row key自動負載均衡,這裏shard key和row key的選取儘可能用非遞增的字段,儘可能用分佈均衡的字段,由於分片都是根據範圍來選擇對應的存取server的,若是用遞增字段很容易熱點server的產生,因爲是根據key的範圍來自動分片的,若是key分佈不均衡就會致使有些key根本就無法切分,從而產生負載不均衡。
- 9.mongodb的讀效率比寫高,hbase默認適合寫多讀少的狀況,能夠經過hfile.block.cache.size配置,該配置storefile的讀緩存佔用Heap的大小百分比,0.2表示20%。該值直接影響數據讀的性能。若是寫比讀少不少,開到0.4-0.5也沒問題。若是讀寫較均衡,0.3左右。若是寫比讀多,果斷默認0.2吧。設置這個值的時候,你同時要參考hbase.regionserver.global.memstore.upperLimit,該值是memstore佔heap的最大百分比,兩個參數一個影響讀,一個影響寫。若是兩值加起來超過80-90%,會有OOM的風險,謹慎設置。
- 10.hbase採用的LSM思想(Log-Structured Merge-Tree),就是將對數據的更改hold在內存中,達到指定的threadhold後將該批更改merge後批量寫入到磁盤,這樣將單個寫變成了批量寫,大大提升了寫入速度,不過這樣的話讀的時候就費勁了,須要merge disk上的數據和memory中的修改數據,這顯然下降了讀的性能。mongodb採用的是mapfile+Journal思想,若是記錄不在內存,先加載到內存,而後在內存中更改後記錄日誌,而後隔一段時間批量的寫入data文件,這樣對內存的要求較高,至少須要容納下熱點數據和索引。
[2017-02-17]mysql
歡迎關注本站公眾號,獲取更多信息