Review HBase

hbase 的安裝部署

1、軟件包上傳解壓
2、 配置hbase.env.sh
配置java_home
使用外部zookeeper(自己獨立安裝的zookeeper)
3、配置 hbase-site.xml
見講義
hbase.zookeeper.property.dataDir必須是zookeeper存儲數據的路徑
4、修改regionservers
5、創建backup-masters
6、拷貝core-site.xml hdfs-site.xml到hbase的conf目錄下
7、安裝包分發到所有節點
8、配置環境變量
9、啓動hbase
前提:1
hadoop集羣必須啓動,並保證集羣正常
zookeeper集羣必須啓動,並保證集羣正常
啓動hbase

 

HBase的基本介紹

Hbase 是建立在hdfs之上的一個數據庫,不支持join等SQL複雜操作.支持的數據類型:byte[],依靠橫向擴展
一個表可以有上十億行,上百萬列。
面向列(族)的存儲和權限控制
對於爲空(null)的列,並不佔用存儲空間,是一個稀疏表。

稀疏的理解

                        

                                      

HBASE的適用場景

海量數據、精確查詢、快速返回
海量數據:指的是數據量的背景
精確查詢:業務場景
快速返回:是業務對時效性的要求

 

Hbase和Hadoop之間的關係

HDFS
海量數據存儲,適合一次性掃描大量數據。
適合一次寫入多次讀取
不適合頻繁更新的數據
HBASE
不適合一次性掃描大量數據。適用一次掃描少量數據。
適合多次寫入多次讀取
habse
支持數據更新
支持刪除數據

 

Hbase與RDBMS的關係

RDBMS
支持SQL查詢
支持事務
支持Join
HBASE
不支持SQL查詢
不支持事務
不 支持Join


Hbase特徵簡要說明

1、 海量存儲
Hbase適合存儲PB級別的海量數據,在幾十到百毫秒內返回數據。
2、列式存儲
這裏的列式存儲其實說的是列族存儲
列族理論上可以很多,但實際上建議不要超過6個
3、 極易擴展
處理能力(RegionServer)的擴展,一個是基於存儲的擴展(HDFS)
hbase在最初設計的時候就考慮了擴展性。
4、高併發
這裏說的高併發,主要是在併發的情況下,Hbase的單個IO延遲下降並不多
5、稀疏
在列數據爲空的情況下,是不會佔用存儲空間的。
 

hbase的基礎架構

1、Client
2 ZOOKEEPER
3 Master 管理者
4 Regionserver 工作者

 

HBase的底層原理

詳細架構

Client:
訪問數據的入口,包含訪問hbase的API接口,維護着一些cache來加快對hbase的訪問
Zookeeper:
1 zookeeper的選舉機制保證任何時候,集羣中只有一個master
2 實時監控Region Server的狀態,將Region server的上線和下線信息實時通知給Master
3 存儲Hbase的schema,
4 存貯所有Region的尋址入口
Master職責
1 爲Region server分配region
2 負責region server的負載均衡
3 發現失效的region server並重新分配其上的region
4 處理schema更新請求
說明:Hmaster短時間下線,hbase集羣依然可用,長時間不行。
Region server的作用
1、 Region server維護Master分配給它的region,處理對這些region的IO請求
2、Region server負責切分在運行過程中變得過大的region

 

HBase的表數據模型

Row Key

最大長度是 64KB,完全可以自行設計。Hbase會對錶中的數據按照rowkey排序(字典序) row的設計是最有技術含量的工作

 

列族Column Family

列族是表的schema的一部分,而列不是。(schema包含表名和列族)
每個列都所屬於某一個列族。一個列族可以包含多個列。一個列族與列的關係是一對多。

 

列 Column

列族下面的具體列。

 

時間戳

標記一個數據的不同版本
時間戳可以由hbase(在數據寫入時自動 )賦值,hbase支持工程師自己定義時間戳。
每個 cell中,不同版本的數據按照時間倒序排序

                             

hbase本身提供數據回收機制

1、保存數據的最後n個版本

2、保存最近一段時間內的版本

 

Cell存儲數據的最小單位

如何確定一個精確的數據
由{row key, column( = + ), version} 唯一確定的單元

 

VersionNum

數據的版本號,默認值爲系統時間戳。

 

hbase物理存儲

整體結構

一個regionserver內部可以有多個region,這多個region可能來自多個表或一個表。一個region只能屬於一個 regionserver.

 

region的切分

region按大小分割的(默認10G)。每個表一開始只有一個region,隨着數據的增加,一個region逐漸變大,達到
10G,進行分裂,等分成兩個region.
Hregion是Hbase中分佈式存儲和負載均衡的最小單元
HRegion由一個或者多個Store組成,每個store保存一個column family。每個Strore又由一個memStore和0至多個
StoreFile組成

             

Memstore與storefile

一個region由多個store組成,每個store包含一個列族的所有數據 Store包括位於內存的memstore和位於硬盤的
storefile
客戶端檢索數據時,先在memstore找,找不到再找storefile


HLog(WAL log)

每個Region Server維護一個Hlog,而不是每個Region一個.
Hlog的切分機制
1、當數據寫入hlog以後,hbase發生異常。關閉當前的hlog文件
2、當日志的大小達到HDFS數據塊的0.95倍的時候,關閉當前日誌,生成新的日誌
3、每隔一小時生成一個新的日誌文件

 

讀寫過程

讀請求過程

前提:什麼是meta表?
meta表述hbase系統自帶的一個表。裏面存儲了hbase用戶表的元信息。
元信息爲:meta表內記錄一行數據是用戶表一個region的start key 到endkey的範圍。
meta表存在什麼地方?
meta表存儲在regionserver裏。 具體存儲在哪個regionserver裏?zookeeper知道。

 

1 到zookeeper詢問meta表在哪
2 到meta所在的節點(regionserver)讀取meta表的數據
3 找到region 獲取region和regionserver的對應關係,直接到regionserver讀取region數據

 

寫請求過程

1、Client先訪問zookeeper,找到Meta表,並獲取Meta表元數據。確定當前將要寫入的數據所對應的HRegion和
HRegionServer服務器。
2、Client向該HRegionServer服務器發起寫入數據請求。
2.1 Client先把數據寫入到HLog,以防止數據丟失。 2.2 然後將數據寫入到Memstore。
3、Memstore達到閾值,會把Memstore中的數據flush到Storefile中
4、當Storefile越來越多,達到一定數量時,會觸發Compact合併操作,將多個小文件合併成一個大文件。
5、Storefile越來越大,Region也會越來越大,達到閾值後,會觸發Split操作,變成兩個文件。
說明:hbasez 支持數據修改(僞修改),實際上是相同rowkey數據的添加。hbase只顯示最後一次的添加。

 

region的管理

region的分配過程
前提:一個region只能分配給一個region server
1、master記錄了當前有哪些可用的region server。以及當前哪些region分配給了哪些region server,哪些region還
沒有分配。
2、當需要分配的新的region,並且有一個region server上有可用空間時,master就給這個region server發送一個裝
載請求,把region分配給這個region server。
3、region server得到請求後,就開始對此region提供服務。

region server上線

前提:master使用zookeeper來跟蹤region server狀態。
1、當某個region server啓動時,首先在zookeeper上的/hbase/rs目錄下建立代表自己的znode。
2、 master訂閱了/hbase/rs目錄上的變更消息,當/hbase/rs目錄下的文件出現新增或刪除操作時,master可以得
到來自zookeeper的實時通知。因此一旦region server上線,master能馬上得到消息。

region server下線

前提:master使用zookeeper來跟蹤region server狀態。
1、當region server下線時,它和zookeeper的會話斷開。
2、zookeeper而自動釋放代表這臺server的文件上的獨佔鎖(znode)
3、zookeeper將變化發送給master
4、master 將掛掉的region server的region分配給其它還活着的regionserver。

Hmaster的上線

前提:hbase集羣中可以設置多個Hmaster,真正對外提供服務的只有一個
1 從zookeeper上獲取唯一 一個代表active master的鎖,用來阻止其它master成爲真正的master。
2 掃描zookeeper上的/hbase/rs節點,獲得當前可用的region server列表。
3 master和每個region server通信,獲得當前已分配的region和region server的對應關係。
4 master掃描.META.表,計算得到當前還未分配的region,將他們放入待分配region列表。
問題一: 如何確定哪個master是真正的master
看誰獲得到了active master的鎖
問題二: master如何知道有哪些regionserver,
掃描zookeeper上的/hbase/rs節點
問題三:master 如何知道region與regionserver之間的對應關係
master和每個region server通信,regionserver反饋對應關係
問題四:master如何知道哪些region還未分配
master掃描.META.表,計算得到當前還未分配的region

Hmaster下線

master只維護表和region的元數據,不參與表數據IO的過程,所以master下線短時間內對整個hbase集羣沒有影 響。

表的數據讀寫還可以正常進行。

Hmaster下線後的影響:

無法創建刪除表,無法修改表的schema,無法進行region的負載均衡,無法處理region 上下線,無法進行region的
合併(region的split可以正常進行)
當hmaster下線後,啓動Zookeeper的選舉機制,選出新的Hmaster,新的Hmaster上線,執行上線流程。

 

HBase三個重要機制

1、flush機制

hbase.regionserver.global.memstore.size: 默認;堆大小的40%

regionServer的全局memstore的大小(多個CF的memstore-多個region),超過該大小會觸發flush到磁盤的操 作,會阻塞客戶端讀寫

flush將所有的memstore全部flush.

hbase不建議配置過多列族:過多的列族會消耗大量的內存,同時數據在flush時消耗磁盤IO.

一個regionserver續寫操作可用堆內存的80%,讀取佔用40% ,寫入佔用40%。這兩個參數直接影響hbase讀寫性 能。

 

什麼時候觸發flush

hbase.hregion.memstore.flush.size:默認:128M(單個region裏memstore的緩存大小)
hbase.regionserver.optionalcacheflushinterval: 默認:1h
hbase.regionserver.global.memstore.size.lower.limit: 默認:堆大小 0.95倍
hbase.hregion.preclose.flush.size:默認爲:5M 提前進行flush.(先flush一小部分,等後面數據達到閾值在flush後
面的數據) 好處:比一次flush效率高

 

什麼時候觸發合併

hbase.hstore.compactionThreshold: 默認:3個 (flush文件的數量超過3個進行合併)

2、compact機制

默認3個

小的storeFile文件達到三個,合併成大的Storefile文件。

3、split機制

默認一個HFile達到10Gb的時候就會進行切分

 

hbase預分區

與分區的好處(優點):
* 增加數據讀寫效率 : 數據分佈在多臺regionserver節點
* 負載均衡,防止數據傾斜 : 當數據時離散的發送時,預分區可以解決數據傾斜
* 方便集羣容災調度region : 分佈在多個節點便於調度
* 優化Map數量 :
原本數據分區(分region)的過程:
一個數據表原本只有一個region(分區),隨着數據量的增加,region慢慢變大,達到10G ,一個region變成兩個
region。當數據量還沒有達到10G ,所有的數據全部寫入一個region。一個region只能屬於一個regionserver.
如何優化?方案: 將一個10G的數據打散,儘量多的,儘量均勻的分散到不同的regionserver上。
如何實現上述方案:預分區(region) 預先設置每個region 的startkey和endkey
命令分區:
create 'staff','info','partition1',SPLITS => ['1000','2000','3000','4000']
API 也可以 創建分區


 

HBase的rowKey設計技巧

rowKey屬性,最大64K,按照字典序排序,可以自定義
hbase數據的獲取方式
1、通過rowkey直接查找
2、通過startkey endkey 範圍查找
3、全表掃描

1 rowkey長度原則

最大64K,建議越短越好(在保證業務需求的前提下),不要超過16個字節.

2 rowkey散列原則

建議將rowkey的高位(左邊)作爲散列字段, 低位(右邊)放時間字段,這樣將提高數據均衡分佈在每個
RegionServer,以實現負載均衡的機率。
若不按照此原則:
讓時間戳作爲高位: 數據將按照時間的順序進行存儲。
熱點問題:當有一點時間業務數據爆炸增長時,這個階段的數據將存儲在少數的節點上。
熱點爲題如何解決?????

3 rowkey唯一原則

必須在設計上保證其唯一性,將經常讀取的數據存儲到一塊,將最近可能會被訪問的數據放到一塊。

熱點問題如何解決?????

原則:將分散的數據,放在rowkey的高位
1、哈希(隨機數),將哈希值放在高位
2、反轉:反轉固定長度或者數字格式的數據(時間戳反轉、手機號反轉,訂單號反轉)
3、加鹽:本質時是加隨機數,並且放在高位。

比較運算符

/ > 大於 GREATER
< 小於: LESS
/ >= 大於等於 GREATER_OR_EQUAL
<= 小於等於 LESS_OR_EQUAL
== 等於 EQUAL
!= 不等於 NOT_EQUAL
排除所有 NO_OP
 

Hbase過濾器

BinaryComparator 按字節索引順序比較指定字節數組,採用Bytes.compareTo(byte[])
BinaryPrefixComparator 跟前面相同,只是比較左端的數據是否相同
SubstringComparator 判斷提供的子串是否出現在value中。
NullComparator 判斷給定的是否爲空
BitComparator 按位比較
RegexStringComparator 提供一個正則的比較器,僅支持 EQUAL 和非EQUAL

過濾器

行過濾器RowFilter

RowFilter rowFilter=new RowFilter(GREATER_OR_EQUAL,new BinaryComparator("0005".getBytes()));

 列族過濾器FamilyFilter


FamilyFilter familyFilter=new FamilyFilter(LESS,new BinaryComparator("f2".getBytes()));


列名過濾器


QualifierFilter qualifierFilter=new QualifierFilter(NOT_EQUAL,new SubstringComparator("name"));


列值過濾器ValueFilter


ValueFilter valueFilter=new ValueFilter(EQUAL,new SubstringComparator("8"));

 

單列過濾SingleColumnValueFilte

SingleColumnValueFilter singleColumnValueFilter=new
SingleColumnValueFilter("f1".getBytes(),"name".getBytes(),EQUAL,"劉備".getBytes());

 

rowkey前綴過濾器PrefixFilte

PrefixFilter prefixFilter = new PrefixFilter("00".getBytes());

 

多過濾器綜合查詢FilterList

FilterList filterList = new FilterList();
filterList.addFilter(singleColumnValueFilter);
filterList.addFilter(prefixFilter);
scan.setFilter(filterList);


刪除數據

刪除一行數據

刪除表

HbaseMR

需求:在hbase數據庫myuser表中讀取部分數據寫入hbase數據庫myuser2表中
用MR實現數據
用Map讀取myuser
用reduce寫入myuser2
最後寫驅動類

 

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