畫像體系之 HBase快取漫談

2021-10-02 00:21:08 字數 1605 閱讀 2800

背景使用者/內容畫像的對儲存的要求其實是比較高的:

能批量更新(比如更新所有使用者某個屬性)

大量隨機讀取(甚至可能沒有熱點資料)

隨機屬性更新/新增

可持久化

易於橫向擴充套件解決效能問題

上一次重度使用hbase已經是兩年前了。hbase能夠滿足上面五個要求,所以用hbase作為畫像體系的主要儲存引擎便水到渠成。

問題因為有批量更新,隨機屬性的更新/新增,那麼必然會快取失效,從而觸發磁碟io導致讀取響應時間受到影響。在畫像體系裡,隨機讀取量大,比如召回了1000個id,然後你需要取這1000個id的屬性集合,並且要求響應時間能夠控制在100ms。基本只要碰到磁碟io就歇菜了。所以現在我們希望hbase能夠把所有資料都快取住。

hbase讀快取特色

hbase的快取目前我所了解的是block cache. block cache是什麼概念的呢,我們知道hbase的最小檔案單元是hfile, hfile是有結構的,主要包含:

索引,可以是多層

資料元資料

當然還有乙個布隆過濾器,方便確定乙個元素是不是在hfile裡。

並且只會有三個動作:

新增hfile

hfile 合併

hfile的**

這裡需要注意hfile一旦生成裡面的元素就不會被改變。

乙個hfile的資料會被切分成多個block,每個block一般而言都會有一些元資訊。當然這些切分其實是邏輯上的。block cache就是前面三部分的cache. 在hbase裡,當開啟乙個hfile時,缺省會cache住一些索引資訊,檔案資訊,讀取時則會連資料都會cache起來。當然你也可以通過引數讓hbase在開啟時就把資料cache住。

如果是傳統意義上的快取,如果有更新,那麼必然會導致乙個問題:快取失效。但是hbase其實並沒有這個問題。乙個簡單的get請求,hbase的讀取方式是讀memstore 和hfile,讀hfile的時候會看資料是不是已經在blockcache裡。

memstore,這個是寫快取,但是是有結構的,可以直接查。

blockcache, 這個是讀快取,也是有結構的,可以直接查。

hfile,這個就是hdfs檔案,會touch到io。

假設我在讀取的時候,memstore沒有進行flush,那麼可能不會觸碰到磁碟,雖然blockcache的資料已經是老版本的了,memstore裡卻有最新版本的資料,所以hbase簡單的到memstore/blockcache都拿一遍。第二次再來拿,假設正好碰到memstore flush生成新的hfile,這個時候就觸發磁碟io了。當然,其他如compaction也會導致觸發磁碟。

解決方案

下面解決方案的前提是,可用於blockcache的記憶體大於你的資料。在畫像體系裡,這點可以做到的,因為內容和使用者都是有限的。

hfile.block.index.cacheonwrite  寫hfile時把索引加入到cache

hfile.block.bloom.cacheonwrite 寫hfile時把布隆過濾器加入到cache

hbase.rs.cacheblocksonwrite 寫hfile時把資料也寫入到cache裡

這裡我們基本知道寫cache的幾個時機點:

開啟hfile

讀hfile

寫hfile

大資料體系之HBase的產生

一 關係型資料庫的缺陷 1 很難進行分布式部署,i o瓶頸顯著,依賴於強大的伺服器。2 難以處理非結構化資料 二 cap定律 推動關係型資料庫向非關係型資料庫轉變 在任何分布式系統中,只可能滿足一致性,可用性和分割槽容忍性三者中的兩者,不可能全部滿足。三 什麼是分割槽容忍性 一 分割槽 在乙個分布式...

HBase體系結構

hbase hbase是apache hadoop的資料庫,基於hdfs檔案系統 random,realtime read write access to big data 開源 分布式 可擴充套件 面向列 larger tables billions of rows x millions of c...

HBase體系結構

hbase的伺服器體系結構遵從簡單的主從伺服器架構,它由hregion伺服器 hregion service 群和hbase master伺服器 hbase master server 構成。hbase master伺服器負責管理所有的hregion伺服器,而hbase中所有的伺服器是通過zooke...