天天看點

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

本章以山寨版Twitter為例介紹HBase Schema設計模式。廣義的HBase Schema設計不僅僅包含建立表時指定項,還應該綜合考慮Column families/Column qualifier/Cell value/Versions/Rowkey等相關内容。

Schema設計和資料存儲及訪問模式關系密切,先回想下HBase資料模型。有幾個要點:

被索引的部分包含Row Key+Col Fam+Col Qual+Time Stamp

因為HBase的Schema-Less和列式存儲特性,列無需在表建立時定義好,能夠動态加入。

并且列名也存儲在HFile中。用它來儲存資料和用Cell value沒有什麼不同。

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

Schema設計的首要切入點是為待解決的問題模組化。下文從逐漸完好Twitter使用者關系表的過程中總結相關設計原則。

使用者關系表follows要回答的問題包含:

A使用者關注哪些使用者?

A使用者是否關注B使用者?

誰關注了A使用者?

最初版設計例如以下,以使用者為rowkey。follows列族中包括多個列,每一個列名為序号。存儲的值為關注使用者。

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

最明顯的問題有兩個:

當使用者新增關注時,還須要進行查找目前已關注人。遞增序号等邏輯。

查找某個特定關注人效率一般。

改進例如以下,将關注人直接作為列名:

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

之前的設計為寬表模式,一行記錄包括了使用者全部關注人。假設使用窄表,Schema例如以下:

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

 窄表設計最大的長處是能通過rowkey查找高效回答之前的問題2:A使用者是否關注使用者B。而問題1:A使用者關注哪些使用者,則變成了掃描操作,但從HBase底層列式存儲看。I/O讀取資料量是一樣的(get操作内部實作為針對單行的scan操作)。代碼片段例如以下:

窄表帶來的最大問題是。HBase僅僅有單行操作才是原子性的。

如果使用者新關注了多個使用者,在寬表中能通過一次Put原子操作完畢。而在窄表操作中則須要多次操作。

注:回答問題3。誰關注了A使用者,能夠再建一張被關注使用者表。rowkey為followed+follower。由應用端維護兩張表資料一緻性。

使用Hash rowkey有助于資料在regionserver之間均勻分布,一般能夠使用MD5擷取定長key。

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

比較棘手的一個場景是在時間序列資料中,使用時間戳作為rowkey。那麼你始終在表底部插入資料,因為rowkey的有序性存儲,表的最後一個region成為熱點。而應用又須要依據時間範圍進行掃描查詢,是以不能簡單将時間戳Hash,這時能夠考慮“Salting”方法:

生成的Rowkey例如以下。查詢處理變得略微複雜些,須要在應用端合并處理。

上節中,Rowkey包括了被關注人ID。CQ中存儲被關注人名稱。而不用再join使用者表查詢。已經是某種程度的反規範化。

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

因為HBase列的動态性,能夠用單個HBase表使用嵌套列來表達資料庫中一對多關系(類似于MongoDB文檔模型)。

繼續以twitter為例,如果已經有follows和twits表,那麼使用者登入後,通過follows讀取關注人資訊,然後從twits表中依據第一步讀取的使用者ID讀取關注人的twits,最後合并取最新結果展如今使用者首頁。能夠考慮添加一張備援表用來存儲使用者首頁上展示的twits,Rowkey為登入使用者+倒序時間戳。存儲所關注人的最新twits。

該表提供了更好的讀取性能。還能解決一個常見問題:某大V帳号被海量使用者關注。如果不使用備援表。他的twits資料所在的regionserver将成為熱點,可能導緻性能瓶頸。

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

該表的資料生成能夠通過coprocessor實作(下章介紹,類似于資料庫的觸發器),資料保留由TTL實作(Time To Live,下節介紹)

HBase提供了一些配置參數。在建立表時能夠按需定制。

1.       HFile block size:和HDFS block size不同。預設大小是64KB。Block索引存儲了每一個block的起始key。是以block size大小會影響索引大小。假設你的應用偏重于随機查找,能夠選擇小一點的block size;假設側重于順序掃描。那麼能夠使用較大的block size。

2.       Block cache:順序掃描場景下block cache不是那麼重要,能夠禁用cache。将記憶體空間留給其它表或者列族。

3.       Aggressive caching:為某些列族設定更高的block cache優先級,HBase會更積極地将其保留在LRU cache中。

4.       Bloom filters:block索引中僅僅存儲了block的起始key,預設block size為64KB,假設表中每行資料都偏小,那麼一個block中記錄行數過多,可能會出現辛苦查找半天,發現所查找資料不存在的情況。通過Bloom filter引入negative test能高速推斷資料是否存在

5.       TTL:用于自己主動清理過期資料

6.       Compression:Google公布的Snappy格式是個好選擇。

7.       Cell versioning:默覺得3.

Filter作用在RegionServer上,資料依舊會從磁盤載入到RegionServer。是以Filter一般降低的是網絡I/O,而不是硬碟I/O(有一些Filter能降低硬碟資料讀取,比方ColumnPrefixFilter)。

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

HBase提供了Filter接口。使用者實作接口能夠自己定義過濾功能。當中的過濾方法回調順序例如以下:

讀書筆記-HBase in Action-第二部分Advanced concepts-(1)HBase table design靈活的Schema&簡單的存儲視圖循序漸進實戰Column family配置Filter過濾器

HBase還預置了一些filter。典型的如RowFilter

當中CompareOp代表比較操作符枚舉類,比方相等、大于和小于等。Comparator代表詳細比較邏輯。常見的有字元串比較、正則比對和二進制比較等。

本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5332788.html,如需轉載請自行聯系原作者