免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
[翻譯]HBase 架構(gòu)101 –預(yù)寫(xiě)日志系統(tǒng) (WAL)

[翻譯]HBase 架構(gòu)101 –預(yù)寫(xiě)日志系統(tǒng) (WAL)

845人閱讀評(píng)論(0)收藏舉報(bào)

HBase 架構(gòu)101 –預(yù)寫(xiě)日志系統(tǒng)  (WAL)

原文:http://www.larsgeorge.com/2010/01/hbase-architecture-101-write-ahead-log.html

什么是預(yù)寫(xiě)日志WAL? 之前的文章我們簡(jiǎn)單介紹了HBase的存儲(chǔ)結(jié)構(gòu)。其中提到了預(yù)寫(xiě)日志。這里,我們要介紹它的實(shí)現(xiàn)細(xì)節(jié),所有的描述都基于HBase 0.20.3.

WAL最重要的作用是災(zāi)難恢復(fù)。和MySQL BIN log類(lèi)似,它記錄所有的數(shù)據(jù)改動(dòng)。一旦服務(wù)器崩潰,通過(guò)重放log,我們可以恢復(fù)崩潰之前的數(shù)據(jù)。這也意味如果寫(xiě)入WAL失敗,整個(gè)操作將認(rèn)為失敗。

我們先看看HBase是如何做到的。首先,客戶端初始化一個(gè)可能對(duì)數(shù)據(jù)改動(dòng)的操作,如put(Put),delete(Delete) incrementColumnValue()。這些操作都將被封裝在一個(gè)KeyValue對(duì)象實(shí)例中,通過(guò)RPC 調(diào)用發(fā)送給HRegionServer(最好是批量操作)。 一旦達(dá)到一定大小,HRegionServer 將其發(fā)送給HRegion。這個(gè)過(guò)程中,數(shù)據(jù)會(huì)首先會(huì)被寫(xiě)入WAL,之后將被寫(xiě)到實(shí)際存放數(shù)據(jù)的MemStore中。

當(dāng)MemStore到達(dá)一定大小,或者經(jīng)過(guò)一段時(shí)間后,數(shù)據(jù)將被異步地寫(xiě)入文件系統(tǒng)中。然而,在兩次寫(xiě)入文件系統(tǒng)之間的數(shù)據(jù),是保留在內(nèi)存中的。如果這個(gè)時(shí)候系統(tǒng)崩潰,那數(shù)據(jù)···,別急,我們有WAL!

我們先來(lái)看看WAL幾個(gè)重要的類(lèi)。

HLog

HLog是實(shí)現(xiàn)WAL的類(lèi)。一個(gè)HRegionServer對(duì)應(yīng)一個(gè)HLog實(shí)例。當(dāng)HRegion初始化時(shí),HLog將作為一個(gè)參數(shù)傳給HRegion的構(gòu)造函數(shù)。

HLog最核心的是調(diào)用doWriteappend() 方法,前面提到的可能對(duì)數(shù)據(jù)改動(dòng)的操作都就將首先調(diào)用這個(gè)方法。出于性能的考慮,put(), delete() incrementColumnValue()有一個(gè)開(kāi)關(guān)函數(shù)setWriteToWAL(boolean) 設(shè)為false將禁用WAL。這是為什么上圖中向下的箭頭是虛線的原因。默認(rèn)時(shí)候當(dāng)然需要WAL,但是假如你運(yùn)行一個(gè)數(shù)據(jù)導(dǎo)入的MapReduce Job,你可以通過(guò)關(guān)閉WAL獲得性能上的提升。

另一個(gè)重要的特性是HLog將通過(guò)“sequence number”追蹤數(shù)據(jù)改變。它內(nèi)部使用AtomicLong保證線程安全。sequence number的起始值為0,或者是最近一次存入文件系統(tǒng)中sequence number。Region打開(kāi)存儲(chǔ)文件,讀取每個(gè)HFile中的最大的sequence number,如果該值大于HLog sequence number, 就將它作為HLog sequence number的值。最后,HLog將得到上次存入文件和繼續(xù)記log的點(diǎn)。過(guò)會(huì),我們將看到它的應(yīng)用。

上圖表示了3個(gè)不同的region,每一個(gè)負(fù)責(zé)一段rowkey的范圍。這些region將共享同一個(gè)HLog實(shí)例,我們可以看出,從不同region來(lái)的數(shù)據(jù)寫(xiě)入WAL的順序是不確定的。在后面我們會(huì)再詳細(xì)的介紹。

最后,Hlog利用HMaster恢復(fù)和切分一個(gè)由一個(gè)崩潰的HRegionServery遺留下來(lái)的Log。之后,重新部署regions。

HLogKey

WAL使用HadoopSequenceFile,它將記錄存儲(chǔ)為key/values 的數(shù)據(jù)集。對(duì)于WAL,key是一個(gè)HLogKey的實(shí)例。前一篇文章中提到的, KeyValue不僅包括row,column family, qualifier, timestamp, value, 還包括“Key Type派上用場(chǎng)啦, 這里,可以用Key Type代表一個(gè)“put”或“delete”操作。

但是,哪里去存放KeyValue的歸屬信息,比如region或者表名呢?這些存放在HLogKey中。同時(shí)還包括 sequence number,和“寫(xiě)入時(shí)間”, 是一個(gè)記錄數(shù)據(jù)何時(shí)寫(xiě)入到log的時(shí)間戳。

LogFlusher

前面提到,數(shù)據(jù)以KeyValue形式到達(dá)HRegionServer,將寫(xiě)入WAL,之后,寫(xiě)入一個(gè)SequenceFile。看過(guò)去沒(méi)問(wèn)題,但是因?yàn)閿?shù)據(jù)流在寫(xiě)入文件系統(tǒng)時(shí),經(jīng)常會(huì)緩存以提高性能。這樣,有些本以為在日志文件中的數(shù)據(jù)實(shí)際在內(nèi)存中。這里,我們提供了一個(gè)LogFlusher的類(lèi)。它調(diào)用HLog.optionalSync(),后者根據(jù)“hbase.regionserver.optionallogflushinterval(默認(rèn)是10),定期調(diào)用Hlog.sync()。另外,HLog.doWrite()也會(huì)根據(jù)“hbase.regionserver.flushlogentries(默認(rèn)100)定期調(diào)用Hlog.sync()Sync() 本身調(diào)用HLog.Writer.sync(),它由SequenceFileLogWriter實(shí)現(xiàn)。

LogRoller

Log的大小通過(guò)$HBASE_HOME/conf/hbase-site.xml 的“hbase.regionserver.logroll.period”限制,默認(rèn)是一個(gè)小時(shí)。所以每60分鐘,會(huì)打開(kāi)一個(gè)新的log文件。久而久之,會(huì)有一大堆的文件需要維護(hù)。首先,LogRoller調(diào)用HLog.rollWriter(),定時(shí)滾動(dòng)日志,之后,利用HLog.cleanOldLogs()可以清除舊的日志。它首先取得存儲(chǔ)文件中的最大的sequence number,之后檢查是否存在一個(gè)log所有的條目的“sequence number”均低于這個(gè)值,如果存在,將刪除這個(gè)log。

這里解釋下你可能在log中看到的令人費(fèi)解的內(nèi)容:

2009-12-15 01:45:48,427 INFO org.apache.hadoop.hbase.regionserver.HLog: Too
many hlogs: logs=130, maxlogs=96; forcing flush of region with oldest edits:
foobar,1b2dc5f3b5d4,1260083783909

這里,我們看到,log file的數(shù)目超過(guò)了log files的最大值。這時(shí),會(huì)強(qiáng)制調(diào)用flush out 以減少log的數(shù)目。

hbase.regionserver.hlog.blocksize”和“hbase.regionserver.logroll.multiplier”兩個(gè)參數(shù)默認(rèn)將在log大小為SequenceFile(默認(rèn)為64MB)95%時(shí)回滾。所以,log的大小和log使用的時(shí)間都會(huì)導(dǎo)致回滾,以先到達(dá)哪個(gè)限定為準(zhǔn)。

Replay

 當(dāng)HRegionServer啟動(dòng),打開(kāi)所管轄的region,它將檢查是否存在剩余的log文件,如果存在,將調(diào)用Store.doReconstructionLog()。重放一個(gè)日志只是簡(jiǎn)單地讀入一個(gè)日志,將日志中的條目加入到Memstore中。最后,flush操作將Memstore中數(shù)據(jù)flush到硬盤(pán)中。

舊日志往往由region server 崩潰所產(chǎn)生。當(dāng)HMaster啟動(dòng)或者檢測(cè)到region server 崩潰,它將日志文件拆分為多份文件,將其存儲(chǔ)在region所屬的文件夾。之后,根據(jù)上面提到的方法,將日志重放。需要指出的是,崩潰的服務(wù)器中的region只有在日志被拆分和拷貝之后才能被重新分配。拆分日志利用HLog.splitLog()。舊日志被讀入主線程內(nèi)存中,之后,利用線程池將其寫(xiě)入所有的region文件夾中,一個(gè)線程對(duì)應(yīng)于一個(gè)region。

問(wèn)題

1. 為什么要一個(gè)RegionServer 對(duì)應(yīng)于一個(gè)HLog。為什么不是一個(gè)region對(duì)應(yīng)于一個(gè)log file?

引用BigTable中的一段話,

如果我們每一個(gè)“tablet”(對(duì)應(yīng)于HBaseregion)都提交一個(gè)日志文件,會(huì)需要并發(fā)寫(xiě)入大量的文件到GFS,這樣,根據(jù)每個(gè)GFS server所依賴的文件系統(tǒng),寫(xiě)入不同的日志文件會(huì)造成大量的磁盤(pán)操作。

HBase依照這樣的原則。在日志被回滾和安全刪除之前,將會(huì)有大量的文件。如果改成一個(gè)region對(duì)應(yīng)于一個(gè)文件,將會(huì)不好擴(kuò)展,遲早會(huì)引發(fā)問(wèn)題。

2. 潛在問(wèn)題

1)      當(dāng)server崩潰,HBase需要將其log切分成合適的片。然而,由于所有的條目混雜在日志中,HMaster只有在將log完全分配到每一個(gè)server后,才能將崩潰server中的region重新分配。這個(gè)時(shí)間可能很長(zhǎng)。

2)      數(shù)據(jù)安全。你希望能保存你所有的數(shù)據(jù),雖然你能將flush的時(shí)間調(diào)到盡可能的低,你依然依賴于上面提到的文件系統(tǒng)。那些用于存儲(chǔ)數(shù)據(jù)依舊有可能沒(méi)寫(xiě)到磁盤(pán)而發(fā)生數(shù)據(jù)丟失。

很明顯,需要log來(lái)保證數(shù)據(jù)安全。最好是能讓一個(gè)日志保持1個(gè)小時(shí)(或長(zhǎng))的打開(kāi)狀態(tài)。當(dāng)數(shù)據(jù)來(lái)時(shí),將新的key/value對(duì)寫(xiě)入SequenceFile中,并定期flush數(shù)據(jù)到磁盤(pán)中。但是Hadoop不是這樣工作的。他提供了一個(gè)API,允許打開(kāi)一個(gè)文件,寫(xiě)入大量的數(shù)據(jù),然后馬上關(guān)閉文件,成為一個(gè)對(duì)其他人只讀的文件。只有當(dāng)文件關(guān)閉時(shí)才是對(duì)其他人可讀的。那么,如果一個(gè)進(jìn)程在寫(xiě)入文件時(shí)僵死,那么,數(shù)據(jù)很可能會(huì)丟失。因此,我們需要一個(gè)功能,能取到一個(gè)離崩潰服務(wù)器寫(xiě)入數(shù)據(jù)盡可能近的點(diǎn)。

插曲: HDFS append,hflush,hsyncsync···

這些都起源于HADOOP-1700。Hadoop 0.19沒(méi)有能解決這個(gè)問(wèn)題。這個(gè)問(wèn)題后來(lái)又成為HADOOP-4379HDFS-200,并實(shí)現(xiàn)了syncFS(),后者可以同步文件的改變。同時(shí),HBase-1470中,將這個(gè)API開(kāi)放,但是依然沒(méi)有解決這個(gè)問(wèn)題。

之后是HDFS-265,重新提出append的方案,并引入Syncable的接口,開(kāi)放hsync()hflush()

SequenceFile.Writer.sync()和上面的并不相同。 它只是將一個(gè)同步標(biāo)記寫(xiě)入文件,以方便數(shù)據(jù)恢復(fù)。

雖然append對(duì)于HDFS很有用,但并沒(méi)有用在HBase中。HBase用了hflush,它可以在log寫(xiě)完成后將所有數(shù)據(jù)寫(xiě)入磁盤(pán)。當(dāng)服務(wù)器崩潰,我們可以安全地將“臟”文件讀到最后一次改動(dòng)。Hadoop 0.19.0中,利用Hadoop fsck /可以根據(jù)HBase打開(kāi)的日志文件數(shù)目報(bào)告DFS的破損程度。

結(jié)論是,在Hadoop 0.21.0之前,你非常容易遇到數(shù)據(jù)丟失。在Hadoop 0.21.0之后,你將得到頂尖的系統(tǒng)(有點(diǎn)吹牛啦,譯者注)。

改善計(jì)劃

HBase0.21.0中,WAL構(gòu)架會(huì)有相當(dāng)大的改進(jìn),這里強(qiáng)調(diào)幾點(diǎn)

1. 替換SequenceFile

WAL的核心之一就是存儲(chǔ)格式。SequenceFile有不少問(wèn)題,最大的性能問(wèn)題就是所有的寫(xiě)入都是同步的(HBase-2105)。

HBase 0.20.0中,HFile替換了MapFile,所以,可以考慮一個(gè)完全的替換。首先要做的是HBase獨(dú)立于底層的文件系統(tǒng)。HBase-2059使log的實(shí)現(xiàn)方式可配。

另一個(gè)想法是完全換一種序列化方式。HBase-2055提出利用HadoopAvro作為底層系統(tǒng)。Avro也可能成為Hadoop新的RPC格式,希望有越來(lái)越多的人熟悉它。

2. Append/Sync

 頻繁的調(diào)用hflush()會(huì)導(dǎo)致系統(tǒng)變慢。之前的測(cè)試發(fā)現(xiàn),如果每一個(gè)記錄都調(diào)用舊的syncFs(),將大大降低系統(tǒng)的性能。HBase-1939提出一種“組提交”的方法,可以批量flush數(shù)據(jù)。另外,HBase-1944中提出將“延時(shí)flush log”最為一個(gè)Column Family 的參數(shù)。設(shè)為“true”,將同步改動(dòng)到log的工作交給新的LogSyncer類(lèi)和線程。最后,在HBASE-2041中,將flushlogentries 設(shè)置為1, optinallogflushinterval 設(shè)為1000毫秒。.META.每次改變都會(huì)被同步,用戶表可以根據(jù)需要類(lèi)配置。

3.分布式日志切分

之前談過(guò),當(dāng)region需要被重新分配時(shí),切分日志將成為一個(gè)問(wèn)題。一個(gè)方法就是在zookeeper中維護(hù)一個(gè)regions的列表。這個(gè)方法至少能保證所有“干凈”的region能被快速地分配。剩下那些需要等待日志被切分的條目。

剩下的問(wèn)題就是如何更快地切分日志。這里,BigTable有如下的描述:

一種方案是對(duì)于每一個(gè)新的tablet server(類(lèi)似regionserver),需要讀取整個(gè)日志文件,然后,分配那些需要被修復(fù)的條目。然而,在這種情況下,如果將一個(gè)失敗的tablet server重新分配到100臺(tái)機(jī)器,那么每個(gè)日志文件需要讀100次。

改進(jìn)方案

我們根據(jù)key對(duì)log條目進(jìn)行排序。之后,所有對(duì)一個(gè)特定tablet的改動(dòng)都將是連續(xù)的,順序讀可以有效地提高磁盤(pán)檢索的效率。為了并行地排序,我們將日志切分為64MB的分片。每個(gè)排序進(jìn)程都將有Master協(xié)調(diào)管理,并在tablet server給出它將從那些日志文件中恢復(fù)時(shí)初始化。

這就是他的原理。在HMaster rewrite HBASE-1816)中,也提到了日志拆分。HBASE-1364中,將日志拆分打包成一個(gè)問(wèn)題。但我覺(jué)得會(huì)引入更多的需要討論的細(xì)節(jié)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
HBase技術(shù)介紹
淺談HBase系統(tǒng)架構(gòu)
HBase 系統(tǒng)架構(gòu)
HBASE松散數(shù)據(jù)存儲(chǔ)設(shè)計(jì)初識(shí) - 西湖邊的窮秀才-文初 - BlogJava
工作中我自己總結(jié)的hbase文檔,供初學(xué)者學(xué)習(xí)。看了這個(gè),就不用
HBase架構(gòu)核心模塊
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服