HBase是Apache Hadoop⽣態系統中的重要⼀員,主要⽤於海量結構化資料儲存。
HBase是一個構建在HDFS上的分散式列儲存系統(嚴格的來說應該是列族儲存),資料儲存在HDFS上。
HBase與MapReduce良好的整合,使用MapReduce來處理資料。
從邏輯上講,HBase將資料按照表、⾏和列進⾏儲存,它是⼀個分散式的、稀疏的、持久化儲存的多維度排序表。
相對於Hive來說,HBase適合實時資料訪問,Hive則適合批處理資料分析。
HBase的應用場景很多,百度的頁面庫,淘寶的商品庫,小米的雲端儲存服務等。
(Table, RowKey, Family, Qualifier, TimeStamp) -->Value
在HBase中,一行資料由行健RowKey作為鍵,包含多個列族(Famliy),列族由可同時訪問的多個列組成(Qualifier),
--稀疏:對於空(null)的列,並不佔⽤儲存空間,表可以設計的非常稀疏
--資料多版本:每個單元中的資料可以有多個版本(時間戳不同)
• Column family name
• Column name
• Timestamp
• Value
資料表中所有行,安照Row Key字典序排列,Table在行的方向上分為多個region,
Region按⼤⼩分割的,每個表開始只有⼀個Region,隨著資料增多,Region不斷增⼤,當增⼤到⼀個閥值的時候,
Region就會等分會兩新的Region,之後會有越來越多的Region。Region是HBase中分散式儲存和負載均衡的最⼩單元,
Region雖然是分散式儲存的最⼩單元,但並不是儲存的最⼩單元。
--Region由⼀個或者多個Store組成,每個Store儲存⼀個columns family
--每個Strore又由⼀個MemStore和0至多個StoreFile組成
--MemStore儲存在記憶體中,StoreFile儲存在HDFS上
--從物理上來說,⼀張表被拆分成了多塊,每⼀塊是⼀個HRegion
-- 我們⽤表名+ 開始和結束主鍵,來區分每⼀個HRegion
-- ⼀個HRegion 會儲存⼀個表⾥⾯某段連續的資料,從開始主鍵到結束主鍵
-- ⼀個HRegionServer上⾯有多個HRegion,⼀個HRegion 也只會被⼀個HRegionServer維護
--HRegionServer主要負責響應⽤戶I/O請求,從HDFS讀寫資料,是HBase中最核⼼的模組
-- HRegionServer內部管理了⼀系列HRegion物件
-- 每個HRegion對應了Table中的⼀個Region,HRegion中由多個HStore組成
-- 每個HStore 對應了Table中的⼀個Column Family的儲存
-- 最好將具備共同IO特性的Column放在⼀個Column Family中
-- HMaster的主要任務就是給HRegionServer分配HRegion
-- HMaster指定HRegionServer 要維護哪些HRegion
-- 當⼀臺HRegionServer當機時,HMaster會把它負責的HRegion標記為未分配,然後再把它們分配到其他HRegionServer 中
建表:表名scores,有兩個列族:‘grade’和‘course’
>create 'scores' ,'grade','course'複製程式碼
>list複製程式碼
>describe 'scores'複製程式碼
>put 't1', 'r1', 'c1', 'value', ts1複製程式碼
t1指表名,r1指⾏鍵(key),c1指列名,value指值,ts1指資料戳,
⼀般都省略不設定。
> put 'scores', 'Tom', 'grade', 6
> put 'scores', 'Tom', 'course:math', 89
> put 'scores', 'Tom', 'course:art', 63
> put 'scores', 'Jim', 'grade', 7
> put 'scores', 'Jim', 'course:math', 75
> put 'scores', 'Jim', 'course:science', 48複製程式碼
>get 'sources', 'Tom'
>get 'sources', 'Tom', 'grade'
>get 'sources', 'Tom', 'grede' , 'course'複製程式碼
> scan 'scores'
> scan 'scores',{COLUMNS =>'course:math'}
> scan 'scores',{COLUMNS =>'course'}
> scan 'scores',{COLUMNS =>'course', LIMIT => 1, STARTROW => 'Jim'}複製程式碼
> delete 'scores', 'Jim', 'course:math'複製程式碼
> truncate 'scores'複製程式碼
為scores表增加⼀個family列族,名為profile
> alter 'scores', NAME => 'profile'複製程式碼
刪除profile列族
> alter 'scores', NAME => 'profile', METHOD => 'delete'複製程式碼
> drop 'scores'複製程式碼