Database之HBase表設計

2021-06-20 11:28:10 字數 2350 閱讀 3609

1. 表的設計

1.1 pre-creating regions

預設情況下,在建立hbase表的時候會自動建立乙個region分割槽,當匯入資料的時候,所有的hbase客戶端都向這乙個region 寫資料, 直到這 個region足夠大了才進行切分。一種可以加快批量寫入速度的方法是通過預先建立一些空的regions,這樣當資料寫入hbase時,會按 照 region分割槽情況,在集群內做資料的負載均衡。

預分割槽的乙個例子:

public static boolean createtable(hbaseadmin admin, htabledescriptor table, byte splits) throws ioexception  catch (tableexist***ception e) 

} public static byte gethexsplits(string startkey, string endkey, int numregions)  return splits;

}1.2 row key

hbase中row key用來檢索表中的記錄,支援以下三種方式:

· 通過單個row key訪問:即按照某個row key鍵值進行get操作;

· 通過row key的range進行scan:即通過設定startrowkey和endrowkey,在這個範圍內進行掃瞄;

· 全表掃瞄:即直接掃瞄整張表中所有行記錄。

在hbase中,row key可以是任意字串,最大長度64kb,實際應用中一般為10~100bytes,存為byte位元組陣列,一般設計成定長的。

row key是按照字典序儲存,因此,設計row key時,要充分利用這個排序特點,將經常一起讀取的資料儲存到一塊,將最近可能會被訪問的資料放在一塊。

舉個例子:如果最近寫入hbase表中的資料是最可能被訪問的,可以考慮將時間戳作為row key的一部分,由於是字典序排序,所以可以使用long.max_value - timestamp作為row key,這樣能保證新寫入的資料在讀取時可以被快速命中。

1.3 column family

不要在一張表裡定義太多的column family。目前hbase並 不能很好的處理超過2~3個column family的表。因 為某個 column family在flush的時候,它鄰近的column family也會因關聯效應被觸發flush,最終導致系統產生更多的i/o。感 興趣的同學可以對自己的hbase集群進行實際測試,從得到的測試結果數 據驗證一下。

1.4 in memory

建立表的時候,可以通過hcolumndescriptor.setinmemory(true)將表放到regionserver的快取中,保證在讀取的時候被cache命中。

1.5 max version

建立表的時候,可以通過hcolumndescriptor.setmaxversions(int maxversions)設定表中資料的最大版本,如果只需要儲存最新版本的資料,那麼可以設定setmaxversions(1)。

1.6 time to live

建立表的時候,可以通過hcolumndescriptor.settimetolive(int timetolive)設定表中資料的 儲存生命 期,過期資料將自動被刪除,例如如果只需要儲存最近兩天的資料,那麼可以設定 settimetolive(2 * 24 * 60 * 60)。

1.7 compact & split

在hbase中,資料在更新時首先寫入wal 日誌(hlog)和記憶體(memstore)中,memstore中的資料是排序的,當 memstore累計到一定閾值時,就會建立乙個新的 memstore,並且將老的memstore新增到flush佇列,由單獨的執行緒flush到磁 盤上,成為乙個storefile。於此同時, 系統會在zookeeper中記錄乙個redo point,表示這個時刻之前的變更已經持久化了 (minor compact)。

storefile是唯讀的,一旦建立後就不可以再修改。因此hbase的更新其實是不斷追加的操作。當乙個store中的 storefile達到 一定的閾值後,就會進行一次合併(major compact),將對同乙個key的修改合併到一起,形成乙個大的storefile,當 storefile的大小達到一定閾值後,又會對 storefile進行分割(split),等分為兩個storefile。

由於對錶的更新是不斷追加的,處理讀請求時,需要訪問store中全部的storefile和memstore,將它們按照row key 進行合 並,由於storefile和memstore都是經過排序的,並且storefile帶有記憶體中索引,通常合併過程還是比較快的。

實際應用中,可以考慮必要時手動進行major compact,將同乙個row key的修改進行合併形成乙個大的storefile。同時,可以將storefile設定大些,減少split的發生。

Database 表的約束

真正約束欄位的是資料型別,但是資料型別很單一,需要一些額外的約束,更好的保證資料的合法性,從業務邏輯的角度保證資料的正確性。預設值 某一種資料會經常性的出現某個具體的值,可以在一開始就指定好,在需要真實資料的時候,使用者可以選擇性的使用預設值。我們重新建立乙個課表myclass2,將class ro...

Hbase學習之四 Hbase表設計案例

環境 虛擬機器 vmware 10 linux版本 centos 6.5 x86 64 客戶端 xshell4 ftp xftp4 jdk8 hadoop 2.6.5 hbase 0.98.12.1 hadoop2 hbase中表的設計 主要是將原來的關係解開 問題 例子 表設計一 表設計二 這是乙...

Hbase之表的設計

最近,由於專案的需要開始接觸hbase,發現如果想要很好的利用hbase儲存和維護利用自己的海量資料,表的設計至關重要,乙個好的表結構可以從本質上提高操作速度,直接決定了使用者的get put delete等各種操作的效率。下面我就先介紹一下hbase的基本表的構成。hbase的表是key valu...