小史是一個非科班的程序員,雖然學的是電子專業,但是通過自己的努力成功通過了面試,現在要開始迎接新生活了。
今天,小史的姐姐和呂老師一起過來看小史,一進屋,就有一股難聞的氣味。
可不,小史姐姐走進衛生間,發現地下一個盆子裡全是沒洗的襪子。
小史:當然不是,盆裡的襪子滿了,就先放到這個桶裡,然後再繼續裝,等到桶裡的襪子滿了,然後才放到洗衣機裡一次洗完,這樣不僅效率高,而且節省水電費。
小史洋洋得意地介紹起自己洗襪子的流程。
小史一聽就有點不高興,全世界都黑程序員,沒想到自己還沒變成程序員就被自家姐姐黑了。
說完就進自己房間,把姐姐和呂老師晾在外面。小史姐姐也意識到不該拿程序員開玩笑,但現在也不知道該怎麼辦,就看著呂老師。
呂老師走進小史的房間。
【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也是一樣的原理。
呂老師:假設員工工資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中不是內存爆炸了嗎?
具體如何運用,我們下回分解。
作者:channingbreeze
原文:轉載自公眾號,互聯網偵察,已獲作者授權
閱讀更多 Java識堂 的文章