1. 程式人生 > 實用技巧 >用大白話講大資料HBase,老劉真的很用心(1)

用大白話講大資料HBase,老劉真的很用心(1)

老劉今天覆習HBase知識發現很多資料都沒有把概念說清楚,有很多專業名詞一筆帶過沒有解釋。比如這個框架高效能、高可用,那什麼是高效能高可用?怎麼實現的高效能高可用?沒說!

如果面試官聽了你說的,會有什麼反應?我的感覺就是你說的東西都是別人的,沒有自己的理解。所以老劉才會寫用大白話講大資料這個系列,就是爭取把東西講清楚,講明白!如果覺得老劉寫得不錯,給老劉點個贊吧!

01 HBase知識點

第1點:HBase的定義

官網畫紅框中直接就說,HBase是一個分散式、可擴充套件的大資料儲存Hadoop資料庫。試想下,你是面試官,別人這樣回答你,你會不會滿意?老劉覺得學的東西要用自己的話講出來,才是真正的掌握。

在老劉看來,HBase,即Hadoop database,即Hadoop資料庫。它的資料通常儲存在HDFS上,HDFS為HBase提供了高可靠性的底層儲存的支援;利用Hadoop MapReduce來處理HBase中的海量資料,為HBase提供了高效能的計算能力;利用ZooKeeper為HBase提供了穩定的服務。

根據上述所說,就可以總結為HBase是一個建立在HDFS之上,具有高可靠、高效能、可擴充套件、支援海量資料儲存的分散式資料庫。

一般是在儲存資料比較大的時候,並且對讀寫效能要求比較高的時候,才會用到HBase資料庫。

那你們知道什麼是讀寫效能比較高嗎?那就是讀的比較快、寫的也比較快的時候,才是讀寫效能比較高!

第2點:HBase的特點

1)極易擴充套件

HBase底層依賴HDFS,當磁碟空間不足的時候,我們只需要動態增加DataNode節點就可以了。當然也可以通過增加伺服器來對叢集的儲存進行擴容。

2)海量儲存

可以儲存大批量的資料。在儲存海量資料的前提下,能在幾十到百毫秒內返回資料。這點和HBase的極易擴充套件性非常相關。正因為HBase良好的擴充套件性,才為海量資料的儲存提供了便利。

3)列式儲存(這裡一定要搞清楚列式儲存和行式儲存的區別)

這裡的列式儲存其實說的是列族儲存,HBase是根據列族來儲存資料的。列族下面可以有非常多的列,列族在建立表的時候就必須要指定了。

4)稀疏

稀疏主要是針對HBase列的靈活性,在列族中,你可以指定任意多的列,在列資料為空的情況下,是不會佔用儲存空間的。

5)資料型別單一

它所有的資料都是以位元組陣列進行儲存。

第3點:HBase表的資料模型

先給出一張HBase的設計表,根據這張表進行介紹表的結構。

rowkey行鍵

1)它是表(table)的主鍵,table中的記錄按照rowkey的字典序進行排序,這裡就必須要說說什麼是字典序?

有多機構的資料就是一筆帶過,一點也不負責,讓人非常不爽。老劉就不得不去搜搜字典序排序的相關知識。

通俗地講,字典序排序大概就是兩個作比較的內容從第一個字母開始比較,按照ASCII碼錶比較大小,小的放在前面,第一個相同就比較下一個,都相同且一個比較完了,則短的排在前面。

常見ASCII碼的大小規則:0~9<A~Z<a~z

2)rowkey行鍵它可以是任意的字串,其中它的最大長度是 64KB,實際應用中長度一般為 10-100bytes。

Column Family列族

1)HBase表中的每個列,都歸屬於某個列族。

2)列族是表的schema的一部分(而列不是),即建表時至少指定一個列族。

3)比如我們建立user表,包含info、data兩個列族,程式碼就為create 'user', 'info', 'data'。Column列列肯定是表的某一個列族下的一個列,用列族名:列名錶示,比如`info`列族下的`name`列,就表示為`info:name`。

Cell單元格

如上圖,我們通過指定rowkey行鍵、列族、列,就可以確定的一個Cell單元格。在Cell中的資料是沒有任何型別的,全部都是以位元組陣列的形式進行儲存的。

Timestamp時間戳

這個說的就是可以對錶中的Cell多次賦值,每次賦值操作時的時間戳timestamp,可看成Cell值的版本號version number。也就是一個Cell可以有多個版本的值的意思。

第4點:HBase架構

從圖中可以看出,這是一個非常典型的主從架構。

下面詳細說下各個元件:

Client客戶端

Client它是操作HBase叢集的入口,利用Client,在通過RPC與HMaster進行通訊,可以完成表的增、刪、改操作。也可以通過RPC與RegionServer通訊,完成讀寫表資料的操作。

一般我們可以利用HBase shell或者Java API進行程式設計,完成上述表的操作。

ZooKeeper叢集

ZooKeeper是什麼有什麼用,老劉已經在ZooKeeper框架那篇文章中詳細講解了,大家可以去看看。那它在HBase叢集中的作用,就非常明顯了,① 它實現了HMaster的高可用,多HMaster間進行主備選舉。② 儲存了HBase的元資料資訊meta表。③ 對HMaster和HRegionServer各個節點進行監控。

HMaster

HBase叢集也是主從架構,HMaster是主角色,是叢集的老大,主要負責管理表和Region。

那它管理表和Region做一些什麼呢?

1)管理Client對錶的增刪改的一些操作;

2)管理Region的操作就會比管理Client多一點。當Region分裂後,負責新Region分配到指定的HRegionServer上;當HRegionServer宕機後,負責其上的region的遷移;以及管理HRegionServer之間的負載均衡

那大家有沒有了解負載均衡,什麼是負載均衡?

舉個例子,一個網站最開始建立的時候,它的訪問量比較小,但當它的流量變得特別大的時候,併發量就變得特別大了,網站就會出現訪問延遲的一些現象。這個時候呢,就需要用到負載均衡了。以前這個網站是一個單一伺服器,現在就可以配置多個伺服器叢集,那樣就可以把訪問流量分發到叢集中的不同伺服器上,這樣就大大減少了單一伺服器上的壓力,也就是負載均衡想要做的事。

HRegionServer

它是HBase叢集中從角色,是叢集中的小弟。它主要負責響應客戶端的讀寫資料請求,以及負責管理一系列的Region。

Region

它是HBase叢集中分散式儲存的最小單元,一個Region對應一個Table表的部分資料。簡單理解就是表儲存在HBase中,並且都是以Region為單位進行儲存。

第5點:HBase shell命令

說一些常用的基礎操作命令:

建立user表,包含info、data兩個列族
create 'user', 'info', 'data'

使用put命令向user表中插入資訊,row key為rk0001,列族info中新增名為name的列,值為zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'

獲取user表中row key為rk0001的所有資訊(即所有cell的資料)
get 'user', 'rk0001'
獲取user表中row key為rk0001,info列族的所有資訊
get 'user', 'rk0001', 'info'

更新資料操作 將user表的f1列族版本數改為5
alter 'user', NAME => 'info', VERSIONS => 5

刪除資料以及刪除表操作
刪除user表row key為rk0001,列標示符為info:name的資料
delete 'user', 'rk0001', 'info:name'

清空表資料
truncate 'user'

刪除表
首先需要先讓該表為disable狀態,使用命令:
disable 'user'
然後使用drop命令刪除這個表
drop 'user'
注意:如果直接drop表,會報錯:Drop the named table. Table must first be disabled

再說一下HBase的高階操作命令:

顯示伺服器狀態
status 'node01'

顯示HBase當前使用者
whoami

顯示當前所有的表
list

統計指定表的記錄數
count 'user' 

檢查表是否存在,適用於表量特別多的情況
exists 'user'

檢查表是否啟用或禁用
is_enabled 'user'
is_disabled 'user'

禁用一張表/啟用一張表
disable 'user'
enable 'user'

刪除一張表,記得在刪除表之前必須先禁用
drop

上述都是HBase shell命令的內容,還有用JAVA API進行表操作的內容,但是這部分老劉就不講解了,有需要的話,可以聯絡老劉,我會分享給你。

02 HBase總結

今天是HBase知識點的第一部分,老劉儘量用大白話講這些知識點講述出來了,如果還有疑問,可以聯絡公眾號:努力的老劉。

最後希望今天講的內容對大資料感興趣的同學有幫助,也希望能夠得到大家的批評和指點。覺得寫得還行的,給老劉點個贊!