Change Dir

          先知cd——熱愛(ài)生活是一切藝術(shù)的開始

          統(tǒng)計(jì)

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個(gè)公司技術(shù)

          我的鏈接

          淘寶技術(shù)

          閱讀排行榜

          評(píng)論排行榜

          HBase一些tip

          1,row是有序的,可以看做RDBMS的一級(jí)索引

          2,一個(gè)列簇CF的所有列存儲(chǔ)在一個(gè)HFile里

          3,CF要在建表時(shí)定義,少變化,更不要建太多

          4,version和timestamp是對(duì)應(yīng)的,每個(gè)cell有不同的版本,就說(shuō)明是在不同的timestamp存儲(chǔ)的,如果重復(fù)的timestamp,那么就說(shuō)明是一個(gè)版本

          5,定位一個(gè)數(shù)據(jù),需要rowkey,column和timestamp,即SortedMap<RowKey,List<SortedMap<Column,List<Value,Timestamp>>>>

          6,初始一個(gè)region,之后自動(dòng)sharding,一臺(tái)server大概10-1000個(gè)region,每個(gè)region大小為1-2GB

          7,每一個(gè)HFile有一個(gè)block index,可以只用一次disk seek完成查詢

          8,數(shù)據(jù)更新時(shí)要寫commit log即常說(shuō)的WAL——write-ahead-log,每次操作都會(huì)記錄在內(nèi)存memstore,當(dāng)memstore滿了以后自動(dòng)flush到HFile的disk,在做flush時(shí),reader和writer不被阻塞,可以繼續(xù)服務(wù)(這是因?yàn)椋琭lush做的是一個(gè)滾動(dòng)操作,老的滿的數(shù)據(jù)flush到磁盤,而完成后的新的空的memstore繼續(xù)服務(wù),因?yàn)閙emstore已經(jīng)是按key的順序排好的,所以不需要額外操作,只要寫和flush就行)

          9,刪除操作是邏輯的,因?yàn)榇鎯?chǔ)文件不可變,所以會(huì)放置一個(gè)刪除標(biāo)記到每個(gè)鍵值對(duì)

          10,通過(guò)compaction將小的hfile合并為大的,compaction有兩種類型:minor和major,前者通過(guò)多路歸并完成多個(gè)小文件到少量大文件的合并;后者重寫整個(gè)CF到一個(gè)新的文件,在做compaction的時(shí)候可以把之前標(biāo)記過(guò)delete的kv pair放棄,即不寫到新的文件

          11,HBase由客戶端庫(kù),一臺(tái)master server和多臺(tái)region server組成,master負(fù)責(zé)regions的負(fù)載均衡,master不存儲(chǔ)數(shù)據(jù),只做調(diào)度

          12,掃表scan是線性時(shí)間的,查詢是對(duì)數(shù)時(shí)間的,而極端情況的查詢是常數(shù)時(shí)間的(使用bloom filter)

          13,在put時(shí),要注意flush的時(shí)間,沒(méi)有flush的數(shù)據(jù)是不會(huì)被get到的,從源碼可以了解到,flush有兩種情況,一是顯示調(diào)用flushCommits();另外就是到了client端的writebuffer上限觸發(fā),hbase默認(rèn)client的writebuffer size是2M,可以通過(guò)配置去修改

          14,HBase的client里,caching針對(duì)行模式(返回多少行),而batching針對(duì)列模式(返回多少列),都是在scan時(shí)提高效率(減少RPC)的方法

          15,用HBase的接口時(shí),通過(guò)Filter的使用可以減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,從而減輕在客戶端使用的時(shí)間成本,get或scan你想要的東西,不要的東西直接在server通過(guò)filter過(guò)濾到

          16,在重用Configuration時(shí),要記得每次都會(huì)增加一個(gè)引用數(shù),因此在使用完后最好調(diào)用close方法將connection釋放掉

          17,HBase的block size和hdfs的block size是不一樣的,前者是指處理block操作時(shí)的數(shù)據(jù)大小,默認(rèn)是64KB,而后者是用來(lái)分布式存儲(chǔ)文件,默認(rèn)大小是64MB

          18,RDBMS和Hbase的區(qū)別:存儲(chǔ)結(jié)構(gòu)b樹或b+樹,Hbase采用類似LSM樹的做法(Log-Structured Merge Trees),LSMT的簡(jiǎn)單過(guò)程描述是,數(shù)據(jù)首先被順序存儲(chǔ)到一個(gè)log file里,在寫滿后將這些數(shù)據(jù)更新到in memory store,然后flush有序key value pair到磁盤,生成一個(gè)文件。磁盤文件的組織形式類似B樹,但是對(duì)于磁盤順序訪問(wèn)做了優(yōu)化,其中每個(gè)文件都被完全填充為單頁(yè)或多頁(yè)的block,而這些文件的update本身是rolling merge策略,即系統(tǒng)在直到block寫滿的時(shí)候才將in memory的數(shù)據(jù)打包。因?yàn)閒lush是經(jīng)常進(jìn)行的,導(dǎo)致系統(tǒng)中會(huì)有很多的文件,一個(gè)后臺(tái)進(jìn)程在不斷的合并小文件到大文件從而將磁盤seek縮減到少量的文件范圍。于此同時(shí),磁盤的樹也可以進(jìn)行分裂操作,將大文件分割為若干文件以便擴(kuò)展更新。而所有的存儲(chǔ)都是key有序的。

          19,Hbase查詢時(shí),先到in memory里查,再到on disk里查,這樣的行為可以保證了一致性;刪除時(shí)是邏輯刪除,先將delete標(biāo)志打上,后期在異步重寫的時(shí)候,標(biāo)記了delete的key會(huì)被最終物理刪除。

          20,HBase有兩類文件,一類用于WAL的log,另一類用于數(shù)據(jù)存儲(chǔ)。

          21,一般HBase的訪問(wèn)流程是:先到zookeeper quorum取row key,通過(guò)從zk中查詢-ROOT-里的服務(wù)器名字實(shí)現(xiàn);接著拿著取到的服務(wù)器名字去region server查詢持有.META. 表region并且包含了rowkey的server名字;最后查詢.META.服務(wù)器,獲取到包含對(duì)應(yīng)rowkey region的server name。一旦獲取這些信息,客戶端將其緩存起來(lái),以后就知道如何到哪里去查找并且直接和region server聯(lián)系了。

          22,在源碼級(jí)別,HMaster負(fù)責(zé)分配HRegionServer,HRegionServer維護(hù)一個(gè)HRegion,當(dāng)HRegion建立時(shí),為每張表的每個(gè)HColumnFamily建立一個(gè)Store,每個(gè)Store包含一個(gè)或者多個(gè)StoreFile(輕量級(jí)的HFile包裝),一個(gè)Store同時(shí)也有一個(gè)MemStore,還有一個(gè)HRegionServer共享的HLog。

          23,在做put操作時(shí),region server先檢查本次put是否需要寫WAL,一旦數(shù)據(jù)寫入WAL,那么它就進(jìn)入MemStore,同時(shí)檢查MemStore是否滿,如果是,做一次flush,寫到一個(gè)HFile里存到HDFS,同時(shí)維護(hù)一個(gè)最后一次寫入的序列號(hào),以便系統(tǒng)知道到目前為止的持久數(shù)據(jù)信息。

          24,在HFile被持久化后,log文件就不再有用了,這時(shí)自動(dòng)從.log目錄移動(dòng)到.oldlog目錄(當(dāng)然也有配置可以配置滾動(dòng)周期),默認(rèn)10分鐘后由HBase自動(dòng)刪除。

          25,每個(gè)table有一個(gè)目錄,在這個(gè)目錄里,每個(gè)列族有一個(gè)自己的目錄。

          26,region split發(fā)生在當(dāng)一個(gè)region的存儲(chǔ)文件大小達(dá)到配置的hbase.hregion.max.filesize時(shí)進(jìn)行。具體過(guò)程就是:系統(tǒng)為新的region創(chuàng)建兩個(gè)原region的索引文件,每個(gè)各持有原來(lái)一半的數(shù)據(jù),region server在父region創(chuàng)建一個(gè)splits目錄,接著關(guān)閉region拒絕新請(qǐng)求,然后再splits目錄里構(gòu)建必要的新的region目錄文件結(jié)構(gòu)存放剛才的兩個(gè)half 大小的文件。成功后,系統(tǒng)將兩個(gè)新的region目錄添加到表目錄,更新.META.表以表明父region做了split,同時(shí)表明新的兩個(gè)region是什么。

          27,HFile基于Hadoop的TFile類型,模仿了BigTable的SSTable格式;文件是變長(zhǎng)的,其中定長(zhǎng)的部分是file info 和trailer,而數(shù)據(jù)以keyvalue存入data塊,默認(rèn)大小64KB,而HDFS默認(rèn)塊大小是64MB,兩者沒(méi)有關(guān)系。結(jié)構(gòu)類似:

          YYYY~H0S6~ALGP4DPBEO6DS

          28,KeyValue在HFile中就是一個(gè)簡(jiǎn)單的字節(jié)序列,結(jié)構(gòu)類似

          A[BN}2`4~5B]F7@$83%Z@3S

          29,WAL是容災(zāi)的重要武器,類似mysql的binlog,記錄了所有的變化,這就可以保證在數(shù)據(jù)進(jìn)入memstore后而沒(méi)有持久這段時(shí)間因?yàn)橥话l(fā)原因?qū)е聰?shù)據(jù)丟失時(shí)候的容災(zāi)。流程如下:

          8D`N7YP]%WQ}Y9LO3H0}$CL

          30,在上面這圖中,有LogSyncer和LogRoller,前者是默認(rèn)關(guān)閉的,如果開啟后,那么每次寫入都會(huì)觸發(fā)一次sync,將update同步到其他的server,而且還是pipeline形式的順序?qū)懀皇嵌嗦窂?fù)寫;后者負(fù)責(zé)滾動(dòng)記錄log,可以設(shè)置時(shí)間間隔每隔一定時(shí)間來(lái)滾動(dòng)日志,也可以根據(jù)大小來(lái)滾動(dòng),這個(gè)都可以配置。

          31,容災(zāi)恢復(fù)數(shù)據(jù)的一項(xiàng)重要措施是replay日志,也就是重放WAL;日志回放有兩種觸發(fā)條件:一是集群?jiǎn)?dòng)時(shí),二是服務(wù)器fail時(shí);當(dāng)master啟動(dòng)時(shí),檢查.log目錄里是否有l(wèi)og文件,有的話則做log splitting——讀入log然后根據(jù)記錄的region將其分配到新文件。

          32,get和scan在近幾個(gè)版本中實(shí)現(xiàn)等價(jià),因?yàn)閷?duì)于特定行和列沒(méi)有索引的概念,而最小的訪問(wèn)單元是block,因此如果要請(qǐng)求數(shù)據(jù),那么一定會(huì)加載一個(gè)RegionServer的實(shí)例的block然后掃描它,Get其實(shí)就是一個(gè)確定了row的scan。

          33,在查詢時(shí),一個(gè)周期是這樣的:因?yàn)榭蛻舳司彺鎟egion的,所以,會(huì)先到自己的cache中查找對(duì)應(yīng)region,找到的話則直接訪問(wèn)(1次網(wǎng)絡(luò)請(qǐng)求即可),如果找不到,則到region server的.META.中去取(3次),如果再找不到,則到-ROOT-找.META.信息(5次),再找不到,只好去zk中取(7次)(這是第21條tip的逆過(guò)程) 。

          34,region有9種狀態(tài)(offline,pending open,opening,open,pending close,closing,closed,splitting,split),狀態(tài)轉(zhuǎn)移可以再master做,也可以在持有region的region server上做。集群通過(guò)zk來(lái)跟蹤狀態(tài)變化。

          35,Hbase的復(fù)制策略為容災(zāi)提供了高可用,基本模式是:master-push,因?yàn)閃AL的存在,跟蹤復(fù)制變得很容易;一個(gè)master cluster可以復(fù)制到任意數(shù)量的slave clusters,region server負(fù)責(zé)自己的復(fù)制。

          F9{B6EB`L4ASJ[W5(9D1WZP

          posted on 2012-12-28 13:59 changedi 閱讀(2415) 評(píng)論(0)  編輯  收藏 所屬分類: Java技術(shù)

          主站蜘蛛池模板: 秭归县| 塘沽区| 会昌县| 霍林郭勒市| 弋阳县| 虹口区| 昌邑市| 交城县| 佛教| 丘北县| 江北区| 晋江市| 克拉玛依市| 嘉黎县| 石城县| 南宫市| 遂宁市| 朝阳区| 桓台县| 金塔县| 四平市| 邻水| 新源县| 吕梁市| 汤原县| 老河口市| 通渭县| 莎车县| 黎平县| 仲巴县| 云林县| 石泉县| 新龙县| 昌都县| 新丰县| 九江县| 宣武区| 乌鲁木齐县| 玉树县| 万年县| 黔西|