【HBase】分佈式儲存系統

什麼是HBase?

    HBase是一個高可靠性、高性能、可伸縮的分佈式存儲系統:
• 一個構建在HDFS上的分佈式NoSQL數據庫;
• 基於Google BigTable模型開發的,典型的key/value系統;
• 具有鬆散的表結構;原生海量數據分佈式存儲;支持隨機查詢、範圍查詢
• 高吞吐,低延遲;
• 列存儲,多版本,增量導入,多維刪除

HDFS 與 HBase

    Hdfs是一個分佈式文件系統,適合儲存大文件;不支持單個記錄快速查找;適合高延遲的批處理;是對數據的順序訪問。HBase是基於hdfs的,適合大表快速查詢,且能夠對單個記錄實現快熟查詢的;在內部使用hash表提供文件形式儲存數據,用於快熟查找。 HBase上的數據是以StoreFile(HFile)二進制流的形式存儲在HDFS上block塊中。HDFS並不知道的hbase存的是什麼,它只把存儲文件視爲二進制文件,也就 是說,hbase的存儲數據對於HDFS文件系統是透明的。
可以提煉出hbase具有這些特性:
1.大:一個表可以有數十億行,上百萬列;
2.無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中不同的行可以有截然不同的列;
3.面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索;
4.稀疏、多維、排序的map:空(nul) 列並不佔用存儲空間,表可以設計的非常稀疏:每個單元中的數據可以有多個版本,默認情況下版本號自動分配,是單元格插入時的時間戳:
5.數據類型單- -: Hbase中 的數據都是字符串,沒有類型。
6.強一致性讀寫:HBase不是“最終一致性”數據存儲。這讓它很適合高速7.計數聚合類任務:自動分片(Automatic sharding): HBase 表通過region 分佈在集羣中。數據增長時,region會自動分割並重新分佈;
8.RegionServer自動故障轉移和負載均衡;
9.Hadoop/HDFS集成: HBase 文持開箱即用地支持HDFS作爲它的分佈式文件系統:
10.MapReduce: HBase 通過MapReduce 支持大併發處理;
11.實時、隨機地大數據訪問: HBase內 部使用lsM-tellog-structured merge tree)作爲數據存儲架構,LSM-tree周 期性地合併小文件到較大的文件,以減少硬盤尋址Java客戶端API:HBase支持易於使用的JavaAPI進行編程訪問;
12.Thrift/REST API: HBase 也支持Thrift和REST作爲非Java前端的訪問;
13.Block Cache和Bloom Filter:對於大容量查詢優化,HBase 支持Block Cache和Bloom Filter
14.快照支持

    根據HBase的特性,可以推測其應用場景:
    首先,確信有足夠多數據,如果有上億或上千億行數據,HBase 是很好的備選,可在大數據上高併發操作,比如每秒對PB級數據進行上千次操作(如果只有上千或上百萬行,則用傳統的RDBMS可能是更好的選擇)需要對數據進行隨機讀操作或者隨機寫操作;
HBase能夠爲大數據提供實時的讀/寫操作,但是根據實際情況來看,HBase在實時的數據寫入性能上優於查詢性能。
    其次,確信可以不依賴所有RDBMS的額外特性(例如,列數據類型、第二索引、事務、高級查詢語言等)
    第三,確信有足夠的硬件。因爲HDFS在小於5個數據節點時,基本上體現不出它的優勢。

HBase的數據模型

在HBase中, 數據存儲在表中,表具有行(row)和列(column):
在這裏插入圖片描述
在這裏插入圖片描述
     在HBase中,列值所在的位置,稱爲cell(單元格) : cell內的每個值可由rowkey+column family+column key+timestamp聯合表示 ; 每個cell可能有多個版本的數據,按時間戳區分。
在這裏插入圖片描述
    在HBase中,記錄以key-value對的形式存儲在HFile文件中: HFile是作爲二進制文件存儲的;來自單個列族的記錄可能會被split到多個HFile中,但是單個的HFile不可 能包含來自多個列族的數據 ; 當MemStore中的數據被flush到磁盤中時,就創建HFile文件。在這裏插入圖片描述
    HBase的核心數據結構就是 map: map 就是 key-value 對集合;HBase中的 map 是按字母順序嚴格排序的,也就是說,按照 row key(行鍵)以 字母順序排序 ;可將HBase中的表視爲Key-Value表 ; Key: 行鍵+列族+列+時間戳 ;Value: 數據值 ;可以將HBase表看作是一個多維的map。
    命名空間(namespace)是邏輯上的一組表,等同於RDBMS中的數據庫;命名空間的操縱有創建、刪除和修改 ;有兩個專門的預定義命名空間: hbase - 系統命名空間, 用來包含HBase內部表 、default - 沒有顯式指定命名空間的表會位於這個namespace 。
    表(table) 是多個 row 組成 。
    行(row) ,每一 個row代表着一個數據對象,由一個 row key(行鍵)和一或多個具有值的 column 組成,
    RowKey(行鍵)是表中每個數據對象的唯一標識,是Byte array,按字母順序排序,即 row 也是按 照這個順序來進行存儲的;Rowkey的設計非常重要,一個重要的原則是:相關的 row 要存儲在接近的位置 ;與 NoSQL 數據庫一樣,Row Key 是用來檢索記錄的主鍵。
    Column Family(列族):column family 是一些 column 的集合.每個column family有着一系列屬性;表中的每一row都有相同的column family;訪問控制、磁盤和內存的使用統計都是在列族層面進行的;column family 必須在 table 建立的時候聲明。
    Column Qualifier(列限定符): 在column family中加入column qualifier是爲了向給定的數據提供索引; column family 中的數據通過 column qualifier 來進行映射; column qualifier 也沒有特定的數據類型,以二進制字節來存儲; column family 和 column qualifier 組成列(column),由冒號(:)分隔,列(column) 隨時可以新建。
     Cell(單元格): Cell 是由{row key,column family:column qualifier, version}元組唯一確定的單元; Cell 中的數據是沒有類型的,全部是字節碼形式存儲。
     版本(Version): 每個value都會有一個 timestamp,作爲該value特定版本的標識符; 默認情況下,timestamp 代表數據被寫入 RegionServer 的時間; row和column以字節(byte)存儲,而version則是一個長整數 ;HBase version維度以降序存儲, 因此,當從store file中讀取時,最近的 值首先被讀取。
    指定存儲的版本數量 : 在表創建時指定一個給定列的存儲版本的最大數量,或者通過alter命令修改; 在HBase 0.96之前,默認的版本數量是3,但是從0.96起,這個默認值改爲了1。 例:修改一個Column Family的版本的最大數量爲5 hbase> alter ‘t1’, NAME => ‘f1’, VERSIONS => 5 ; 還可以修改每個column family存儲的版本的最小數量。默認是0,意味着這個 特性被禁用。 例:修改一個Column Family的版本的最小數量 hbase> alter ‘t1’, NAME => ‘f1’, MIN_VERSIONS => 2; 從HBase 0.98.2開始,可以指定一個全局的默認最大版本數量,用於所有新 創建的表: 在hbase-site.xml中指定hbase.column.max.version參數值。
    有四個主要的數據模型操作: Get, Put, Scan, Delete。 get: 返回一個指定行的屬性 ; put:向表添加新的行(如果key是新的)或者更新已經存在的行(如果 key已經存在); scan:掃描整個表; delete:從表中刪除指定的行。
    訪問 HBase table 中的行,只有三種方式:通過單個 Row Key 訪問 ; 通過 Row Key 的 range 全表掃描 ; Row Key 可以是任意字符串(最大長度是64KB,實際應用中長度一般 爲 10 ~ 100bytes),在HBase 內部,Row Key 保存爲字節數組。
    查詢: 在查詢中不指定時間,返回的將是最近的一個時間的版本;如果給出 timestamp,返回的將是早於這個時間的數值。
    更新和刪除操作, 更新:將修改後的數據以新版本的形式插入到表中;刪除:將欲刪除的數據以新版本的形式插入表中,並做刪除標記。 在major compaction時被清除; HBase在進行數據存儲的時候,新的數據並不會直接覆蓋舊的數據, 而是通過追加的形式呈現,並通過時間戳進行區分取值; 可以簡單的把HBase理解爲一個很大的HashTable,Key-Value形式就是 其存儲結構,當使用put操作的時候,如果RowKey不存在就是添加, 反之就是更新。
    Table 在行的方向上分割爲多個HRegion,每個HRegion分散在不同 的RegionServer中。每個HRegion由多個Store構成,每個Store由一個memStore和0或多 個StoreFile組成,每個Store保存一個Columns Family。

HBase的架構

    主-從(Master/Slave)架構,由以下類型節點組成: HMaster節點:RegionServer節點、ZooKeeper集羣。HMaster和NameNode都支持多個熱備份,使用ZooKeeper來做協調 ;ZooKeeper一般由三臺機器組成一個集羣,內部使用PAXOS算法,可以支持同時少於半數的宕機。
    HMaster: 監控RegionServers ; 處理RegionServers的故障轉移 ; 處理元數據的變化 ; 分配regions/解除regions分配; 接口的所有元數據變化 ; 在空閒時間執行重新加載平衡 ; 它將它的位置發佈給使用使用ZooKeeper的客戶端 ; HMaster Web UI提供所有與HBase集羣有關的信息(表,regions,RegionServerst等)。
    HRegionServer: 服務於分配給它的regions(表);處理客戶端的讀/寫請求; 將緩存刷新(flush)到HDFS; 維護WAL預寫日誌(Write-Ahead logs); 執行compactions ; 負責處理region split(拆分region)。
    **ZooKeeper:**協調者,爲HBase集羣提供協調服務 ;它存放整個HBase集羣的元數據以及集羣的狀態信息 ; 它存儲HMaster的地址,並存儲HBase中表的設計模式; 它實時管理着HMaster和HRegionServer的狀態,並且會在它們宕機時通知給 HMaster,從而HMaster可以實現HMaster之間的failover,或對宕機的HRegionServer中的HRegion的修復(將它們分配給其他的HRegionServer); ZooKeeper集羣本身使用一致性協議(PAXOS協議)保證每個節點狀態的一致性。

HBase的優缺點

    HBase的優點: HBase採用強一致性模型,在一個寫返回後,保證所有的讀都讀到相同的 數據(行級別原子性,即,PUT 操作一定是完全成功或者完全失敗); 通過HRegion動態Split和Merge實現數據存儲自動水平擴展,並使用HDFS提 供的多個數據備份功能,實現高可用性;列可以動態增加,並且列爲空就不存儲數據,節省存儲空間 ; 採用HRegionServer和DataNode運行在相同的服務器上實現數據的本地化, 提升讀寫性能,並減少網絡壓力;內建HRegionServer的宕機自動恢復。採用WAL來Replay還未持久化到HDFS 的數據。(容錯性,自動故障轉移); 可以無縫的和Hadoop/MapReduce集成,有利於數據分析; Hbase 可以提供高併發讀寫操作的支持; 版權免費 ; 非常靈活的模式設計(或者說沒有固定模式的限制);可以跟 Hive 集成,使用類 SQL 查詢 ; 客戶端接口易於使用。
     HBase的缺點:不能支持條件查詢,只支持按照 row key 來查詢; 容易產生單點故障(在只使用一個 HMaster 的時候) ; 不支持事務 ;JOIN 不是數據庫層支持的,而需要用 MapReduce; 只能在行鍵上索引和排序; 沒有內置的身份和權限認證;WAL的Replay過程可能會很慢; 災難恢復比較複雜,也會比較慢; Major Compaction會引起IO Storm。
除了上面介紹的基本概念,如何將不同來源的數據導入導出HBase也需要掌握,以及如何在HBase中創建刪除更新表等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章