用大白話講大資料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知識點的第一部分,老劉儘量用大白話講這些知識點講述出來了,如果還有疑問,可以聯絡公眾號:努力的老劉。
最後希望今天講的內容對大資料感興趣的同學有幫助,也希望能夠得到大家的批評和指點。覺得寫得還行的,給老劉點個贊!