前言
HBase是一款分佈式的NoSQL DB,能夠輕鬆擴展存儲和讀寫能力。數據庫
主要特性有:網絡
按某精確的key獲取對應的value(Get)併發
經過前綴匹配一段相鄰的數據(Scan)分佈式
多版本oop
動態列測試
服務端協處理器(能夠支持用戶自定義)spa
TTL:按時間自動過時設計
今天咱們來聊一聊HBase以上特性在特徵工程中的應用,先從最簡單的獲取一條數聽說起:3d
應用場景介紹
Get
這是HBase中最簡單的一個查詢操做,根據id讀某一個id的屬性blog
好比根據用戶id獲取這個用戶的 城市,年齡,標籤等信息
進階-前綴匹配掃描-Scan
常見場景:
下圖是經典的scan用法
hbase中rowkey是按字典序排列
所以很是經典的用法爲:
rowkey: 散列(用戶id)_時間戳
而後這樣就能夠經過制定startkey,endkey來掃描一段時間內的數據,而且這些數據是存儲在一塊兒的
HBase天生對Scan(掃描)操做有良好的支持,
這裏要從HBase的存儲特色提及:
NoSQL DB有兩種常見的分散數據的方案,一種是按完整的key作hash,數據徹底是分散的,另一種是按Range劃分,連續的key存儲上是相鄰的,這樣能夠經過在rowkey上作一些業務邏輯的拼接,使得在掃描必定量級邏輯連續的數據的時候,直接掃描的同一塊文件下的數據,而不是到分散的各個機器上去查找
HBase選擇的是第二種方式來存儲數據
1.相鄰數據經過scan前綴匹配查詢
例如:查某一個用戶一個時間段內的數據
2.爲scan操做賦能——Filter
能夠根據rowkey,列等維度設置過濾器,減小服務端到客戶端的數據傳輸
Tips:過濾器是個好東西,須要的過濾操做在服務端都進行完了,減小了網絡傳輸,只返回符合條件的數據。
可是由於符合條件的數據,多是在設置的範圍中最後一條,因此實際掃描的數據仍是Scan的startkey到endkey之間的,仍是要注意掃描的範圍不要過大
3.使用Scan的正確姿式
通過必定的測試和實踐,咱們發現持續的進行Scan,穩定可控的併發下,發起Scan,每次Scan 1000條的時候最佳
由於此場景下HBase的RPC隊列會獲得快速的消費,從而有能力處理新的請求,而不是一直堆積等待一個大的請求的完成
不少同窗看到能夠作掃描操做,就但願經過掃描操做來查詢幾百萬幾千萬甚至更多的數據來代替HIVE?
若是是但願一次性讀大量數據的時候(好比加載一個月的幾百萬用戶明細數據,或者經過一個月全部用戶明細作聚合),不如直接跑離線任務讀文件或者使用預聚合的NoSQL 引擎比較好。
短小快的請求則能夠經過HBase的cache,文件的index,bloomfilter等特性來施展更多。
Tips:Get就是一個只讀一行的小Scan
靈活的動態列
傳統數據庫以及大部分數據存儲須要在建表的時候定義好「字段」,
可是實際應用的時候,好比特徵訓練中,有不少場景是「字段」或者tag不肯定的狀況
HBase的動態列則很好的解決了這個問題
1.建表不須要指定列名
2.一次取出一個rowkey全部動態列或者多個動態列
3.也能夠table.get( list ),一次獲取多個id對應的數據
在實際應用中的使用:
實際應用中,HBase的每個Column對應一個特徵,RowKey的設計爲 md5(業務ID)+時間戳,md5用來對ID散列,使數據均勻分佈在不一樣Region上,時間戳用來在SCAN操做時對時間遍歷
摘抄自用戶的way社區文章:http://way.xiaojukeji.com/article/13662
多版本
HBase中能夠查看版本的N個歷史版本,經過數據的時間戳實現的
常見場景:
查看某特徵隨時間變化狀況
或者
當發現計算不符合預期的時候,回溯查詢某一個id某特徵的歷史版本
原理簡述:
HBase的每條數據都是帶時間戳信息的,
會按rowkey,列簇,列,時間戳有序排列,默認會查詢到指定的rowkey,列簇,列的最新時間戳的value
而指定查詢歷史N個版本,就會從最新的數據往前找N個時間戳對應的版本
快照
HBase能夠導出快照文件,來進行離線分析
常見場景:
須要獲取表中全部數據或者大部分數據的時候,能夠經過快照方式,將截止到某一時間的數據文件導出到離線集羣,來進行數據分析
原理簡述:
數據實時寫入HBase,觸發快照操做的時候,實時寫入的數據會落盤,落盤的文件不會再被修改,HBase內部會記錄當前有哪些文件(生成引用),後續能夠將快照引用對應的實際數據文件導出到Hadoop進行MR或Spark分析
Tips:導出文件對磁盤IO有必定壓力,所以導出操做也是會進行限流的
總結
本文介紹了HBase在特徵訓練數據存儲方面經常使用的幾個特性:Get,Scan,動態列,多版本,以及具體應用場景。