hadoop的生態系統
1, hbase簡介
–HBase–HadoopDatabase,是一個高可靠性、高性能、面向列、可伸縮、實時讀寫的分布式數據庫
–利用HadoopHDFS作為其文件存儲系統,利用HadoopMapReduce來處理HBase中的海量數據,利用Zookeeper作為其分布式協同服務
–主要用來存儲非結構化和半結構化的松散數據(列存NoSQL數據庫)
高可用; 多備份, 分布式
高性能: 比mapreduce的性能高出許多
面向列: 存儲模式是列族和列的存儲模型
可伸縮: 集群可伸縮性
實時讀寫: 可毫秒級的響應, 可做在線數據庫使用
半結構化: 通過flume導入的都是半結構化的數據
2, hbase的數據模型
和關系型數據庫的對比, 按列存儲
關系型存儲模型:
hbase存儲模型
1), rowkey: 相當於id
1, 決定一行數據 2, 按照字典順序排序 3, 只能存儲64k
因為每次存儲單元格時, rowkey都會被保存, 所以不要設置太大, 盡量為規則的數字最好, 長度相等
2), 列族(column family) , 列 (qualifier)
1, hbase中每個列都屬於某個列族, 列族必須作為表模式定義的一部分預先給出
2, 列名以列族為前綴, 每個列族有多個列成員, 新的列 (qualifier) 按需動態加入 3, 權限控制, 存儲及調優都是在列族層面進行的 4, hbase把同一列族的所有數據存儲在同一目錄下, 由幾個文件保存
使用注意: 列族一般控制在3個以內, 多了會影響效率
一個列族可以包含百萬級別的列
3), Timestamp
1, hbase中每個cell存儲對同一份數據有多個版本, 根據時間戳來區分的, 不同版本按時間倒敘排列, 默認取最新的
2, 時間戳是64位整型
3, 時間戳可以由hbase賦值, 此時時間戳精確到毫秒
4, 時間戳可由客戶顯示復制, 如果程序要避免數據版本沖突, 必須生成唯一時間戳
4), hbase的Cell單元格
1, 由行和列的坐標交叉決定 2, 單元格是有版本的, 一次存儲生成一個時間戳 3, 內容是未解析的字節數組
由{rowkey,column(=<family> +<qualifier>),version}唯一確定的單元, cell中的數據都是字節碼形式
5), HLog( WAL log), 日志, 用來做數據恢復的
–HLog文件就是一個普通的HadoopSequence File,SequenceFile 的Key是HLogKey對象,
HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,
同時還包括sequence number和timestamp,timestamp是” 寫入時間”,sequencenumber的起始值為0,
或者是最近一次存入文件系統中sequence number。
–HLogSequeceFile的Value是HBase的KeyValue對象,即對應HFile中的KeyValue。
3, hbase的體系架構
client:
包含訪問hbase的接口並維護cache來加快對 hbase 的訪問
zookeeper
zookeeper自己的高可用, 通過zookeeper自己的選件機制進行的
1, 負責hbase節點的選取 2, client請求meta后, 根據存儲的region的尋址入口訪問具體的region 3, 實時健康那個regionserver的上線下線信息, 並通知master 4, 存儲hbase的schema和table的元數據
mater: 相當於namenode, 但不完全一樣, 不保存原數據信息
負責總體調度, 但元素據信息保存在zookeeper中
1, 分配region 2, regionserver的負載均衡 (region分裂后) 3, 發現失效的region server 並重新分配region 4, 管理用戶對table的增刪改操作
hMaster掛掉, 不會影響讀, 但會影響寫
regionServer: 相當於datanode
1, 維護region, 並處理region的io請求 2, 負責切分在運行過程中變得過大的region
region: 保存表的一部分(可能有多個region) 一個region由多個store組成,
1, HBase自動把表水平划分成多個區域(region),每個region會保存一個表里面某段連續的數據;
每個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region(裂變); 2, 當table中的行不斷增多,就會有越來越多的region。這樣一張完整的表被保存在多個Regionserver上。
memstore: 內存中的臨時存儲
storefile: hdfs中存儲的文件,
一個store對應一個列族(CF), 一個region由多個sotre組成, 一個列族不只有一個store
1, store包括位於內存中的memstore和位於磁盤的storefile寫操作先寫入memstore,當memstore中的數據達到某個閾值,hregionserver會啟動flashcache進程寫入storefile,每次寫入形成單獨的一個storefile 2, 當storefile文件的數量增長到一定閾值后,系統會進行合並(minor、majorcompaction),在合並過程中會進行版本合並和刪除工作(majar),形成更大的storefile 3, 當一個region所有storefile的大小和超過一定閾值后,會把當前的region分割為兩個,並由hmaster分配到相應的regionserver服務器,實現負載均衡 4, 客戶端檢索數據,先在memstore找,找不到再找storefile
Hbase的數據模型
HRegion是HBase中分布式存儲和負載均衡的最小單元。最小單元就表示不同的Region可以分布在不同的HRegionserver上。
HRegion由一個或者多個Store組成,每個store保存一個columnsfamily。
每個Strore又由一個memStore和0至多個StoreFile組成。如圖:StoreFile以HFile格式保存在HDFS上
梳理:
訪問過程, client首先鏈接zookeeper, 然后轉接到HMaster, 返回具體的數據存儲節點HRegionServer, 每個regionserver有多個region, region包括一個HLog用來做數據恢復, 多個Store(對應一個列族), 每隔store包括一個內存文件存儲memstore, 存儲數據到達一定閾值以后, 存儲在文件 StoreFile中, storefile到達閾值后, 會進行合並, 一個region到達閾值后, 會分裂為2個, 所以一張表可能有多個region進行保存.
系列來自尚學堂 極限班視頻