HBase 和 MongoDB在設計上的區別

2021-07-10 18:01:32 字數 2350 閱讀 3275

2、hbase按照列族將資料儲存在不同的檔案中;mongodb不分列,整個文件都儲存在乙個(或者說一組)檔案中,通過乙個有乙個通用的.ns檔案儲存命名空間(column-based和document-based之間的區別應該是指這個地方吧)

3、hbase乙個region只有乙個hregionserver對外提供服務(沒有負載均衡的概念);mongodb的shards(類似於region)支援負載均衡(主從結構,通過日誌進行同步,這個hbase也在開發計畫當中)

4、hbase根據檔案的大小來控制region的**;mongodb根據負載來決定shards的**(沒有深入研究,不知道如何根據負載的)

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檔案,這樣對記憶體的要求較高,至少需要容納下熱點資料和索引。

HBase 和 MongoDB在設計上的區別

昨天搜一下mongodb的資料,介紹應用的比較多,原理介紹的不多。粗略得看了一下,總體來說兩者的設計思路差不多,主要就是通過劃區間去分布資料,後台程序進行資料 兩者的區別主要在於 1 hbase依賴於hdfs mongodb直接儲存在本地磁碟中 2 hbase按照列族將資料儲存在不同的檔案中 mon...

HBase與MongoDB的區別

hbase與mongodb的區別 1 hbase依賴於hdfs mongodb直接儲存在本地磁碟中。2 hbase按照列族將資料儲存在不同的檔案中 mongodb不分列,整個文件都儲存在乙個 或者說一組 檔案中,通過乙個有乙個通用的.ns檔案儲存命名空間 column based和document ...

在gridview和datagrid裡設定列寬

無論是gridview還是datagrid,在繫結資料後,列寬都不是固定的,在設計時是沒法設定的,只能通過繫結是觸發的事件來重新設定。參考 的解釋。gridview的 protected int widestdata protected void gridview1 rowdatabound obj...