1. 程式人生 > >hbase的學習和心得

hbase的學習和心得

Habse的應用和理解

  1. 下載安裝包,配置環境變數就不用說了。
  2. 看一下如何配置HBASE。 1.介紹一下HBASE,HBASE是一個基於HDFS的儲存的,面向列的,開源的,分散式的,高可用,高效能,可伸縮,nosql(非結構化的)資料庫。hive提供資料計算,zookeeper提供了穩定的服務,和failover的機制,Sqoop提供了結構化資料向HBASE匯入功能。 HBASE中沒有列的感念,有列族感念,有一個唯一標示一行的叫rowkey(行鍵),這個不允許重複,這也是每一行固定的一個欄位,rowkey不用定義。每一行的列族可以建立多個鍵值對,上一行和下一行的鍵值對可以不一樣多,鍵值對修改的時候可以儲存多個版本(預設是一個),一行內部按照key排序,行與行按照rowkey排序,HBASE裡面沒有資料型別,裡面存的是位元組。

配置HBASE

1.需要zookeeper,HDFS。
	配置hbase-env.sh
	配置java_home,選用自己zookeeper,Hadoop叢集如果是高可用的話,還要天劍hadoop_home。
	配置hbase-stie.xml
	<configuration>
            <!-- 指定hbase在HDFS上儲存的路徑 -->
    <property>
            <name>hbase.rootdir</name>
            <value>hdfs://gec-hadoop-master:9000/hbase</value>
    </property>
            <!-- 指定hbase是分散式的 -->
    <property>
            <name>hbase.cluster.distributed</name>
            <value>true</value>
    </property>
            <!-- 指定zk的地址,多個用“,”分割 -->
    <property>
            <name>hbase.zookeeper.quorum</name>
            <value>tourbis:2181,dfs-node02:2181,dfs-node03:2181</value>
    </property>
配置regionserver根據自己的資源。regionserver可以隨便放。

啟動hbase

整體啟動   start-hbase.sh
啟動命令列   hbase shell

整體介紹hbase的執行機制

hbase是一張很大的表,資料都儲存在hdfs上,hbase有一個伺服器,如果只有一臺的話,無數個客戶端訪問是不是忙不過來,所以就要分散式啊,這也就是為什麼他是一個額分散式的資料庫!!!!他的表會根據rowkey被切開(這叫region),有很多個regionserver(伺服器),分別負責不同的region。還有很多客戶端,客戶端傳送過來一個請求,regionserver會去hdfs找資料,hbase的元資料是儲存在zookeeper上的,這樣就能保證所有regionserver都是同步的,然後給返回結果。但是客戶端發過來的請求給誰呢?有那麼多regionserver,因為客戶發過來的請求會有具體的rowkey,列族什麼的,每個伺服器都負責不同的region,所以肯定會去負責包含你的資料的伺服器查詢。但是客戶端怎麼知道誰負責我這部分資料呢?我是帶有明確rowkey但是有那麼多rowkey我要一個一個找嗎?不可能吧,所以客戶端是不會直接跟regionserver溝通的!!!!
regionserver的工作內容很清楚,我只負責去hdfs上找我自己的資料,找什麼資料你不需要告訴我,因為我只負責我管理的region,那麼誰知道每個regionserver負責那些region呢?這裡面還有一個系統表,叫meta表,他記錄著每個region存放在那臺regionserver上,但是呢?這個meta表在哪裡啊,既然這樣,我客服端傳送一個請求,我直接找mate表就好了,他告訴我我要找的資料在那臺regionserver上,我直接去就好了啊。剛好zookeeper就是管理這個元資料表的(zookeeper知識記錄,不是存這張表,zookeeper不能存很大的東西!!!)
第一步:客戶先找zookeeper,在zookeeper上查詢這個meta表在哪臺regionserver上。
第二步:去這個表中查詢該region的索引資訊,在那個regionserver,
第三步:去具體的伺服器就好了。
這個meta表存了所有使用者表的位置資訊。
那麼又有一個問題了,我為什麼要讓zookeeper記錄我的meta表位置呢,我直接跟存了這張meta表的伺服器對話就好啊,幹嘛要這麼麻煩呢?但是還有一個問題,你怎麼知道這張meta表的伺服器掛了沒有,萬一他掛了呢?又有人說,我可以讓他傳送心跳,監聽他的存活狀態嗎?那麼你這就不是在說你需要zookeeper嗎?讓regionserver去監聽嗎?他有那麼多功能嗎?他又要查資料,又要監聽,這不就是單點故障碼?!!!,萬一掛了zookeeper的failover機制是不是啟動了,給你換一臺伺服器存meta表就可以了吧,這樣就非常可靠了。
萬一regionserver掛掉一臺,那負責他這一臺的資料不就丟失了嗎?不會的,它裡面有一個叫Hmaster的角色,這個角色回去監聽zookeeper的,那臺掛掉了,Hmaster就會把他負責的這部分資料,分給新的就OK。萬一Hmaster掛了呢,沒關係,Hmaster可以啟動多臺,一個active其它的全部是standby(這不就是HA嗎,東西都是相通的啊!!!!!!!!!!!!!!!!)。隨便掛都沒問題。資料是存在hdfs的,所以可以存很多,還可以動態擴容。
存在hdfs的資料,查詢起來會很慢的,但是呢hbase不一樣,他有自己的內部格式,不像hdfs一樣,會把資料分成block塊,分別存在不同的dataNode上,大體上是這樣的一個形式:/hbase/庫目錄/表目錄/region0/ 列族1/檔案
						/列族2/檔案
				/region1/
				region2/
是這樣把大表分成不同的region然後,不同的regionsever負責不同的region,region裡面又有不同的列族,再多的客戶端,其實訪問的不是同一個檔案(補充:某些時候就要大量查相同的東西,那麼負責這個region的伺服器是不是就要日了狗了,肯定會受不了吧,怎麼解決呢???不是說過了嗎?有快取,在記憶體中啊,我還希望你多查這些相同的資料呢,如果你還要追問要是很多很多,記憶體會不會爆,那你就把記憶體放大一點嘛,合併的週期縮短一點嘛?要是還想追問呢?那你他媽這不就是在擡槓嗎!!,槓精嗎!!),所以在hbase上查東西來說已經很快了。但是畢竟是在hdfs上查啊!!
相對來說不會很慢,但是跟MySQL相比呢,完全滿足不了那種MySQL一樣的實時效果。但是他有一個快取,這個是在記憶體裡面的,你操作一次,他不會立刻操作hdfs上的檔案,因為hdfs上的檔案是很難改變的,他是一個檔案,要在後面或中間新增東西,刪除東西,幾乎不可能,因為太慢了,快取就可以記錄下,這也稱為熱資料,然後下次你要用的時候直接走快取,這不就跟MySQL的速度一樣了嗎!!!(大概這樣理解),有快取不就很容易丟失嗎???當然不會,他會在hdfs上打日誌,萬一伺服器掛掉,快取就沒了,還有日誌啊,Hmaster會根據日誌恢復快取的資料。一直放快取裡面也不合適吧,這不就是很佔記憶體嗎?他可以設定多久把快取的資料跟原來的檔案合併起來,刪除掉原來的。儲存最新的,檔案不是不好操作嗎,但是容易合併啊。
還有要注意的是Hmaster跟regionserver沒有關係,他只是負責監聽zookeeper,查詢資料是regionserver的事情,跟他沒有半毛錢的關係,master掛掉,regionserver照樣可以工作,但是就是不能保證,資料不會丟,因為伺服器隨時會掛掉啊,短暫是可以沒有master的。這樣把各個角色的任務分開來,就會使得效能更高。
重點:regionserver不存任何資料,他只是一個工作者,幫使用者去找東西。負責region的管理的。

手動敲一下黑板!!!! 這只是我初學者的理解,當然有很多東西說的也許是不準確的,只是我沒有發現他是錯的,某一天等我發現了,再回來修改,希望對大家有幫助,有錯誤的地方懇求大佬指出來。後面還會繼續更新如何操作,等大資料的技術 看完不給個讚的,我半夜就來扒你家窗戶!!!!!