Hbase原理以及基本運行方式和優化

HBase是一個構建在HDFS上的分佈式列存儲系統;
HBase
是基於Google BigTable模型開發的,典型的key/value系統;
HBase
Apache Hadoop生態系統中的重要一員,主要用於海量非結構化數據存儲;
從邏輯上講,HBase將數據按照表、行和列進行存儲。
hadoop同樣,Hbase目標主要依靠橫向擴展,經過不斷增長廉價的商用服務器,來增長計算和存儲能力數據庫

:總結一點,都知道Hbase是一個基於HDFS的列數據庫對不對!數組

Hbase的特徵:

  1. BIGTABLE:所謂的表,一個表能夠有數十億行,和百萬個列。緩存

  2. 面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索服務器

  3. 稀疏:空(null)列並不佔用存儲空間,表能夠設計的很是稀疏;網絡

  4. 數據多版本:每一個單元中的數據能夠有多個版本,默認狀況下版本號自動分配,是單元格插入時的時間戳;(因此說,Hbase中沒有修改這一個概念,若是修改就是增長數據,只不過期間戳變了。查詢出來的數據也就變了。)併發

  5. 數據類型單一:Hbase中的數據都是字符串,沒有類型app

注:針對字符串 我須要解釋一下:最適合使用Hbase存儲的數據是很是稀疏的數據(非結構化或者半結構化的數據)。Hbase之因此擅長存儲這類數據,是由於Hbasecolumn-oriented列導向的存儲機制,而咱們熟知的RDBMS都是row- oriented行導向的存儲機制負載均衡

結構化數據:結構化信息,咱們一般接觸的數據庫所管理的信息,包括生產業務、交易、客戶信息等方面的記錄分佈式

非結構化數據:非結構化數據,包括全部格式的辦公文檔、文本、圖片、XMLHTML、各種報表、圖像和音頻/視頻信息等等函數

分析:在許多大型像奇藝,搜狐,騰訊視頻 優酷視頻。他們的資源可能大部分是非結構化數據。

Hbase存儲模型:

  1. HBase的基本元素:

  2. 表、行、列、單元格: 表的基本要素

  3. 鍵:通常是指行的鍵,即惟一標識某行的元素。表中的行,能夠根據鍵進行排序,而對錶的訪問,也經過鍵。

  4. 列族:全部列族成員擁有相同的前綴,某列族的成員,須要預先定義,但也能夠直接進行追加。

  5. 列族成員會一塊兒放進存儲器。而HBase面向列的存儲,是面向列族的數據存儲,數據存儲與調優都在這個層次,HBase表與RDBMS中表相似,行是排序的,客戶端能夠把列添加到列族中去。

  6. 單元格cell 單元格中存放的是不可分割的字節數組。而且每一個單元格擁有版本信息。HBase的是按版本信息倒序排列。

  7. 區域region:將表水平劃分,是HBase集羣分佈數據的最小單位。在線的全部區域就構成了表的內容。

  8.  

Hbase的存儲原理:

自動分區:(跟hadoopHDFS很類似)

  1. Hbase中一個表被劃分了不少個Region,它能夠動態擴展,保證整個系統的負載均衡。

  2. 讓一個Region達了上限的時候,就會自動拆分二個相等的Region。(原理就是Hbase中的splitcompaction

  3. 每一個Region由一個RegionServer管理,一個RegionServer能夠管理多個Region

4. RgionServer管理100-1000region比較合適。 Region的大小通常在1-20GB

表設計優化:

HBase 是一個高可靠性、高性能、面向列、可伸縮的分佈式數據庫,可是當併發量太高或者已有數據量很大時,讀寫性能會降低。咱們能夠採用以下方式逐步提高 HBase 的檢索速度。

預先分區

默認狀況下,在建立 HBase 表的時候會自動建立一個 Region 分區,當導入數據的時候,全部的 HBase 客戶端都向這一個 Region 寫數據,直到這個 Region 足夠大了才進行切分。一種能夠加快批量寫入速度的方法是經過預先建立一些空的 Regions,這樣當數據寫入 HBase 時,會按照 Region 分區狀況,在集羣內作數據的負載均衡。

Rowkey 優化

HBase Rowkey 是按照字典序存儲,所以,設計 Rowkey 時,要充分利用排序特色,將常常一塊兒讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。

此外,Rowkey 如果遞增的生成,建議不要使用正序直接寫入 Rowkey,而是採用 reverse 的方式反轉 Rowkey,使得 Rowkey 大體均衡分佈,這樣設計有個好處是能將 RegionServer 的負載均衡,不然容易產生全部新數據都在一個 RegionServer 上堆積的現象,這一點還能夠結合 table 的預切分一塊兒設計。

減小ColumnFamily 數量

不要在一張表裏定義太多的 ColumnFamily。目前 Hbase 並不能很好的處理超過 2~3 ColumnFamily 的表。由於某個 ColumnFamily flush 的時候,它鄰近的 ColumnFamily 也會因關聯效應被觸發 flush,最終致使系統產生更多的 I/O

緩存策略 (setCaching)

建立表的時候,能夠經過 HColumnDescriptor.setInMemory(true) 將表放到 RegionServer 的緩存中,保證在讀取的時候被 cache 命中。

設置存儲生命期

建立表的時候,能夠經過 HColumnDescriptor.setTimeToLive(int timeToLive) 設置表中數據的存儲生命期,過時數據將自動被刪除。

硬盤配置

每臺 RegionServer 管理 10~1000 Regions,每一個 Region 1~2G,則每臺 Server 最少要 10G,最大要 1000*2G=2TB,考慮 3 備份,則要 6TB。方案一是用 3 2TB 硬盤,二是用 12 500G 硬盤,帶寬足夠時,後者能提供更大的吞吐率,更細粒度的冗餘備份,更快速的單盤故障恢復。

分配合適的內存給 RegionServer 服務

在不影響其餘服務的狀況下,越大越好。例如在 HBase conf 目錄下的 hbase-env.sh 的最後添加 export HBASE_REGIONSERVER_OPTS="-Xmx16000m $HBASE_REGIONSERVER_OPTS」

其中 16000m 爲分配給 RegionServer 的內存大小。

寫數據的備份數

備份數與讀性能成正比,與寫性能成反比,且備份數影響高可用性。有兩種配置方式,一種是將 hdfs-site.xml 拷貝到 hbase conf 目錄下,而後在其中添加或修改配置項 dfs.replication 的值爲要設置的備份數,這種修改對全部的 HBase 用戶表都生效,另一種方式,是改寫 HBase 代碼,讓 HBase 支持針對列族設置備份數,在建立表時,設置列族備份數,默認爲 3,此種備份數只對設置的列族生效。

WAL(預寫日誌)

可設置開關,表示 HBase 在寫數據前用不用先寫日誌,默認是打開,關掉會提升性能,可是若是系統出現故障 (負責插入的 RegionServer 掛掉),數據可能會丟失。配置 WAL 在調用 Java API 寫入時,設置 Put 實例的 WAL,調用 Put.setWriteToWAL(boolean)

批量寫

HBase Put 支持單條插入,也支持批量插入,通常來講批量寫更快,節省來回的網絡開銷。在客戶端調用 Java API 時,先將批量的 Put 放入一個 Put 列表,而後調用 HTable Put(Put 列表) 函數來批量寫。

客戶端一次從服務器拉取的數量

經過配置一次拉去的較大的數據量能夠減小客戶端獲取數據的時間,可是它會佔用客戶端內存。有三個地方可進行配置:

1)在 HBase conf 配置文件中進行配置 hbase.client.scanner.caching

2)經過調用 HTable.setScannerCaching(int scannerCaching) 進行配置;

3)經過調用 Scan.setCaching(int caching) 進行配置。三者的優先級愈來愈高。

RegionServer 的請求處理 IO 線程數

較少的 IO 線程適用於處理單次請求內存消耗較高的 Big Put 場景 (大容量單次 Put 或設置了較大 cache Scan,均屬於 Big Put) ReigonServer 的內存比較緊張的場景。

較多的 IO 線程,適用於單次請求內存消耗低,TPS 要求 (每秒事務處理量 (TransactionPerSecond)) 很是高的場景。設置該值的時候,以監控內存爲主要參考。

hbase-site.xml 配置文件中配置項爲 hbase.regionserver.handler.count

Region 大小設置

配置項爲 hbase.hregion.max.filesize,所屬配置文件爲 hbase-site.xml.,默認大小 256M

在當前 ReigonServer 上單個 Reigon 的最大存儲空間,單個 Region 超過該值時,這個 Region 會被自動 split 成更小的 Region。小 Region split compaction 友好,由於拆分 Region compact Region 裏的 StoreFile 速度很快,內存佔用低。缺點是 split compaction 會很頻繁,特別是數量較多的小 Region 不停地 split, compaction,會致使集羣響應時間波動很大,Region 數量太多不只給管理上帶來麻煩,甚至會引起一些 Hbase bug。通常 512M 如下的都算小 Region。大 Region 則不太適合常常 split compaction,由於作一次 compact split 會產生較長時間的停頓,對應用的讀寫性能衝擊很是大。

此外,大 Region 意味着較大的 StoreFilecompaction 時對內存也是一個挑戰。若是你的應用場景中,某個時間點的訪問量較低,那麼在此時作 compact split,既能順利完成 split compaction,又能保證絕大多數時間平穩的讀寫性能。compaction 是沒法避免的,split 能夠從自動調整爲手動。只要經過將這個參數值調大到某個很難達到的值,好比 100G,就能夠間接禁用自動 split(RegionServer 不會對未到達 100G Region split)。再配合 RegionSplitter 這個工具,在須要 split 時,手動 split。手動 split 在靈活性和穩定性上比起自動 split 要高不少,並且管理成本增長很少,比較推薦 online 實時系統使用。內存方面,小 Region 在設置 memstore 的大小值上比較靈活,大 Region 則過大太小都不行,過大會致使 flush app IO wait 增高,太小則因 StoreFile 過多影響讀性能。

相關文章
相關標籤/搜索