這篇文章給大家介紹為什么不建議在HBase中使用過(guò)多的列族,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
在尚志等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,尚志網(wǎng)站建設(shè)費(fèi)用合理。
我們知道,一張 HBase 表包含一個(gè)或多個(gè)列族。HBase 的官方文檔中關(guān)于 HBase 表的列族的個(gè)數(shù)有兩處描述:A typical schema has between 1 and 3 column families per table. HBase tables should not be designed to mimic RDBMS tables. 以及 HBase currently does not do well with anything above two or three column families so keep the number of column families in your schema low.
上面兩句話其實(shí)都是說(shuō)一件事,HBase 中每張表的列族個(gè)數(shù)建議設(shè)在1~3之間。其實(shí),HBase 支持的列族個(gè)數(shù)并沒(méi)有限制,但為什么文檔建議在1~3之間呢?我將從幾個(gè)方面來(lái)闡述這么做的原因。
在 HBase 中,調(diào)用 API 往對(duì)應(yīng)的表插入數(shù)據(jù)是會(huì)寫到 MemStore 的,而 MemStore 是一種內(nèi)存結(jié)構(gòu),每個(gè)列族對(duì)應(yīng)一個(gè) MemStore(和零個(gè)或多個(gè) HFile)。如果我們的表有兩個(gè)列族,那么相應(yīng)的 Region 中存在兩個(gè) MemStore,如下圖:
從上圖可以看出,越多的列族,將會(huì)導(dǎo)致內(nèi)存中存在越多的 MemStore;而儲(chǔ)存在 MemStore 中的數(shù)據(jù)在滿足一定條件的時(shí)候?qū)?huì)進(jìn)行 Flush 操作;每次 Flush 的時(shí)候,每個(gè) MemStore 將在磁盤生產(chǎn)一個(gè) HFile 文件,如下:
這樣會(huì)導(dǎo)致越多的列族最終持久化到磁盤的 HFile 越多。更要命的是,當(dāng)前 Flush 操作是 Region 級(jí)別的,也就是說(shuō), Region 中某個(gè) MemStore 被 Flush,同一個(gè) Region 的其他 MemStore 也會(huì)進(jìn)行 Flush 操作。當(dāng)表有很多列族,而且列族之間數(shù)據(jù)不均勻,比如一個(gè)列族有100W行,一個(gè)列族只有10行,這樣會(huì)導(dǎo)致持久化到磁盤的文件數(shù)很多,同時(shí)有很多小文件,而且每次 Flush 操作也涉及到一定的 IO 操作。
我們知道,當(dāng) HBase 表中某個(gè) Region 過(guò)大(比如大于 hbase.hregion.max.filesize 配置的大小。當(dāng)然,Region 分裂并不是說(shuō)整個(gè) Region 大小加起來(lái)大于 hbase.hregion.max.filesize 就拆分,而是說(shuō) Region 中某個(gè)最大的 Store/HFile/storeFile 大于 hbase.hregion.max.filesize 才會(huì)觸發(fā) Region 拆分的),會(huì)被拆分成兩個(gè)。如果我們有很多個(gè)列族,而這些列族之間的數(shù)據(jù)量相差懸殊,比如有些列族有 100W 行,而有些列族只有10行,這樣在 Region Split 的時(shí)候會(huì)導(dǎo)致原本數(shù)據(jù)量很小的 HFile 文件進(jìn)一步被拆分,從而產(chǎn)生更多的小文件。注意,Region Split 是針對(duì)所有的列族進(jìn)行的,這樣做的目的是同一行的數(shù)據(jù)即使在 Split 后也是存在同一個(gè) Region 的。
與 Flush 操作一樣,目前 HBase 的 Compaction 操作也是 Region 級(jí)別的,過(guò)多的列族也會(huì)產(chǎn)生不必要的 IO。
我們知道,HDFS 其實(shí)對(duì)一個(gè)目錄下的文件數(shù)有限制的(dfs.namenode.fs-limits.max-directory-items)。如果我們有 N 個(gè)列族,M 個(gè) Region,那么我們持久化到 HDFS 至少會(huì)產(chǎn)生 NM 個(gè)文件;而每個(gè)列族對(duì)應(yīng)底層的 HFile 文件往往不止一個(gè),我們假設(shè)為 K 個(gè),那么最終表在 HDFS 目錄下的文件數(shù)將是 NM*K,這可能會(huì)操作 HDFS 的限制。
前面說(shuō)了,一個(gè)列族在 RegionServer 中對(duì)應(yīng)于一個(gè) MemStore。而 HBase 從 0.90.1 版本開始引入了 MSLAB(Memstore-Local Allocation Buffers,參考HBASE-3455),這個(gè)功能默認(rèn)是開啟的(通過(guò)hbase.hregion.memstore.mslab.enabled),這使得每個(gè) MemStore 在內(nèi)存占用了 2MB (通過(guò)hbase.hregion.memstore.mslab.chunksize 配置)的 buffer。如果我們有很多的列族,那么光 MemStore 的緩存就會(huì)占用很多的內(nèi)存。
在設(shè)置列族之前,我們最好想想,有沒(méi)有必要將不同的列放到不同的列族里面。如果沒(méi)有必要最好放一個(gè)列族。如果真要設(shè)置多個(gè)列族,但是其中一些列族相對(duì)于其他列族數(shù)據(jù)量相差非常懸殊,比如1000W相比100行,是不是考慮用另外一張表來(lái)存儲(chǔ)相對(duì)小的列族。
關(guān)于為什么不建議在HBase中使用過(guò)多的列族就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
新聞名稱:為什么不建議在HBase中使用過(guò)多的列族
鏈接地址:http://sd-ha.com/article32/ipdgpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、電子商務(wù)、網(wǎng)站改版、建站公司、微信小程序、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)