GEO基礎知識:Schema標記 / Schema設計原則
Schema創(chuàng)建
HBase schema(模式)可以通過Apache HBase Shell或者Java API Admin來創(chuàng)建或者更新。 進行ColumnFamily(列族)修改時,必須禁用表,例如:
Configuration config = HBaseConfiguration.create();
Admin admin = new Admin(conf);
TableName table = TableName.valueOf("myTable");
admin.disableTable(table);
HColumnDescriptor cf1 = ...;
admin.addColumn(table, cf1);
HColumnDescriptor cf2 = ...;
admin.modifyColumn(table, cf2);
admin.enableTable(table);
Schema更新
當表或者列族被修改時(比如region大小、block大小),這些更改會在下一次major合并、StoreFiles重新寫入時生效。
Schema設計經(jīng)驗
HBase存在許多種不同的數(shù)據(jù)集,具有不同的訪問模式和服務層級的要求。因此,以下經(jīng)驗法則只是概述。
目標region的大小限制在10GB到50GB之間。
限制cell的大小在10MB之內,如果使用的是mob類型,限制在50MB之內。否則,考慮把cell的數(shù)據(jù)存儲在HDFS中,并在HBase中存儲指向該數(shù)據(jù)的指針。
典型的scheme每張表包含1到3個列族。HBase表設計不應當和RDBMS表設計類似。
對于擁有1或2個列族的表來說,50-100個region是比較合適的。注意region是列族的連續(xù)段。
保持列族名稱盡可能短。每個值都會存儲列族的名稱(忽略前綴編碼)。它們不應該像在典型的RDBMS中一樣具有自我記錄和描述性。
如果正在存儲基于時間的機器數(shù)據(jù)或者日志信息,并且rowkey是基于設備ID或者服務ID+時間,最終可能會出現(xiàn)這樣一種情況,即更舊的數(shù)據(jù)region在某個時間段后永遠不會有額外寫入。在這種情況下,最終會存在少量的活動region和大量不會再有新寫入的region。
HBase列族數(shù)量
HBase目前不適合兩個或三個列族以上的任何項目,因此應保持模式中的列族數(shù)量較少。目前,flushing和compactions是基于每個region進行的,因此如果一個列族承載大量數(shù)據(jù)帶來flushing,則即使它們攜帶的數(shù)據(jù)量很小,相鄰的族也將被flushing。當存在許多列族時,flushing和compactions可能會產(chǎn)生一堆不必要的I/O。
如果單個表中存在多個列族,請注意基數(shù)(即行數(shù))不用相差太大。如果 ColumnFamilyA有100萬行而ColumnFamilyB有10億行,則ColumnFamilyA 的數(shù)據(jù)可能會分布在許多區(qū)域(和RegionServers)中。這使得 ColumnFamilyA的大規(guī)模掃描效率降低。
版本數(shù)
最大版本數(shù)
HBase通過HColumnDescriptor給各列族配置要存儲的最大行版本數(shù)。最大版本的默認值為1。這是一個重要的參數(shù),因為HBase不會覆蓋一個值,只會時間戳來區(qū)分值的不同版本。早期的版本會在major compaction過程中被刪除。根據(jù)應用需求,可以需要增加或減少最大版本的數(shù)量。 不建議將最大版本的數(shù)量設置為非常高的級別(例如,數(shù)百或更多),除非這些舊值非常珍貴,因為這將大大增加StoreFile的大小。
最小版本數(shù)
與最大行版本數(shù)一樣,HBase通過HColumnDescriptor按列族配置要保留的最小行版本數(shù)。最小版本的默認值為0,表示該功能已禁用。行版本參數(shù)的最小數(shù)量與生存時間參數(shù)一起使用,并且可以與行版本參數(shù)的數(shù)量組合,以允許配置諸如“保留最后T分鐘的數(shù)據(jù),最多N個版本,但至少保留M個版本”(其中M是最小行版本數(shù)的值,M<N)。
支持的數(shù)據(jù)類型
HBase通過Put和Result操作支持“byte-in/bytes-out”接口,因此任何可以轉換為字節(jié)數(shù)組的都可以存儲為值。輸入可以是字符串、數(shù)字、復雜對象、圖像,只要它們可以呈現(xiàn)為字節(jié)。 值的大小存在實際限制。HBase中的所有行都符合數(shù)據(jù)模型,包括版本控制。在進行設計時要考慮到這一點,以及列族的塊大小。
生存時間
列族可以設置TTL(Time To Live)長度(以秒為單位),HBase將在超時后自動刪除行。TTL設置適用于行的所有版本。在HBase中TTL時間為UTC時區(qū)。 僅包含過期的行的存儲文件,會在minor compaction時刪除。將hbase.store.delete.expired.storefile設置為false可禁用此功能。將最小版本數(shù)設置為0以外的值也會禁用此功能。
最新版本的HBase還支持按每個cell(單元)設置生存時間。cell TTL使用Mutation#setTTL作為變更請求的一個屬性提交。如果設置了TTL屬性,則它將應用于被操作更新的所有cell。cell TTL處理和列族TTL之間存在兩個顯著差異:
cell TTL以毫秒而不是秒為單位表示。
cell TTL不能超過列族TTL設置的有效時間。