㈠ hbase濡備綍鍏抽棴鑷鍔ㄥ悎騫朵笌鍘嬬緝
hbase濡備綍鍏抽棴鑷鍔ㄥ悎騫朵笌鍘嬬緝濡備笅錛
鍏抽棴鑷鍔ㄥ悎騫訛細瑕佸叧闂鑷鍔ㄥ悎騫訛紝闇瑕佷慨鏀笻Base鐨勯厤緗鏂囦歡錛坔base-site.xml錛夈傚湪鏂囦歡涓鎵懼埌hbase.hstore.merge.鏀跨瓥灞炴э紝騫跺皢鍏惰劇疆涓簄one銆傝繖鏍鳳紝HBase灝嗕笉鍐嶈嚜鍔ㄥ悎騫跺皬鏂囦歡銆傝鋒敞鎰忓ぇ甯︼紝鍏抽棴鑷鍔ㄥ悎騫跺彲鑳戒細瀵艱嚧HBase鐨凴egion鏁伴噺澧炲姞錛屽洜姝ゅ湪榪涜屾ゆ搷浣滀箣鍓嶏紝璇風『淇濅簡瑙f綔鍦ㄧ殑褰卞搷銆
鍏抽棴鑷鍔ㄥ帇緙╋細瑕佸叧闂鑷鍔ㄥ帇緙╋紝闇瑕佷慨鏀笻Base鐨勯厤緗鏂囦歡錛坔base-site.xml錛夈傚湪鏂囦歡涓鎵懼埌hbase.hstore.compress灞炴э紝騫跺皢鍏惰劇疆涓篺alse銆傝繖鏍鳳紝HBase灝嗕笉鍐嶅規暟鎹榪涜岃嚜鍔ㄥ帇緙┿傝鋒敞鎰忥紝媯闂峰叧闂鑷鍔ㄥ帇緙╁彲鑳戒細澧炲姞婊氭槬鑺︽暟鎹瀛樺偍鐨勫崰鐢ㄧ┖闂淬
㈡ HBase是什麼呢,都有哪些特點呢
Hbase是一種NoSQL資料庫,這意味著它不像傳統的RDBMS資料庫那樣支持SQL作為查詢語言。Hbase是一種分布式存儲的資料庫,技術上來講,它更像是分布式存儲而不是分布式資料庫,它缺少很多RDBMS系統的特性,比如列類型,輔助索引,觸發器,和高級查詢語言等待
那Hbase有什麼特性呢?如下:
強讀寫一致,但是不是「最終一致性」的數據存儲,這使得它非常適合高速的計算聚合
自動分片,通過Region分散在集群中,當行數增長的時候,Region也會自動的切分和再分配
自動的故障轉移
Hadoop/HDFS集成,和HDFS開箱即用,不用太麻煩的銜接
豐富的「簡潔,高效」API,Thrift/REST API,Java API
塊緩存,布隆過濾器,可以高效的列查詢優化
操作管理,Hbase提供了內置的web界面來操作,還可以監控JMX指標
什麼時候用Hbase?
Hbase不適合解決所有的問題:
首先資料庫量要足夠多,如果有十億及百億行數據,那麼Hbase是一個很好的選項,如果只有幾百萬行甚至不到的數據量,RDBMS是一個很好的選擇。因為數據量小的話,真正能工作的機器量少,剩餘的機器都處於空閑的狀態
其次,如果你不需要輔助索引,靜態類型的列,事務等特性,一個已經用RDBMS的系統想要切換到Hbase,則需要重新設計系統。
最後,保證硬體資源足夠,每個HDFS集群在少於5個節點的時候,都不能表現的很好。因為HDFS默認的復制數量是3,再加上一個NameNode。
Hbase在單機環境也能運行,但是請在開發環境的時候使用。
內部應用
存儲業務數據:車輛GPS信息,司機點位信息,用戶操作信息,設備訪問信息。。。
存儲日誌數據:架構監控數據(登錄日誌,中間件訪問日誌,推送日誌,簡訊郵件發送記錄。。。),業務操作日誌信息
存儲業務附件:UDFS系統存儲圖像,視頻,文檔等附件信息
不過在公司使用的時候,一般不使用原生的Hbase API,使用原生的API會導致訪問不可監控,影響系統穩定性,以致於版本升級的不可控。
HFile
HFile是Hbase在HDFS中存儲數據的格式,它包含多層的索引,這樣在Hbase檢索數據的時候就不用完全的載入整個文件。索引的大小(keys的大小,數據量的大小)影響block的大小,在大數據集的情況下,block的大小設置為每個RegionServer 1GB也是常見的。
探討資料庫的數據存儲方式,其實就是探討數據如何在磁碟上進行有效的組織。因為我們通常以如何高效讀取和消費數據為目的,而不是數據存儲本身。
Hfile生成方式
起初,HFile中並沒有任何Block,數據還存在於MemStore中。
Flush發生時,創建HFile Writer,第一個空的Data Block出現,初始化後的Data Block中為Header部分預留了空間,Header部分用來存放一個Data Block的元數據信息。
而後,位於MemStore中的KeyValues被一個個append到位於內存中的第一個Data Block中:
註:如果配置了Data Block Encoding,則會在Append KeyValue的時候進行同步編碼,編碼後的數據不再是單純的KeyValue模式。Data Block Encoding是HBase為了降低KeyValue結構性膨脹而提供的內部編碼機制。
㈢ hbase鐨勪綔鐢
HBase 鏄鍏稿瀷鐨 NoSQL 鏁版嵁搴擄紝閫氬父琚鎻忚堪鎴愮█鐤忕殑銆佸垎甯冨紡鐨勩佹寔涔呭寲鐨勶紝鐢辮岄敭銆佸垪閿鍜屾椂闂存埑榪涜岀儲寮曠殑澶氱淮鏈夊簭鏄犲皠鏁版嵁搴擄紝涓昏佺敤鏉ュ瓨鍌ㄩ潪緇撴瀯鍖栧拰鍗婄粨鏋勫寲鐨勬暟鎹銆傚洜涓 HBase 鍩轟簬 Hadoop 鐨 HDFS 瀹屾垚鍒嗗竷寮忓瓨鍌錛屼互鍙 MapRece 瀹屾垚鍒嗗竷寮騫惰岃$畻錛屾墍浠ュ畠鐨勪竴浜涚壒鐐逛笌 Hadoop 鐩稿悓錛屼緷闈犳í鍚戞墿灞曪紝閫氳繃涓嶆柇澧炲姞鎬т環姣旈珮鐨勫晢涓氭湇鍔″櫒鏉ュ炲姞璁$畻鍜屽瓨鍌ㄨ兘鍔涖
HBase 鉶界劧鍩轟簬 Bigtable 鐨勫紑婧愬疄鐜幫紝浣嗗畠浠涔嬮棿榪樻槸鏈夊緢澶氬樊鍒鐨勶紝Bigtable 緇忓父琚鎻忚堪鎴愰敭鍊兼暟鎹搴擄紝鑰 HBase 鍒欐槸闈㈠悜鍒楀瓨鍌ㄧ殑鍒嗗竷寮忔暟鎹搴銆
涓嬮潰浠嬬粛 HBase 鍏峰囩殑鏄捐憲鐗規э紝榪欎簺鐗規ц HBase 鎴愪負褰撳墠鍜屾湭鏉ユ渶瀹炵敤鐨勬暟鎹搴撲箣涓銆
瀹歸噺宸ㄥぇ
HBase 鐨勫崟琛ㄥ彲浠ユ湁鐧句嚎琛屻佺櫨涓囧垪錛屽彲鍝鎼轟互鍦ㄦí鍚戝拰綰靛悜涓や釜緇村害鎻掑叆鏁版嵁錛屽叿鏈夊緢澶х殑寮規с
褰鍏崇郴鍨嬫暟鎹搴鐨勫崟涓琛ㄧ殑璁板綍鍦ㄤ嚎綰ф椂錛屾煡璇㈠拰鍐欏叆鐨勬ц兘閮戒細鍛堢幇鎸囨暟綰т笅闄嶏紝榪欑嶅簽澶х殑鏁版嵁閲忓逛紶緇熸暟鎹搴撴潵璇存槸涓縐嶇伨闅撅紝鑰 HBase 鍦ㄩ檺瀹氭煇涓鍒楃殑鎯呭喌涓嬪逛簬鍗曡〃瀛樺偍鐧句嚎鐢氳嚦鏇村氱殑鏁版嵁閮芥病鏈夋ц兘闂棰樸
HBase 閲囩敤 LSM 鏍戜綔涓哄唴閮ㄦ暟鎹瀛樺偍緇撴瀯錛岃繖縐嶇粨鏋勪細鍛ㄦ湡鎬у湴灝嗚緝灝忔枃浠跺悎騫舵垚澶ф枃浠訛紝浠ュ噺灝戝圭佺洏鐨勮塊棶銆
鎵╁睍鎬у己
HBase 宸ヤ綔鍦 HDFS 涔嬩笂錛岀悊鎵褰撶劧鍦版敮鎸佸垎甯冨紡琛錛屼篃緇ф壙浜 HDFS 鐨勫彲鎵╁睍鎬с侶Base 鐨勬墿灞曟槸妯鍚戠殑錛屾í鍚戞潕鎱т紡鎵╁睍鏄鎸囧湪鎵╁睍鏃朵笉闇瑕佹彁鍗囨湇鍔″櫒鏈韜紕ф瘉鐨勬ц兘錛屽彧闇娣誨姞鏈嶅姟鍣ㄥ埌鐜版湁闆嗙兢鍗沖彲銆
HBase 琛ㄦ牴鎹 Region 澶у皬榪涜屽垎鍖猴紝鍒嗗埆瀛樺湪闆嗙兢涓涓嶅悓鐨勮妭鐐逛笂錛屽綋娣誨姞鏂扮殑鑺傜偣鏃訛紝闆嗙兢灝遍噸鏂拌皟鏁達紝鍦ㄦ柊鐨勮妭鐐瑰惎鍔 HBase 鏈嶅姟鍣錛屽姩鎬佸湴瀹炵幇鎵╁睍銆傝繖閲岄渶瑕佹寚鍑猴紝HBase 鐨勬墿灞曟槸鐑鎵╁睍錛屽嵆鍦ㄤ笉鍋滄㈢幇鏈夋湇鍔$殑鍓嶆彁涓嬶紝鍙浠ラ殢鏃舵坊鍔犳垨鑰呭噺灝戣妭鐐廣
楂樺彲闈犳
HBase 榪愯屽湪 HDFS 涓婏紝HDFS 鐨勫氬壇鏈瀛樺偍鍙浠ヨ╁畠鍦ㄥ瞼鐜版晠闅滄椂鑷鍔ㄦ仮澶嶏紝鍚屾椂 HBase 鍐呴儴涔熸彁渚 WAL 鍜 Replication 鏈哄埗銆
WAL錛圵rite-Ahead-Log錛夐勫啓鏃ュ織鏄鍦 HBase 鏈嶅姟鍣ㄥ勭悊鏁版嵁鎻掑叆鍜屽垹闄ょ殑榪囩▼涓鐢ㄦ潵璁板綍鎿嶄綔鍐呭圭殑鏃ュ織錛屼繚璇佷簡鏁版嵁鍐欏叆鏃朵笉浼氬洜闆嗙兢寮傚父鑰屽艱嚧鍐欏叆鏁版嵁鐨勪涪澶憋紱鑰 Replication 鏈哄埗鏄鍩轟簬鏃ュ織鎿嶄綔鏉ュ仛鏁版嵁鍚屾ョ殑銆
㈣ HBase存儲架構
上圖是HBase的存儲架構圖。
由上圖可以知道,客戶端是通過Zookeeper找到HMaster,然後再與具體的Hregionserver進行溝通讀寫數據的。
具體到物理實現,細節包括以下這些:
首先要清楚HBase在hdfs中的存儲路徑,以及各個目錄的作用。在hbase-site.xml 文件中,配置項 <name> hbase.rootdir</name> 默認 「/hbase」,就是hbase在hdfs中的存儲根路徑。以下是hbase0.96版本的個路徑作用。1.0以後的版本請參考這里: https://blog.bcmeng.com/post/hbase-hdfs.html
1、 /hbase/.archive
HBase 在做 Split或者 compact 操作完成之後,會將 HFile 移到.archive 目錄中,然後將之前的 hfile 刪除掉,該目錄由 HMaster 上的一個定時任務定期去清理。
2、 /hbase/.corrupt
存儲HBase損壞的日誌文件,一般都是為空的。
3、 /hbase/.hbck
HBase 運維過程中偶爾蔽升會遇到元數據不一致的情況,這時候會用到提供的 hbck 工具去修復,修復過程中會使用該目錄作為臨時過度緩沖。
4、 /hbase/logs
HBase 是支持 WAL(Write Ahead Log) 的,HBase 會在第一次啟動之初會給每一台 RegionServer 在.log 下創建一個目錄,若客戶端如果開啟WAL 模式,會先將數據寫入一份到.log 下,當 RegionServer crash 或者目錄達到一定大小,會開啟 replay 模式,類似 MySQL 的 binlog。
5、 /hbase/oldlogs
當.logs 文件夾中的 HLog 沒用之後會 move 到.oldlogs 中,HMaster 會定期去清理。
6、 /hbase/.snapshot
hbase若開啟了 snapshot 功能之後,對某一個用戶表建立一個 snapshot 之後,snapshot 都存儲在該目錄下,如對表test 做了一個 名為sp_test 的snapshot,就會在/hbase/.snapshot/目錄下創建一個sp_test 文件夾,snapshot 之後的所有寫入都是記錄在這個 snapshot 之上。
7、 /hbase/.tmp
當對表做創建或者刪除操作的時候,會將表move 到該 tmp 目錄下,然後再去做處理操作。
8、 /hbase/hbase.id
它是一個文件,存儲集群唯一的 cluster id 號,是一個 uuid。
9、 /hbase/hbase.version
同樣也是一宏拿老個文件,存儲集群的版本號,貌似是加密的,看不到,只能通過web-ui 才能正確顯示出來
10、 -ROOT-
該表是一張的HBase表,只是它存儲的是.META.表的信息。通過HFile文件的解析腳本 hbase org.apache.hadoop.hbase.io.hfile.HFile -e -p -f 可以查看其存儲的內容,如下所示:
以上可以看出,-ROOT-表記錄的.META.表的所在機器是dchbase2,與web界面看到的一致:
11、 .META.
通過以上表能找到.META.表的信息,該表也是一張hbase表,通過以上命令,解析其中一個region:
以敏神上可以看出,adt_app_channel表的數據記錄在dchbase3這台reginserver上,也與界面一致,如果有多個region,則會在表名後面加上rowkey的范圍:
通過以上描述,只要找到-ROOT-表的信息,就能根據rowkey找到對應的數據,那-ROOT-在哪裡找呢?從本文一開始的圖中可以知道,就是在zookeeper中找的。進入zookeeper命令行界面:
可以看出-ROOT-表存儲在 dchbase3 機器中,對應界面如下:
以上就是HBase客戶端根據指定的rowkey從zookeeper開始找到對應的數據的過程。
那在Region下HBase是如何存儲數據的呢?
以下就具體操作一張表,查詢對應的HFile文件,看HBase的數據存儲過程。
在HBase創建一張表 test7,並插入一些數據,如下命令:
查看wal日誌,通過 hbase org.apache.hadoop.hbase.regionserver.wal.HLog --mp -p 命令可以解析HLog文件,內容如下:
查看HFile文件,內容如下:
由此可見,HFile文件就是存儲HBase的KV對,其中Key的各個欄位包含了的信息如下:
由於hbase把cf和column都存儲在HFile中,所以在設計的時候,這兩個欄位應該盡量短,以減少存儲空間。
但刪除一條記錄的時候,HBase會怎麼操作呢?執行以下命令:
刪除了rowkey為200的記錄,查看hdfs,原來的HFile並沒有改變,而是生成了一個新的HFile,內容如下:
所以在HBase中,刪除一條記錄並不是修改HFile裡面的內容,而是寫新的文件,待HBase做合並的時候,把這些文件合並成一個HFile,用時間比較新的文件覆蓋舊的文件。HBase這樣做的根本原因是,HDFS不支持修改文件。