01.21 「漫畫」從洗襪子到hbase存儲原理解析(上篇)

「漫畫」從洗襪子到hbase存儲原理解析(上篇)

小史是一個非科班的程序員,雖然學的是電子專業,但是通過自己的努力成功通過了面試,現在要開始迎接新生活了。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


今天,小史的姐姐和呂老師一起過來看小史,一進屋,就有一股難聞的氣味。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


可不,小史姐姐走進衛生間,發現地下一個盆子裡全是沒洗的襪子。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史:當然不是,盆裡的襪子滿了,就先放到這個桶裡,然後再繼續裝,等到桶裡的襪子滿了,然後才放到洗衣機裡一次洗完,這樣不僅效率高,而且節省水電費。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史洋洋得意地介紹起自己洗襪子的流程。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史一聽就有點不高興,全世界都黑程序員,沒想到自己還沒變成程序員就被自家姐姐黑了。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


說完就進自己房間,把姐姐和呂老師晾在外面。小史姐姐也意識到不該拿程序員開玩笑,但現在也不知道該怎麼辦,就看著呂老師。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師走進小史的房間。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


【hbase是啥】


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史:別吹了,構建在hdfs上除了能存儲海量數據之外,缺點一大堆,上次你給我介紹的hdfs缺點我可沒忘啊,不支持小文件,不支持併發寫,不支持文件隨機修改,查詢效率也低。

小史仔細回憶起hdfs來。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:hdfs確實有很多缺點,但是hbase卻是一個支持百萬級別高併發寫入,支持實時查詢,適合存儲稀疏數據的分佈式數據庫系統。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:hbase主要用於大數據領域,在這方面,確實比mysql要厲害得多啊,它和mysql的存儲方式就完全不一樣。mysql是行式存儲,hbase是列式存儲。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


【列式存儲】


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:沒錯,這就是行式存儲系統存儲稀疏數據的問題,我們再來看看列式存儲如何解決這個問題,它的存儲結構是這樣的


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史:這個我看懂了,相當於把每一行的每一列拆開,然後通過rowkey關聯起來,rowkey相同的這些數據其實就是原來的一行。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:你這裡只說到了一個好處,由於把一行數據變成了這樣的key-value的形式,所以hbase可以存儲上百萬列,又由於hbase基於hdfs來存儲,所以hbase可以存儲上億行,是一個真正的海量數據庫。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:這就是hbase的威力呀,還不只如此,其實很多時候,我們做select查詢的時候,只關注某幾列,比如我現在只關心大家的工資,傳統的按行存儲,要選出所有人的工資是怎麼辦的呢?


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)



「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史:哦,我大概明白了,原來是這樣,所以hbase的查詢效率也很高,但是我有個問題啊,如果我就要查我的所有信息,這是一行數據,hbase查詢起來是不是反而更慢了呢?


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


【列簇】


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:列簇,顧名思義,就是把一些列放在一起咯,在hbase中,會把列簇中的列存儲在一起,比如我們把和工作相關的salary和job都放在work這個列簇下,那麼大概是這樣的


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史:哦,我明白了,這樣的話,一個列簇中的列會被一次就拿出來,如果我要查所有列的信息的話,把所有信息都放在一個列簇就好了。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


(注意:hbase中,其實所有列都是在列簇中,如果不指定,就在一個默認列簇中。生產環境由於性能考慮和數據均衡考慮,一般只會用一個列簇,最多兩個列簇)

【rowkey設計】


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


(注:當然,有些中間件把sql翻譯成hbase的查詢規則,從而支持了sql查hbase,不在本文討論範圍內)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史:啊?這和我想象的不一樣啊,如果我想查詢工資比20w多的記錄,在mysql中,只要用一條很簡單的sql就行啊,這在hbase中怎麼查呢?


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:在hbase中,你需要把要查詢的字段巧妙地設置在rowkey中,一個rowkey你可以理解為一個字符串,而hbase就是根據rowkey來建立索引的


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


不熟悉B+樹的同學可以看這篇文章。hbase也是一樣的原理。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:假設員工工資9999w封頂,查詢的時候可能根據員工工資查詢,也可能根據名字查詢一個特定的員工,那麼rowkey就可以這樣設計


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


(注意,以上rowkey是簡化版設計,只是為了講清楚範圍查詢。實際使用中由於rowkey需要考慮散列性,所以可能不會這麼用。後文會具體探討散列性。)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:hbase提供了三種查詢方式。

第一種是全表掃描,scan

第二種是根據一個rowkey進行查詢

第三種是根據rowkey過濾的範圍查詢

比如你要查工資不少於20w的記錄,就可以用範圍查詢,查出從startRow=0020到stopRow=9999的所有記錄,這是hbase直接支持的一種查詢方式哦。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


呂老師:這裡要注意幾點,首先,rowkey是按照字符串字典序來組織成B+樹的,所以數字的話需要補齊,不然的話會出現123w小於20w的情況,但是補齊的話,你就會發現020w小於123w


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史:哦,明白了,這都很好理解,因為rowkey是字符串形式,所以肯定是按照字符串順序排序咯。而且rowkey有點類似於mysql中的主鍵吧,所以保證其唯一性也是可以理解的。還有就是因為每個key-value都包含rowkey,所以rowkey越短,越能節省存儲空間。


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


(注意,如果rowkey複雜且查詢條件複雜,hbase還針對rowkey提供了自定義Filter,所以只要數據在rowkey中有體現,能解析,就能根據自己的條件進行查詢)


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


小史:但是呂老師,我有一個問題啊,之前說過hdfs不適合存儲小文件,而hbase中的一條記錄只有一點點數據,記錄條數卻很多,屬於海量小文件,存在hdfs中不是內存爆炸了嗎?


「漫畫」從洗襪子到hbase存儲原理解析(上篇)


具體如何運用,我們下回分解。

作者:channingbreeze
原文:轉載自公眾號,互聯網偵察,已獲作者授權


分享到:


相關文章: