Hbase-之架構設計(schema design)
Hbase架構設計主要是你設計表和模型的時候要做的事,你得清楚~~
1 前言
目前主流的bigtable有多種,目前這裡隻舉3個栗子
- Google Bigtable
- Hypertable(開源)
- Hbase(開源)
Hypertable和Hbase實際上都是在Google Bigtable基礎上衍生出來的産物,其中Hypertable與Google Bigtable是十分相似的,除了存儲所基于的檔案系統不同其它基本一樣,Hypertable基于HDFS或者KFS,而Google Bigtable則基于自身的GFS檔案系統。都是基于C++開發的。
Hbase則是另外一種衍生産品,除了檔案系統不同,開發的語言也不同,Hbase基于Java開發,對于很多開發者來說是非常友好的,而且Hbase提供了友善的Java API,而且同時能與大資料主流的開源檔案系統HDFS、S5完美搭配,業界福音當之無愧。
Hbase除了架構基礎本身,其它的事情都交給了開發者本身,如:table join、schema、rowkey、store等等,在靈活的同時也是顯得有點狗蛋
2 如何建立Hbase schema
衆所周知,Hbase的schema可以通過Hbase shell建立,也可以使用JavaAPI中的Admin執行個體建立,類似于RDBM中的DDL。
注意⚠️,在添加或修改Table的時候,一定得先disable Table。簡單的代碼如下,我就直接從官網複制粘貼了。
Configuration config = HBaseConfiguration.create();
Admin admin = new Admin(conf);
TableName table = TableName.valueOf("myTable");
admin.disableTable(table); //disable table
HColumnDescriptor cf1 = ...;
admin.addColumn(table, cf1); // adding new ColumnFamily(添加新的列簇)
HColumnDescriptor cf2 = ...;
admin.modifyColumn(table, cf2); // modifying existing ColumnFamily(修改已經存在的列簇)
admin.enableTable(table); //開啟應用table
3 設計Schema時的優先準則
- 盡量讓region size保持在10-50GB範圍;
- 盡量不要讓cell存儲超過10M,如果需要存儲MOB請不要超過50M
- 什麼是MOB?
- MOB的英文為(Medium-sized Object),翻譯為中型對象,Hbase可以存儲任何資料,包括圖像、文檔等二進制資料,從技術上講,Hbase可以處理Cell size> 100KB的對象,但是Hbase在讀寫的路徑上對<=100KB的二進制值作了優化,假如一個二進制對象超過100KB比較多,那麼這個對象就是MOB或者稱為中型對象,假如Hbase同時處理大量的這樣的對象,在split、compaction的時候就會降低性能。
- 盡量讓MOB保持在100KB-10MB之間
- Hbase 2 添加了對MOB的特殊支援,能保證性能、一緻性、較低的性能開銷
- Hbase 2中還給使用者提供了可配置的MOB配置,對使用者來說是透明的
- 一般的shema建立的時候,column family的數量應該保持在1~3個,而不是越多越好;
- 對一個有1~2個column family的表來說,50-100個region的數量是非常好的選擇,做好預分區,減少split的開銷,一個region包含多個column family的一個持續段(一部分)
- 保證column family的名字盡可能的短,當然得得見明知意,言簡意赅,因為Hbase預設将每個存儲的值都存儲了一份該列簇的名稱;
- 當需要存儲基于時間的
或者機器資料
,且此時的rowkey樣式為日志資訊
的時候,你可以使用一個pattern-模式來終止那些再也不會寫入資料的old regions,這樣你就能節省大量的資源開銷因為所有的資源隻提供給那個那些需要被寫入資料的active regions。device id或者service id + time
- 如果隻有1個column family忙于寫操作,那麼隻有該列族會占用記憶體,配置設定資源時請注意write-pattern模