hbase hdfs外部表_硬核干货长文!Hbase来了解一下不?
本文公眾號來源:互聯網偵察 ? 作者:channingbreeze
最近我也在入門大數據相關的基礎,這篇文章非常通俗易懂講解了什么是Hbase,推薦閱讀!
等我學所成,我也來寫寫大數據相關的入門知識。
今天,小史的姐姐和呂老師一起過來看小史,一進屋,就有一股難聞的氣味。
可不,小史姐姐走進衛生間,發現地下一個盆子里全是沒洗的襪子。
小史:當然不是,盆里的襪子滿了,就先放到這個桶里,然后再繼續裝,等到桶里的襪子滿了,然后才放到洗衣機里一次洗完,這樣不僅效率高,而且節省水電費。
小史洋洋得意地介紹起自己洗襪子的流程。
小史一聽就有點不高興,全世界都黑程序員,沒想到自己還沒變成程序員就被自家姐姐黑了。
說完就進自己房間,把姐姐和呂老師晾在外面。小史姐姐也意識到不該拿程序員開玩笑,但現在也不知道該怎么辦,就看著呂老師。
呂老師走進小史的房間。
【hbase是啥】
小史:別吹了,構建在hdfs上除了能存儲海量數據之外,缺點一大堆,上次你給我介紹的hdfs缺點我可沒忘啊,不支持小文件,不支持并發寫,不支持文件隨機修改,查詢效率也低。
小史仔細回憶起hdfs來。
呂老師:hdfs確實有很多缺點,但是hbase卻是一個支持百萬級別高并發寫入,支持實時查詢,適合存儲稀疏數據的分布式數據庫系統。
呂老師:hbase主要用于大數據領域,在這方面,確實比mysql要厲害得多啊,它和mysql的存儲方式就完全不一樣。mysql是行式存儲,hbase是列式存儲。
【列式存儲】
呂老師:沒錯,這就是行式存儲系統存儲稀疏數據的問題,我們再來看看列式存儲如何解決這個問題,它的存儲結構是這樣的
小史:這個我看懂了,相當于把每一行的每一列拆開,然后通過rowkey關聯起來,rowkey相同的這些數據其實就是原來的一行。
呂老師:你這里只說到了一個好處,由于把一行數據變成了這樣的key-value的形式,所以hbase可以存儲上百萬列,又由于hbase基于hdfs來存儲,所以hbase可以存儲上億行,是一個真正的海量數據庫。
呂老師:這就是hbase的威力呀,還不只如此,其實很多時候,我們做select查詢的時候,只關注某幾列,比如我現在只關心大家的工資,傳統的按行存儲,要選出所有人的工資是怎么辦的呢?
小史:哦,我大概明白了,原來是這樣,所以hbase的查詢效率也很高,但是我有個問題啊,如果我就要查我的所有信息,這是一行數據,hbase查詢起來是不是反而更慢了呢?
【列簇】
呂老師:列簇,顧名思義,就是把一些列放在一起咯,在hbase中,會把列簇中的列存儲在一起,比如我們把和工作相關的salary和job都放在work這個列簇下,那么大概是這樣的
小史:哦,我明白了,這樣的話,一個列簇中的列會被一次就拿出來,如果我要查所有列的信息的話,把所有信息都放在一個列簇就好了。
(注意:hbase中,其實所有列都是在列簇中,定義表的時候就需要指定列簇。生產環境由于性能考慮和數據均衡考慮,一般只會用一個列簇,最多兩個列簇)
【rowkey設計】
(注:當然,有些中間件把sql翻譯成hbase的查詢規則,從而支持了sql查hbase,不在本文討論范圍內)
小史:啊?這和我想象的不一樣啊,如果我想查詢工資比20w多的記錄,在mysql中,只要用一條很簡單的sql就行啊,這在hbase中怎么查呢?
呂老師:在hbase中,你需要把要查詢的字段巧妙地設置在rowkey中,一個rowkey你可以理解為一個字符串,而hbase就是根據rowkey來建立索引的
不熟悉B+樹的同學可以看這篇文章。hbase的HFile底層也是一樣的原理。
呂老師:假設員工工資9999w封頂,查詢的時候可能根據員工工資查詢,也可能根據名字查詢一個特定的員工,那么rowkey就可以這樣設計
(注意,以上rowkey是簡化版設計,只是為了講清楚范圍查詢。實際使用中由于rowkey需要考慮散列性,所以可能不會這么用。后文會具體探討散列性。)
呂老師:hbase提供了三種查詢方式。
第一種是全表掃描,scan
第二種是根據一個rowkey進行查詢
第三種是根據rowkey過濾的范圍查詢
比如你要查工資不少于20w的記錄,就可以用范圍查詢,查出從startRow=0020到stopRow=9999的所有記錄,這是hbase直接支持的一種查詢方式哦。
呂老師:這里要注意幾點,首先,rowkey是按照字符串字典序來組織成B+樹的,所以數字的話需要補齊,不然的話會出現123w小于20w的情況,但是補齊的話,你就會發現020w小于123w
小史:哦,明白了,這都很好理解,因為rowkey是字符串形式,所以肯定是按照字符串順序排序咯。而且rowkey有點類似于mysql中的主鍵吧,所以保證其唯一性也是可以理解的。還有就是因為每個key-value都包含rowkey,所以rowkey越短,越能節省存儲空間。
(注意,如果rowkey復雜且查詢條件復雜,hbase還針對rowkey提供了自定義Filter,所以只要數據在rowkey中有體現,能解析,就能根據自己的條件進行查詢)
小史:但是呂老師,我有一個問題啊,之前說過hdfs不適合存儲小文件,而hbase中的一條記錄只有一點點數據,記錄條數卻很多,屬于海量小文件,存在hdfs中不是內存爆炸了嗎?
【LSM三層存儲模型】
小史:哦,這就像把盆里的襪子放到桶里一樣。但是呂老師,如果數據量大的話,時間一長,就會有很多次刷寫,不就形成了很多個小文件嗎?這豈不又是海量小文件了?
不記得hdfs原理的同學可以溫習一下,【生活現場】從生日請客到hdfs工作原理解析
呂老師:對了,hbase也是使用同樣的思想,其實這就是WAL預寫日志的思想,hbase也會將數據的操作先寫日志,然后存到內存,哪天機器掛了,內存丟了,還能從WAL日志中將數據恢復。
【數據修改】
小史:不過呂老師,我還有問題啊,我記得hdfs是不能隨機修改文件的,只能追加,那么hbase里的數據是不是寫了之后就不能改也不能刪除呢?
呂老師:刪除同樣是追加一條版本最新的記錄,只不過標記這個數據被刪除而已,查詢的時候,看到版本最新的記錄是數據刪除,就知道這個數據被刪了。
呂老師:哈,小史,你思考得非常深入,還記得LSM的第三層嗎,hbase會在合并的時候,將這些用不到的記錄刪除掉,節省存儲空間。
呂老師:不全對,其實hbase把合并分為兩種,一種是小合并minor compact,這種方式只會將少數文件進行簡單合并,不會進行數據的清理,還有一種是大合并major compact,這種方式會將大部分文件進行合并,并且清理數據。
呂老師:基本正確,但是你要知道,如果數據量大,這個過程是非常耗性能的,一般在生產環境都禁止大合并,否則在正常服務的時候突然來個大合并,整個集群可能資源被耗光,沒法正常服務。
【hbase架構】
小史:hbase的架構似乎也是master-slave架構,和hdfs有點像,HMaster是用來管理集群,HRegionServer是真正存儲數據的地方吧?
呂老師:啊,這塊不太對,hbase在數據查詢和寫入的時候,其實并不是像hdfs那樣詢問HMaster。在hbase中,每一張表都會有元信息,這些信息也是被存儲為hbase表,稱為元信息表,也叫meta表,這是一種系統表。
小史:但是這又有個問題,既然meta表也是存儲在hbase上,那么hbase又如何知道meta表存在哪個HRegionServer上呢?這豈不是一個雞生蛋蛋生雞的問題?
呂老師:小史啊,我說meta表是hbase表,是指meta表也是用rowkey和value的鍵值存儲,但是我并沒有說meta表在hbase上啊。其實meta表不是存儲在HRegionServer上,而是存儲在那個分布式協調服務zookeeper上面。
小史:哦,原來如此,所以meta表其實是在一個固定地方讀取,然后根據meta表就知道數據在哪個HRegionServer上。但是zookeeper又是啥呢?
呂老師:其實HMaster的任務相對不繁重,但是卻比較重要,它主要是通過調整和管理Region分布來實現HRegionServer的負載均衡。
【HRegionServer架構】
呂老師:其實Region是hbase在rowkey上的切分,每個Region都可以通過startKey和endKey來確定rowkey的范圍,一個HRegionServer上可能會有多個Region。
小史:所以說數據是根據rowkey和一定的哈希規則,分散到不同的Region上面,而Region又是屬于某一個HRegionServer上的,這個關系沒錯吧?
呂老師:沒錯,通過這里其實可以得出rowkey設計的另一個原則,就是散列性,rowkey的頭幾個字母,最好不要是一樣的,不然會分布在同一個HRegionServer上面,導致這個HRegionServer的負載非常高,累死累活,其他HRegionServer卻沒事干。一般可以根據一定規則算一個數據的摘要,比如md5,把md5的頭幾位拼在rowkey的前面。
呂老師:哈哈,名詞沒講過,原理可都是講過的喲。比如這個Store,我們之前說過,一個列簇中的列是存儲在一起的,對應到這里,一個列簇中的數據就是存到一個Store中。
呂老師:沒錯,這里StoreFile只是一個名字,它是以HFile的格式存儲在hdfs上,HFile是一個存儲格式,在新版本的HFile存儲格式中,它就是一個類似B+樹的索引索引形式。
【讀取和寫入流程】
1、hbase client要寫輸入了,先從zookeeper中拿到meta表信息,根據數據的rowkey找到應該往哪個RegionServer寫
2、然后hbase會將數據寫入對應RegionServer的內存MemStore中,同時記錄操作日志WAL
3、當MemStore超過一定閾值,就會將內存MemStore中的數據刷寫到硬盤上,形成StoreFile
4、在觸發了一定條件的時候,小的StoreFile會進行合并,變成大的StoreFile,有利于hdfs存儲
呂老師:其實當大量rowkey相近的數據都被分配到一個Region中,導致這個Region數據過大的時候,Region進行拆分,HMaster會對拆分后的Region重新分配RegionServer,這是HMaster的負載均衡策略。
1、hbase client要讀數據了,先從zookeeper中拿到meta表信息,根據要查的rowkey找到對應的數據在哪些RegionServer上
2、分別在這些RegionServer上根據列簇進行StoreFile和MemStore的查找,得到很多key-value結構的數據
3、根據數據的版本找到最新數據進行返回
【OLTP和OLAP】
呂老師:OLTP應用叫聯機事務處理應用,就是類似銀行轉賬等業務的,這類應用對事務要求比較高,而OLAP應用叫聯機分析處理應用,比如推薦系統,是在收集了大量用戶行為后進行分析,再得出結論的應用,主要側重分析,對事務要求非常低。
【筆記】
小史把這次學習到的hbase的知識記了下來
1、hbase是列式存儲,和mysql的行式存儲不一樣
2、hbase中有列簇概念,同一個列簇下的列存儲在一起,在Region的一個StoreFile中
3、hbase是按照rowkey進行查找,要查詢的字段要想辦法放到rowkey中
4、hbase內部使用LSM三層模型進行存儲,數據先寫到內存MemStore中,內存達到一定閾值再刷寫到硬盤StoreFile中,再滿足一定條件時,小的StoreFile會合并為大的StoreFile
5、hbase適合OLAP類的應用
學完hbase,記完筆記,小史開開心心地洗襪子去了。
推薦閱讀:
程序員的快樂就是這么樸素無華且枯燥
互聯網/電商/廣告常見的術語
拿到一臺新的Windows電腦,我會做什么?
在公司做的項目和自己在學校做的有什么區別
長按掃碼可關注獲取?
歡迎關注點個再看
總結
以上是生活随笔為你收集整理的hbase hdfs外部表_硬核干货长文!Hbase来了解一下不?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux操作系统桌面应用与管理第2版,
- 下一篇: 民生付 php,“民生付”升级我省电商支