HBase在京東人資數(shù)據(jù)預(yù)處理平臺(tái)中的實(shí)踐
背景
人資績(jī)效系統(tǒng)數(shù)據(jù)預(yù)處理平臺(tái),負(fù)責(zé)接收所有上游業(yè)務(wù)量數(shù)據(jù)。具有數(shù)據(jù)量大、非結(jié)構(gòu)化數(shù)據(jù)、更新單個(gè)業(yè)務(wù)量數(shù)據(jù),查詢性能要求高等特性。通常技術(shù)上可以選擇OSS、MySql數(shù)據(jù)庫(kù)、ES等存儲(chǔ)方案。其中OSS云存儲(chǔ)方案,查詢性能與更新單個(gè)業(yè)務(wù)量數(shù)據(jù)上無(wú)法滿足。MySql數(shù)據(jù)庫(kù)如果每對(duì)接一種業(yè)務(wù)量創(chuàng)建一個(gè)表的方式,對(duì)于更新查詢等方面復(fù)雜度較高,不利于系統(tǒng)擴(kuò)展。而ES存儲(chǔ)量與查詢量都可以滿足,但更新單個(gè)字段不夠友好,且ES成本較高。
現(xiàn)狀
技術(shù)選型時(shí),充分考慮到人資數(shù)據(jù)預(yù)處理平臺(tái)的特性,數(shù)據(jù)量大,數(shù)據(jù)非結(jié)構(gòu)化,高性能、開源穩(wěn)定等要求,選型HBase。
HBase是一個(gè)分布式的、面向列的開源數(shù)據(jù)庫(kù),它是一個(gè)適合于非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)庫(kù),它在Hadoop之上提供了類似于Bigtable的能力,同時(shí)又是一個(gè)高可靠性、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng),同時(shí)HBase技術(shù)可在廉價(jià)PC Server上搭建起大規(guī)模結(jié)構(gòu)化存儲(chǔ)集群,性價(jià)非常高。
HBase適用場(chǎng)景
對(duì)象存儲(chǔ):不少的頭條類、新聞?lì)惖牡男侣?、網(wǎng)頁(yè)、圖片存儲(chǔ)在HBase之中,一些病毒公司的病毒庫(kù)也是存儲(chǔ)在HBase之中。
時(shí)序數(shù)據(jù):HBase之上有OpenTSDB模塊,可以滿足時(shí)序類場(chǎng)景的需求。
推薦畫像:特別是用戶的畫像,是一個(gè)比較大的稀疏矩陣,螞蟻的風(fēng)控就是構(gòu)建在HBase之上。
時(shí)空數(shù)據(jù):主要是軌跡、氣象網(wǎng)格之類,滴滴打車的軌跡數(shù)據(jù)主要存在HBase之中,另外在技術(shù)所有大一點(diǎn)的數(shù)據(jù)量的車聯(lián)網(wǎng)企業(yè),數(shù)據(jù)都是存在HBase之中。
消息/訂單:在電信領(lǐng)域、銀行領(lǐng)域,不少的訂單查詢底層的存儲(chǔ),另外不少通信、消息同步的應(yīng)用構(gòu)建在HBase之上。
Feeds流 :典型的應(yīng)用就是xx朋友圈類似的應(yīng)用。
HBase基礎(chǔ)概念
命名空間:類比MySql中數(shù)據(jù)庫(kù)庫(kù)名。
表名:類比MySql中表名。
列族:一組列的集合為列族。列族下的列可以N個(gè)。
列名稱:存在列族下的單個(gè)列,列族下的名稱。
RowKey:Hbase存儲(chǔ)采用 key-value方式,RowKey就是Key,所有的修改,查詢等操作都只能基于RowKey,必須唯一。
HBase整體架構(gòu)

HBase由三種類型的服務(wù)器以主從模式構(gòu)成
Region Server:負(fù)責(zé)數(shù)據(jù)的讀寫服務(wù),用戶通過(guò)與Region server交互來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問(wèn)。每個(gè)Region服務(wù)器中包含最多1000個(gè)Region,每個(gè)Region里面包含了StartKey到EndKey的一個(gè)區(qū)間數(shù)據(jù)。
HBase HMaster:分組分配Region和操作DDL,在集群處于數(shù)據(jù)恢復(fù)或者動(dòng)態(tài)調(diào)整時(shí),監(jiān)控所有Region Server的狀態(tài)。
ZooKeeper:負(fù)責(zé)維護(hù)集群的狀態(tài)(某臺(tái)服務(wù)器是否在線,服務(wù)器之間數(shù)據(jù)的同步操作及Hmaster的選舉等)。
集群與協(xié)同工作
Region Server,會(huì)通過(guò)心跳方式與Zookeeper保持連接,并創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn),當(dāng)無(wú)法監(jiān)聽到心跳時(shí),會(huì)通知Zookeeper,同時(shí)刪除臨時(shí)節(jié)點(diǎn),而HMaser會(huì)通過(guò)zookeeper得到Region Server服務(wù)器的狀態(tài),當(dāng)服務(wù)器下線時(shí),會(huì)進(jìn)行數(shù)據(jù)恢復(fù),容災(zāi)等操作。HMaster同樣會(huì)同Zookeeper保持心跳,用于監(jiān)控HMaster狀態(tài),當(dāng)HMaster下線時(shí),會(huì)通過(guò)選舉方式,將HMaster集群中的一臺(tái)機(jī)器設(shè)置成Active,其他機(jī)器設(shè)置成InActive狀態(tài),來(lái)保證整個(gè)集群的高可用性。
數(shù)據(jù)寫入過(guò)程
1.HBase客戶端發(fā)起Put請(qǐng)求時(shí),會(huì)先將數(shù)據(jù)寫入預(yù)寫日志(WAL)中,將操作記錄寫入WAL末尾。WAL用于Region Server服務(wù)器崩潰時(shí),恢復(fù)MemStore中數(shù)據(jù),WAL存儲(chǔ)在Hadoop的HDFS中。
2.數(shù)據(jù)在寫入Wal后,會(huì)將數(shù)據(jù)先寫入Region Server下Region中MemStore中(寫入緩存,內(nèi)存級(jí)別)
3.在寫入MemStore成功后,反饋給客戶端本次寫入已經(jīng)完成。
4.當(dāng)MemStore達(dá)到一定量級(jí)時(shí),會(huì)通過(guò)Flush方式,生成HFile,存入Hadoop的HDFS中。HFile在生成前,會(huì)在內(nèi)存中對(duì)Key進(jìn)行升序排序,將排序好的數(shù)據(jù)順序?qū)懭際File中,并在HFile中生成一個(gè)多級(jí)索引,還有一個(gè)尾部指針。
數(shù)據(jù)讀取過(guò)程
1.客戶端發(fā)起請(qǐng)求,從Zookeeper中獲取一個(gè)叫MetaTable的元數(shù)據(jù)。注:如果本地有緩存會(huì)優(yōu)先讀取本地緩存。
2.客戶端通過(guò)MetaTable,得知RowKey所有在的Region Server服務(wù)器得到Region位置。
3.客戶端優(yōu)先從Region中的BlockCache(讀取緩存)中獲取數(shù)據(jù),如果BlockCache中不存在,會(huì)通過(guò)MemStore(寫入緩存)中獲取數(shù)據(jù),如果還不存在,會(huì)通過(guò)HFile中讀取,并將數(shù)據(jù)返回給客戶端。
4.讀取HFIle時(shí),會(huì)通過(guò)尾部指針中布隆過(guò)濾區(qū)域與時(shí)間區(qū)域,可以快讀定位RowKey是否在HFile文件當(dāng)中。
5.HFile讀取后,會(huì)將多級(jí)索引加載在BlockCache中,用于讀加速
最佳實(shí)踐
HBase主要特點(diǎn)(人資績(jī)效數(shù)據(jù)預(yù)處理平臺(tái)實(shí)踐適配的特點(diǎn))
1.HBase為分布式列式數(shù)據(jù)庫(kù),可以橫向進(jìn)行擴(kuò)展,解決系統(tǒng)數(shù)據(jù)量大的問(wèn)題。
2.HBase為列式存儲(chǔ)數(shù)據(jù)庫(kù),一個(gè)列族下可以支持成百上千列,解決系統(tǒng)非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)與更新單個(gè)列數(shù)據(jù)的問(wèn)題。
3.HBase具備毫秒級(jí)讀寫,隨機(jī)讀寫,實(shí)時(shí)讀寫,無(wú)線存儲(chǔ)拓展,數(shù)據(jù)高可用,多級(jí)緩存,服務(wù)不中斷,主備自動(dòng)切換,異地雙活等特性,解決系統(tǒng)對(duì)于性能,存儲(chǔ)的問(wèn)題。
4.HBase存儲(chǔ)自帶多種壓縮算法,降低數(shù)據(jù)存儲(chǔ)量。
5.HBase數(shù)據(jù)支持多版本,對(duì)修改的數(shù)據(jù)可以支持多個(gè)版本數(shù)據(jù)。
6.HBase自帶數(shù)據(jù)有效期功能,對(duì)于長(zhǎng)時(shí)間無(wú)需使用的數(shù)據(jù),可以進(jìn)行刪除。
HBase缺點(diǎn)
1.HBase核心是Rowkey的設(shè)計(jì),Rowkey需要保證唯一的同時(shí)還需要散列,所有查詢?nèi)啃枰?jīng)過(guò)Rowkey查詢,因次需要在數(shù)據(jù)庫(kù)或者ES中建立二級(jí)索引輔助搜索。
2.HBase為列式存儲(chǔ),無(wú)法根據(jù)單獨(dú)的列進(jìn)行查詢,只能通過(guò)RowKey進(jìn)行查詢。
HBase注意事項(xiàng)
1、數(shù)據(jù)熱點(diǎn)問(wèn)題以及解決方法
HBase每張表下默認(rèn)會(huì)有10個(gè)Region,如果使用不正確會(huì)導(dǎo)致所有數(shù)據(jù)寫入同一個(gè)Region服務(wù)器下,造成數(shù)據(jù)熱點(diǎn)問(wèn)題,解決數(shù)據(jù)熱點(diǎn)問(wèn)題一共需要注意兩個(gè)方面。
第一方面是建表時(shí)(預(yù)分區(qū)建表),要根據(jù)自己的RowKey特性選擇正確的分區(qū)規(guī)則,一共有三種方式,每種分區(qū)方式都不一樣,在這里建議使用 HexStringSplit這種方式。
第二方面是RowKey的設(shè)計(jì),需要保證唯一的同時(shí)盡量散列。人資側(cè)采用雪花算法生成唯一ID,對(duì)唯一ID進(jìn)行MD5轉(zhuǎn)16進(jìn)制加上反轉(zhuǎn)后的唯一ID作為RowKey,可以將數(shù)據(jù)均勻的分散到多個(gè)Region中,避免數(shù)據(jù)熱點(diǎn)問(wèn)題。
2、HBase批量獲取數(shù)據(jù)大小建議
對(duì)HBase進(jìn)行批量查詢時(shí),將批量數(shù)據(jù)控制到100以內(nèi),超過(guò)后性能會(huì)下降非常明顯。
3、配額與限流
申請(qǐng)HBase實(shí)例時(shí)需要注意,如申請(qǐng)時(shí)配額寫成10000QPS,意味著這個(gè)實(shí)例下所有表的讀+寫每秒不能超過(guò)10000次,超過(guò)配額后,服務(wù)會(huì)報(bào)警超出配額,并會(huì)進(jìn)行重試。當(dāng)10000次不能滿足要求時(shí),可以申請(qǐng)?zhí)嵘漕~或者改成批量操作,減少與服務(wù)器連接次數(shù)。
4、單行數(shù)據(jù)大小限制
單行不建議超過(guò)400KB,KV存儲(chǔ)系統(tǒng)非對(duì)象存儲(chǔ)系統(tǒng)。如果Value過(guò)大會(huì)導(dǎo)致處理性能直線下降表初始化后默認(rèn)只能接受512KB大小的VALUE入庫(kù)。
5、HBase連接注意事項(xiàng)
HBase每次連接耗時(shí)較高,構(gòu)建Connect對(duì)象時(shí),需要在程序啟動(dòng)時(shí)進(jìn)行,不能在使用時(shí)進(jìn)行創(chuàng)建。
HBase在人資績(jī)效數(shù)據(jù)預(yù)處理平臺(tái)中的性能參考

HBase寫入最近30天TP99

HBase寫入均值

HBase查詢速度TP99

HBase查詢均值

推薦閱讀:
世界的真實(shí)格局分析,地球人類社會(huì)底層運(yùn)行原理
企業(yè)IT技術(shù)架構(gòu)規(guī)劃方案
論數(shù)字化轉(zhuǎn)型——轉(zhuǎn)什么,如何轉(zhuǎn)?
企業(yè)10大管理流程圖,數(shù)字化轉(zhuǎn)型從業(yè)者必備!
【中臺(tái)實(shí)踐】華為大數(shù)據(jù)中臺(tái)架構(gòu)分享.pdf
華為如何實(shí)施數(shù)字化轉(zhuǎn)型(附PPT)
