Hbase基礎

一、Hbase概念

    Hbase是一個高可靠、高性能、面向列、可伸縮的分佈式數據庫,利用hBase技術可以在廉價pc上搭建大規模結構化數據集羣。Hbase參考Google的BigTable建模,使用類似GFS的HDFS作爲底層文件存儲系統,在其上可以運行MapReduce批量處理數據,使用Zookeeper作爲協同服務組件。

二、Hbase特性

Hbase作爲一個典型的NoSQL數據庫,可以通過行健檢索數據,僅支持單行事務,主要用於存儲非結構化數據和半結構化的鬆散數據,

    1.容量巨大
        Habse的單標可以有百億行、百萬列,數據矩陣橫向和縱向兩個維度所支持的數據量級都非常具有彈性。
    2.面向列
        Hbase是面向列的存儲和權限控制,並支持列獨立檢索。
            列式數據庫特性:
                1)數據按列存儲,即每一列單獨存放
                2)數據即索引
                3)只訪問查詢涉及的列,可以大量降低系統IO
                4)每一列由一個線索來處理,即查詢的併發處理性能高
                5)數據類型一致,數據特徵相似,可以高效壓縮
    3.稀疏性
        傳統數據庫中爲NULL的列佔用存儲空間,造成存儲空間浪費,而Hbase中爲NULL的列不佔用存儲空間,因此,表可以設計的非常稀疏
    4.擴展性
        Hbase底層文件存儲依賴HDFS,因此Hbase具備可擴展性。Hbase的擴展是熱擴展,在不停止現有服務的前提下,可以隨時添加或減少節點。
    5.高可靠性
        Hbase提供了WAL和Replication機制。前者保證了數據寫入時不會因集羣異常而導致寫入數據的丟失;後者保證了在集羣出現嚴重問題時數據不會發生丟失或者損壞。
    6.高性能
        底層的LSM數據結構和RowKey有序排列等架構上的獨特設計,使得Hbase具有非常高的寫入性能。Region切分、主鍵索引和緩存機制使得Hbase在海量數據下具備一定的隨機讀取性能,改性能針對RowKey的查詢能達到毫秒級。

三、Hbase數據模型

Hbase是一種列式存儲的分佈式數據庫,其核心概念是表。與傳統的關係型數據庫一樣,表由行和列組成,但Hbase同一列可以存儲不同時刻的值,同時多個列可以組成一個列族。

表:
    在Hbase中數據以標的形式存儲,同一個表中的數據通常是相關的,通過列族進一步把一些列組織在一起進行訪問。
    Hbase列式存儲格式允許用戶存儲大量的信息在相同的表中,而在RDBMS模型中,大量信息則需要切分成多個表存儲。
    Hbase創建表時,需要指定表名和至少一個列族,。列族影響表的無力存儲結構,創建表後列族還可以更改,只是比較麻煩。

行健(RowKey):
    行健是不可分割的字節數組,行健是按字典排序由低到高存儲在表中的,一億個空的數組來標識表空間的其實或者結尾。
    RowKey被冗餘存儲,所以長度不宜過長,過長的RowKey將會佔用大量的空間同時會降低檢索效率。
    RowKey應該儘量分佈均勻,這樣不會產生熱點現象。
    RowKey在設計上必須保證唯一性。

列族:
    Hbase中的列族是一些列的集合。一個列族中所有的列成員有着相同的前綴。
    冒號(:)是列族的分隔符,用來區分列族前綴和列名。
    在物理上一個列族的成員在文件系統都是存儲在一起的。因爲存儲優化都是針對列族級別的,這就意味着,一個列族的所有成員都是通過相同的方式訪問的。
    在創建表的時候至少要指定一個列族,新的列族可以隨後按需動態的添加,但是修改列族要先停用表。
    應該將經常一起查詢的列放到同一個列族中,合理的劃分列族將減少查詢時加載到緩存的數據,提高查詢的效率。但是頁不要有太多的列族,因爲跨列族訪問是非常低效的。

單元格:
    Hbase中的單元格由行健、列族、列、時間戳唯一確定。
    單元格的內容是不可分隔的字節數組。
    每個單元格都保存着同一份數據的多個版本,不同時間版本的數據按照時間順序倒序排序,最新的時間排在最前面,時間戳是64位的整數,可以由客戶端在寫入數據時賦值也可以由RegionServer自動賦值。

四、數據模型的操作

Hbase對數據模型的四個操作主要是Get、Put、Scan和Delete。通過實例進行操作,用戶可以完成向Hbase存儲和檢索數據,以及刪除無效數據之類的操作。
所有修改數據的操作都必須保證行級別的原子性,多個客戶端或線程對同一行的讀寫操作都不會影響該數據的原子性,要麼讀到最新的數據,要麼等待系統允許寫入該行的修改。

讀Get:
    Get操作是指從客戶端API中獲取已存儲數據的方法。HTable類中提供了get()方法,同時還有與之對應的Get類,Get操作返回一行或多行數據。
    get()方法默認一次取回該行全部列的數據,我們可以限定只取回某個列族對應的列的數據,或者進一步限定只取回某些列的數據。
    當用戶使用get()方法獲取數據時,Hbase返回的結果包含所有匹配的單元格數據,這些數據將被封裝在一個Result的實例中返回給用戶。用Result類提供的方法,可以從服務器端獲取匹配指定行的特定返回值。這些值包括列族、列限定符和時間戳等。

寫Put:
    Put操作要麼向表增加新行(Key不存在),要麼更新行(Key已存在)。
    Put可以一次向表中插入一行數據,也可以一次操作一個集合,同時向表中寫入多行數據。如果要頻繁的修改某些數據,用戶應該創建一個RowLock實例來防止其他用戶對該數據進行修改。
    Put操作每次都會發起一次到服務器的RPC操作,如果有大量的數據要寫入表中,就會有數千次的RPC操作,這樣會導致效率很低。Hbase客戶端有一個緩衝區,負責將數據批量的僅通過一次RPC操作發送到服務器端,這樣可以大大提高寫入性能,默認客戶端寫緩衝區是關閉的,需要顯示打開該選項。
    當將一個Put集合提交到服務端的時候,可能會出現部分成功或部分失敗的可能,失敗的數據會被保存到緩衝區中進行重試。
    Hbase還提供了一個compare-and-set操作,這個操作先進行檢查,條件滿足後在執行,這個操作對於行是原子性的。

掃描(Scan):
    Scan操作允許多行特定屬性迭代,其實用與get()方法非常類似。
    Scan操作執行後將得到一個執行結果,該結果被封裝在一個ResultScanner實例中。

刪除(Delete):
    Delete用於從表中刪除數據。HTable除了提供刪除方法delete()方法只外,還有一個與之對應的Delete類,用戶可以通過多中方法限定要刪除的列。
    Hbase的delete操作可以指定刪除某個列族或者某個列,或者指定某個時間戳,刪除比這個時間早的數據。
    Hbase的delete操作並不是正真從磁盤刪除數據,而是通過創建墓碑標誌進行處理。這些墓碑標記的值和小於該時間版本的單元格在大合併時被清除。

五、數據模型的特殊屬性

1.版本
    RowKey(行健)、Column(列族和列)、Version(版本)組合在一起成爲Hbase中的一個單元格,但是因爲有可能會有很多單元格的行和列式相同的,因此要區分不同的單元格可以使用版本。
    RowKey和Column的值是用字節數組表示的,而Version則使用一個長整型表示,這個長整型值是使用java.util.Date.getTime()或者System.currentTimeMillis()產生的這就意味着它的含義是“當前時間和1970-01-01 UTC的時間差,單位毫秒”。
    在Hbase中,版本是按倒序排列的,因此讀取這個文件的時候,最先找到的是最近的版本。

2,排序
    Get和Scan操作返回的都是經過排序的數據。列在服務器端也是字典排序的,所以按照名稱的字典順序返回。總體來說,返回的數據首先按字典序排序,其次是列族,然後是列修飾符,最後是時間戳反向排序,最新的在最前面。

3.列的元數據
    對於Hbase表中的列族,除了KeyValue實例以外,沒有關於元數據的描述,KeyValue對象表示Hbase的最小單位是cell。Hbase的表不僅在一行中支持許多列,而且支持行之間有不同的列,所以需要單獨維護行和列之間的關係。獲取列族完整列名的唯一方法就是處理所有行。

4.連接查詢
    Hbase不支持連接查詢,用戶想要在應用中實現連接查詢,必須要自己實現。

5.計數器
    ICV是Hbase的計數器,可以使用它完成一些諸如計算頁面瀏覽量的操作。ICV操作發生在RegionServer上,而不是在客戶端,所以速度快,使用方式也沒有那麼繁瑣。

6.原子操作
    類似Java的原子類,HTableInterface接口也提供checkAndPut和checkAndDelete方法。

7.事務特性ACID
    Hbase數據庫僅提供對行級別的原子性保證,也就是說同時對同一個Key下的數據進行兩個操作,在實際執行的時候會串行的執行,保證了沒一個KeyValue對不會被破壞。
    Hbase不是一個具備完整ACID特性的數據庫,它只是實現了某些屬性。
    HbaseACID設計原則:
        1)對於同一行所有列的修改是原子性的,對於該行的put操作要麼整體成功要麼整體失敗。
        2)一個返回成功標誌的操作肯定是完全成功的。
        3)一個返回失敗標誌的操作肯定是完全失敗的。
        4)超時的操作可能成功也可能失敗。但不會是部分成功或失敗。
        5)對於同一行跨多個列族的的操作也遵循上面的原則。
        6)多行操作不能保證原子性
        7)checkAndPut是原子性的
        8)批量修改操作不能跨越多行
        9)所有修改操作是保證順序的
        10)一致性和隔離性。通過API得到的行的數據是一個完整的行,數據由表中某個時刻的數據構成
        11)持久性。所有可以讀取到的數據保證都是已經被持久化到磁盤上的。也就是說不會讀到沒有寫到磁盤上的數據。所有返回成功操作的數據都是處於持久化到磁盤上的。返回失敗的都沒有持久化。

8.行鎖
    Hbase API中put()、delete()、checkAndPut()等修改操作是獨立執行的這意味着在一個串行方式的執行中,對於每一行必須保證行級別的操作是原子性的。RegionServer提供了一個行鎖特性,這個特性保證了只有一個客戶端能獲取一行數據相應的鎖,同時對該行進項修改。

9.自動分區
    Hbase中的一個表的數據會被劃分成很多Region,Region可以動態擴展,而且Hbase保證Region的負載均衡。Region實際上是行健排序後的按規則分割的連續的存儲空間。如果Region太大會被動態拆分,相反,多個Region會合併成一個較大的Region。
發佈了58 篇原創文章 · 獲贊 40 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章