HBase知識體系探究與整理

Web架構

業務日誌一般由Tomcat或Nginx生成(Tomcat業務日誌帶sessionid,Nginx不帶),而中大型互聯網公司的web架構一般由LVS(Linux虛擬服務器)+Keepalived+Nginx+Tomcat組成。由Nginx單獨掛載Tomcat,用Keepalived做主備,用戶基數多的還會在前面掛智能CDN。Nginx理論上可以併發連接五萬條請求,但實際上只有三萬左右。此時假如有五萬零一個或三萬零一個連接請求,我得等第一個連接響應完畢,於是就催生了LVS的需求,它相當於一個漏斗,默認也是五萬條,但它可以不斷的增加連接池,使負載加大。比如天貓商城在做活動、雙十一等都會用到LVS技術。

這裏寫圖片描述
LVS提供虛擬服務,nginx作爲反向代理服務器實現負載均衡,keepalived實現主從熱備,檢查RealServer的健康狀態及主備機之間的失效轉移。
VIP(Virtual IP)爲192.168.0.16,用戶只需要訪問這個IP地址即可獲得網頁服務:
負載均衡主機+備機->keepalived與Web服務器->realserver+nginx+tomcat


簡介

一般數據分析項目整體流程爲:web架構->平臺->數據庫->BI(報表)
根據BI來觀察PV(page view)頁面瀏覽量,進一步判斷做完推廣是否有成效,怎樣調整更有意義,一般前期較爲簡單,後續運維比較難。我們的平臺把統計結果存入數據庫(關係型|NoSQL型),前端再做報表展示。

  • HBase就是一種NoSQL,Google Bigtable的開源實現,提供高可靠性(有主備)、高性能(機器多)、面向列、可伸縮(可以動態增刪節點)的分佈式存儲系統。它可以提供存儲和處理服務,即存+計算,MapReduce運行在HBase(底層基於HDFS)上。
  • eg.Google Bigtable用GFS作爲其文件存儲系統,它用Hadoop HDFS作爲其文件存儲系統;
    Google運行MapReduce處理Bigtable的海量數據,它用Hadoop MapReduce處理HBase中的海量數據;
    Google Bigtable用Chubby作爲協同服務,它用Zookeeper作對應。
    注:Spark代碼簡單,性能遠超MapReduce。在大數據行業,技術更新換代非常快。

與傳統數據庫的對比
傳統數據庫遇到的問題:
①數據量很大時無法存儲;②無很好的備份機制;③數據達到一定量開始緩慢,數據很大時基本無法支撐。
HBase優勢:
①線性擴展,隨數據量增多可擴展節點;②數據存儲在HDFS上,備份機制健全;③通過zookeeper協調查找數據,訪問速度快。
HBase集羣中的角色:①HMaster,一個或多個主節點;②HRegionServer,多個從節點。

解析
我們通過my.ini文件的datadir屬性找到MySQL表文件的路徑,進入查看可發現數據庫就是文件夾,表就是文件,底層是Windows或Linux文件系統,MySQL無非就是做了解析和執行的軟件。HDFS是嵌在本地環境下的的分佈式文件系統,說白了就是把底下衆多硬盤串在一塊的軟件,和MySQL思想差不多。
而HBase列式思想,則把行式數據庫的列轉換成了行,同時如果列存儲了很多數據,它會幫我們做分塊並做索引,告訴我們從第0-5萬條記錄在哪一塊,從第5萬零一到十萬條記錄在哪一塊。
HBase類比MySQL,HDFS類比MySQL底下的文件系統。列式的不能做多表關聯,它只適合存海量數據。

我們再來探究下爲何催生了基於HDFS的HBase數據庫?
HDFS(分佈式文件系統)存文件時會追加到一個文件的尾部,只能保存整個文件。假如一個文件夾下有一百萬個小文件,每個小文件都是1KB,到底層存儲時(DataNode)不會佔用128M空間,但NameNode會被撐爆,元數據受不了。和HDFS差不多,它的架構也是主從,主HMaster、從HRegionServer。當一條條數據進來時,先緩存到HRegionServer的內存,達到128M時將整塊寫到HDFS,這樣一塊元數據只有一條。HDFS不能做數據存儲,只能做文件存儲,所以Hbase出現了。故當有一條條數據進來的場景時,就不要寫到HDFS了,而是寫到HBase集羣裏面。大表HBase+緩存層,同時元數據存到zookeeper,不存在master。
要注意master是不存元數據的(不存任何數據),它只是管理者,只管理幾個HRegionServer掛掉之後數據遷移和表的信息,不管數據信息。所以當集羣正常運行了,HMaster掛了沒影響,但NameNode掛了就不行。最後說下Hadoop1和2的區別:第一代產品有1個NameNode+多個DataNode,第二代產品有多個NameNode以解決Hadoop1的單點問題。NameNode 主備之間還有DFSZKFailoverController做管理。


HBase安裝

①確保用戶是hadoop,將安裝包上傳到/home/hadoop下;
②解壓:su – hadooptar –zxvf 安裝包
③重命名:mv hbase-version hbase;

安裝軟件爲什麼要重命名:升級新版本,環境變量不用重新配置

④修改環境變量:master:su – rootvim /etc/profile
添加內容:export HBASE_HOME=/home/hadoop/hbaseexport PATH=$PATH:$HBASE_HOME/bin
執行命令:source /etc/profilesu – hadoop
在其他機器上執行上述操作。
⑤修改配置文件:su – hadoop
將配置文件上傳到/home/hadoop/hbase/conf文件夾下。
配置文件的配置元素很多,沒配就用默認的。每個文件的解釋如下:

hbase-env.sh
export JAVA_HOME=/usr/jdk   //jdk安裝目錄
export HBASE_CLASSPATH=/home/hadoop/hadoop/conf   //hadoop配置文件的位置
export HBASE_MANAGES_ZK=true   #如果使用獨立安裝的zookeeper這個地方就是false

hbase-site.xml
<configuration>
  <property>
  <name>hbase.master</name>     #hbasemaster的主機和端口
  <value>master1:60000</value>
  </property>
  <property>
  <name>hbase.master.maxclockskew</name>    #時間同步允許的時間差
  <value>180000</value>
  </property>
  <property>
  <name>hbase.rootdir</name>
  <value>HDFS:// hadoop-cluster1/hbase</value>#hbase共享目錄,持久化hbase數據
  </property>
  <property>
  <name>hbase.cluster.distributed</name>  #是否分佈式運行,false即爲單機
  <value>true</value>
  </property>
  <property>
  <name>hbase.zookeeper.quorum</name>#zookeeper地址
  <value>slave1, slave2,slave3</value>
  </property>
  <property>
  <name>hbase.zookeeper.property.dataDir</name>#zookeeper配置信息快照的位置
  <value>/home/hadoop/hbase/tmp/zookeeper</value>
  </property>
</configuration>

Regionservers    //是從機器的域名
slave1
slave2
slave3

⑥.把hadoop的HDFS-site.xml和core-site.xml 放到hbase/conf下
cp /home/hadoop/hadoop/etc/hadoop/HDFS-site.xml /home/hadoop/hbase/conf
cp /home/hadoop/hadoop/etc/hadoop/core-site.xml /home/hadoop/hbase/conf
⑦發送到其他機器
su - hadoop
scp –r /home/hadoop/hbase hadoop@slave1:/home/hadoop
scp –r /home/hadoop/hbase hadoop@slave2:/home/hadoop
scp –r /home/hadoop/hbase hadoop@slave3:/home/hadoop
⑧啓動:su – hadoopstart-hbase.sh
⑨查看
進程:jps
進入hbase shell:hbase shell
退出hbase shell:quit
頁面:http://master:60010/


HBase原理

這裏寫圖片描述
簡單來說,HRegionServer、HRegion、HLog、Store、MemStore、StoreFile、HFile都是類。
比如MemStore可能是類裏面的某個Map或List集合,故用內存存儲數據;StoreFile是Stream裝好的路徑,擁有input流;HRegion相當於類中有個路徑,文件系統路徑(HLog)+內存版的集合(MemStore)+文件版的路徑(StoreFile)。HRegionServer通過HDFS API將文件寫到DataNode。

HBase讀慢寫快,讀是相對於寫的,還是比MySQL快。表分區,便於查詢,讀取速度快,多臺機器的IO得到充分利用。HRegionServer對數據有管理權限,表數據被封裝到HRegion上,HRegion讓表可以分佈在n個機器上,HLog只能追加不能修改,寫完之後,再寫到MemStore,若機器宕機了,內存數據會丟失,此時HLog日誌的作用就出來了,可防止數據丟失問題。當MemStore達到閾值,將數據寫到StoreFile,再寫到HFile,HFile用於存儲在HDFS,進行了序列化。

數據有版本號,對同一id數據進行插入,若HLog有冗餘數據(eg.有些數據被刪除),不會被合併。HLog一定會同步到HDFS,什麼時候寫,隔多長時間寫。如果在還沒同步到HDFS,硬盤掛了,那數據會丟失。查數據會幫我們把數據綁在一起,返回最新版本給用戶,當合並之後纔會查不到版本。很久以前的數據沒有版本,最近的數據有版本,就在於分塊是否被合併。

假如0到一萬條數據被分爲好幾個分塊到不同的DataNode管理,當出現四個分塊(每塊64MB)且對文件日誌做了追加後,數據冗餘因爲有一些刪除數據,讀完文件將所有數據進行一次合併,合併的過程中對增刪改查進行冗餘數據處理,並保留最近版本。合併後數據必然<256MB,當塊數據<256MB將原封不動寫回HDFS。繼續處理0到一萬條數據,當又有三個分塊達到64MB時,和原來的大塊(<256MB)進行合併(後>256MB),然後再分爲兩個塊(都>168MB),再分佈到不同的DataNode。
讀相對慢

HMaser分配數據管理權限,假如0到10萬被拆成兩塊,一塊五萬條
表拆分和合並,Region拆分合並
合:數據變小,且數據準確;
拆:數據越來越大,讀起來會變慢,拆成兩人管,數據讀起來變快。

Hmaster直接到HDFS API,當不涉及到表管理、表合併拆分時,HMaste掛掉沒事。 HRegionServer用來管理分區,一張表由多個Server管理,eg.A Server管理user表的前半部分,B Server管理了user表的後半部分,A Server又管理了admin表的前半部分,B Server管理admin表的後半部分。
數據拆分合並由數據大小觸發,運算量不大且不佔用HRegion的IO和網絡請求,它直接連到HRegionServer,把數據塊拆分給兩個DataNode管後,只要修改.META表的索引列表。eg.table1從a到k歸哪臺機器管,從k到n又歸哪臺機器管。查數據直接找ip,這個過程不影響HRegionServer性能,因爲他們之間沒有聯繫。
提升數據讀取和添加的性能:將垃圾數據清除+數據塊分給其他人管理
如果Server掛了,該.META表的IP,會把管理權限給別人。再把HLog交給別人。
一個HRegionServer的HRegion的類有多個,每個HRegion管理表的一部分,HRegion0管理user0,HRegion管理user1,…
Store類也有多個StoreFile和HFile,把n個小文件合併成大文件,最終寫入HDFS,寫的過程麻煩。

ZooKeeper–> -ROOT-(單Region)–> .META.–> 用戶表
-ROOT-
包含.META.表所在的Region列表,該表只會有一個Region;
Zookeeper中記錄了-ROOT-表的location。
.META.
包含所有的用戶空間Region列表,以及RegionServer的服務器地址。
這裏寫圖片描述

這裏寫圖片描述

寫數據時,通過zookeeper去找-ROOT-表,-ROOT-表(分表,數據(內存或文件))在某臺HRegionServer上。-ROOT-表裏邊,找到META表N,然後到META表裏,可以找到tableN再到具體的server的ip,client直接定位IP,連接查數據。所有的-ROOT-表和.META.表都在內存,讀的時候相對較慢,所以纔要合併拆分,讀的數據塊小,讀的時候就比較快。通過算法實現常查詢的數據緩存到內存,就更快了。


總結

數據寫流程:
①client通過Zookeeper定位該寫到哪臺HRegionServer;
②再向HRegionServer發送寫請求;
③HRegionServer將數據寫到HLog(write ahead log)——數據的持久化和恢復;
④寫完HLog之後,HRegionServer再將數據寫到內存MemStore;
⑤反饋client寫成功。
數據Flush過程:
①當MemStore數據達到閾值(默認是64M),將數據刷到硬盤,將內存中的數據刪除,同時刪除HLog中的歷史數據;
②將數據存儲到HDFS中;
③在HLog中做標記點。
數據合併過程:
①當數據塊達到4塊,HMaster將數據塊加載到本地,進行合併;
②當合並的數據>256MB,進行拆分,將拆分後的Region分配給不同的HRegionServer管理;
③當HRegionServer宕機後,將HRegionServer上的HLog拆分,然後分配給不同的HRegionServer加載,修改.META.;
④注意:HLog同步到HDFS。
HBase的讀流程:
①通過zookeeper和-ROOT-、.META.表定位HRegionServer;
②數據從內存和硬盤合併後返回給client;
③數據塊會緩存。
HMaster的職責:
①管理用戶對Table的增、刪、改、查操作;
②記錄Region在哪臺HregionServer上;
③在Region Split後,負責新Region的分配;
④新機器加入時,管理HRegionServer的負載均衡,調整Region分佈;
⑤在HRegionServer宕機後,負責失效HRegionServer 上的Regions遷移。
HRegionServer的職責:
①主要負責響應用戶I/O請求,向HDFS文件系統中讀寫數據,是HBase中最核心的模塊;
②管理了很多table的分區(Region)。
client職責:
HBase的Client使用HBase的RPC機制與HMaster和RegionServer進行通信。
管理類操作:Client與HMaster進行RPC;
數據讀寫類操作:Client與HRegionServer進行RPC。

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