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