從Hadoop框架與MapReduce模式中談海量數(shù)據(jù)處理(含淘寶技術(shù)架構(gòu))

前言

最近凡是空閑時(shí),便在看“Hadoop”括蝠,“MapReduce”“海量數(shù)據(jù)處理”這方面的論文鞠抑。但在看論文的過(guò)程中,總覺(jué)得那些論文都是淺嘗輒止忌警,常掣樽荆看的很不過(guò)癮,總是一個(gè)東西剛要講到緊要處慨蓝,它便結(jié)束了感混,讓我好生“憤懣”。

盡管我對(duì)這個(gè)Hadoop與MapReduce知之甚淺礼烈,但我還是想記錄自己的學(xué)習(xí)過(guò)程弧满。

Ok,閑話少說(shuō)此熬。本文從最基本的mapreduce模式庭呜,Hadoop框架開(kāi)始談起,然后由各自的架構(gòu)引申開(kāi)來(lái)犀忱,談到海量數(shù)據(jù)處理募谎,最后談?wù)勌詫毜暮A繑?shù)據(jù)產(chǎn)品技術(shù)架構(gòu),以為了兼?zhèn)錅\出與深入之效阴汇,最終数冬,希望得到讀者的喜歡與支持。謝謝搀庶。

由于本人是初次接觸這兩個(gè)東西拐纱,文章有任何問(wèn)題,歡迎不吝指正哥倔。Ok秸架,咱們開(kāi)始吧。

第一部分咆蒿、mapreduce模式與hadoop框架深入淺出

架構(gòu)扼要

想讀懂此文东抹,讀者必須先要明確以下幾點(diǎn),以作為閱讀后續(xù)內(nèi)容的基礎(chǔ)知識(shí)儲(chǔ)備:

Mapreduce是一種模式沃测。

Hadoop是一種框架缭黔。

Hadoop是一個(gè)實(shí)現(xiàn)了mapreduce模式的開(kāi)源的分布式并行編程框架。

所以蒂破,你現(xiàn)在试浙,知道了什么是mapreduce,什么是hadoop寞蚌,以及這兩者之間最簡(jiǎn)單的聯(lián)系田巴,而本文的主旨即是钠糊,一句話概括:在hadoop的框架上采取mapreduce的模式處理海量數(shù)據(jù)。下面壹哺,咱們可以依次深入學(xué)習(xí)和了解mapreduce和hadoop這兩個(gè)東西了抄伍。

Mapreduce模式

前面說(shuō)了,mapreduce是一種模式管宵,一種什么模式呢?一種云計(jì)算的核心計(jì)算模式截珍,一種分布式運(yùn)算技術(shù),也是簡(jiǎn)化的分布式編程模式箩朴,它主要用于解決問(wèn)題的程序開(kāi)發(fā)模型岗喉,也是開(kāi)發(fā)人員拆解問(wèn)題的方法。

Ok炸庞,光說(shuō)不上圖钱床,沒(méi)用。如下圖所示埠居,mapreduce模式的主要思想是將自動(dòng)分割要執(zhí)行的問(wèn)題(例如程序)拆解成map(映射)和reduce(化簡(jiǎn))的方式查牌,流程圖如下圖1所示:

在數(shù)據(jù)被分割后通過(guò)Map 函數(shù)的程序?qū)?shù)據(jù)映射成不同的區(qū)塊,分配給計(jì)算機(jī)機(jī)群處理達(dá)到分布式運(yùn)算的效果滥壕,在通過(guò)Reduce 函數(shù)的程序?qū)⒔Y(jié)果匯整纸颜,從而輸出開(kāi)發(fā)者需要的結(jié)果。

MapReduce 借鑒了函數(shù)式程序設(shè)計(jì)語(yǔ)言的設(shè)計(jì)思想绎橘,其軟件實(shí)現(xiàn)是指定一個(gè)Map 函數(shù)胁孙,把鍵值對(duì)(key/value)映射成新的鍵值對(duì)(key/value),形成一系列中間結(jié)果形式的key/value 對(duì)称鳞,然后把它們傳給Reduce(規(guī)約)函數(shù)涮较,把具有相同中間形式key 的value 合并在一起。Map 和Reduce 函數(shù)具有一定的關(guān)聯(lián)性胡岔。函數(shù)描述如表1 所示:

MapReduce致力于解決大規(guī)模數(shù)據(jù)處理的問(wèn)題法希,因此在設(shè)計(jì)之初就考慮了數(shù)據(jù)的局部性原理枷餐,利用局部性原理將整個(gè)問(wèn)題分而治之靶瘸。MapReduce集群由普通PC機(jī)構(gòu)成,為無(wú)共享式架構(gòu)毛肋。在處理之前怨咪,將數(shù)據(jù)集分布至各個(gè)節(jié)點(diǎn)。處理時(shí)润匙,每個(gè)節(jié)點(diǎn)就近讀取本地存儲(chǔ)的數(shù)據(jù)處理(map)诗眨,將處理后的數(shù)據(jù)進(jìn)行合并(combine)、排序(shuffle and sort)后再分發(fā)(至reduce節(jié)點(diǎn))孕讳,避免了大量數(shù)據(jù)的傳輸匠楚,提高了處理效率巍膘。無(wú)共享式架構(gòu)的另一個(gè)好處是配合復(fù)制(replication)策略,集群可以具有良好的容錯(cuò)性芋簿,一部分節(jié)點(diǎn)的down機(jī)對(duì)集群的正常工作不會(huì)造成影響峡懈。

ok,你可以再簡(jiǎn)單看看下副圖与斤,整幅圖是有關(guān)hadoop的作業(yè)調(diào)優(yōu)參數(shù)及原理肪康,圖的左邊是MapTask運(yùn)行示意圖,右邊是ReduceTask運(yùn)行示意圖:

如上圖所示撩穿,其中map階段磷支,當(dāng)map task開(kāi)始運(yùn)算,并產(chǎn)生中間數(shù)據(jù)后并非直接而簡(jiǎn)單的寫(xiě)入磁盤(pán)食寡,它首先利用內(nèi)存buffer來(lái)對(duì)已經(jīng)產(chǎn)生的buffer進(jìn)行緩存雾狈,并在內(nèi)存buffer中進(jìn)行一些預(yù)排序來(lái)優(yōu)化整個(gè)map的性能状共。而上圖右邊的reduce階段則經(jīng)歷了三個(gè)階段锣披,分別Copy->Sort->reduce。我們能明顯的看出糙申,其中的Sort是采用的歸并排序叨叙,即merge sort锭弊。

了解了什么是mapreduce,接下來(lái)擂错,咱們可以來(lái)了解實(shí)現(xiàn)了mapreduce模式的開(kāi)源框架—hadoop味滞。

Hadoop框架

前面說(shuō)了,hadoop是一個(gè)框架钮呀,一個(gè)什么樣的框架呢?Hadoop 是一個(gè)實(shí)現(xiàn)了MapReduce 計(jì)算模型的開(kāi)源分布式并行編程框架剑鞍,程序員可以借助Hadoop 編寫(xiě)程序,將所編寫(xiě)的程序運(yùn)行于計(jì)算機(jī)機(jī)群上爽醋,從而實(shí)現(xiàn)對(duì)海量數(shù)據(jù)的處理蚁署。

此外,Hadoop 還提供一個(gè)分布式文件系統(tǒng)(HDFS)及分布式數(shù)據(jù)庫(kù)(HBase)用來(lái)將數(shù)據(jù)存儲(chǔ)或部署到各個(gè)計(jì)算節(jié)點(diǎn)上蚂四。所以光戈,你可以大致認(rèn)為:Hadoop=HDFS(文件系統(tǒng),數(shù)據(jù)存儲(chǔ)技術(shù)相關(guān))+HBase(數(shù)據(jù)庫(kù))+MapReduce(數(shù)據(jù)處理)遂赠。Hadoop 框架如圖2 所示:

借助Hadoop 框架及云計(jì)算核心技術(shù)MapReduce 來(lái)實(shí)現(xiàn)數(shù)據(jù)的計(jì)算和存儲(chǔ)久妆,并且將HDFS 分布式文件系統(tǒng)和HBase 分布式數(shù)據(jù)庫(kù)很好的融入到云計(jì)算框架中,從而實(shí)現(xiàn)云計(jì)算的分布式跷睦、并行計(jì)算和存儲(chǔ)筷弦,并且得以實(shí)現(xiàn)很好的處理大規(guī)模數(shù)據(jù)的能力。

Hadoop的組成部分

我們已經(jīng)知道抑诸,Hadoop是Google的MapReduce一個(gè)Java實(shí)現(xiàn)烂琴。MapReduce是一種簡(jiǎn)化的分布式編程模式爹殊,讓程序自動(dòng)分布到一個(gè)由普通機(jī)器組成的超大集群上并發(fā)執(zhí)行。Hadoop主要由HDFS奸绷、MapReduce和HBase等組成边灭。具體的hadoop的組成如下圖:

由上圖,我們可以看到:

1健盒、Hadoop HDFS是Google GFS存儲(chǔ)系統(tǒng)的開(kāi)源實(shí)現(xiàn)绒瘦,主要應(yīng)用場(chǎng)景是作為并行計(jì)算環(huán)境(MapReduce)的基礎(chǔ)組件,同時(shí)也是BigTable(如HBase扣癣、HyperTable)的底層分布式文件系統(tǒng)惰帽。HDFS采用master/slave架構(gòu)。一個(gè)HDFS集群是有由一個(gè)Namenode和一定數(shù)目的Datanode組成父虑。Namenode是一個(gè)中心服務(wù)器该酗,負(fù)責(zé)管理文件系統(tǒng)的namespace和客戶端對(duì)文件的訪問(wèn)。

Datanode

在集群中一般是一個(gè)節(jié)點(diǎn)一個(gè)士嚎,負(fù)責(zé)管理節(jié)點(diǎn)上它們附帶的存儲(chǔ)呜魄。在內(nèi)部,一個(gè)文件其實(shí)分成一個(gè)或多個(gè)block莱衩,這些block存儲(chǔ)在Datanode集合里爵嗅。如下圖所示(HDFS體系結(jié)構(gòu)圖):

2、Hadoop MapReduce是一個(gè)使用簡(jiǎn)易的軟件框架笨蚁,基于它寫(xiě)出來(lái)的應(yīng)用程序能夠運(yùn)行在由上千個(gè)商用機(jī)器組成的大型集群上睹晒,并以一種可靠容錯(cuò)的方式并行處理上TB級(jí)別的數(shù)據(jù)集。

一個(gè)MapReduce作業(yè)(job)通常會(huì)把輸入的數(shù)據(jù)集切分為若干獨(dú)立的數(shù)據(jù)塊括细,由 Map任務(wù)(task)以完全并行的方式處理它們伪很。框架會(huì)對(duì)Map的輸出先進(jìn)行排序奋单,然后把結(jié)果輸入給Reduce任務(wù)锉试。通常作業(yè)的輸入和輸出都會(huì)被存儲(chǔ)在文件系統(tǒng)中。整個(gè)框架負(fù)責(zé)任務(wù)的調(diào)度和監(jiān)控览濒,以及重新執(zhí)行已經(jīng)失敗的任務(wù)呆盖。如下圖所示(Hadoop MapReduce處理流程圖):

3、 Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具匾七,處理能力強(qiáng)而且成本低廉絮短。

主要特點(diǎn):

存儲(chǔ)方式是將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表江兢。提供類SQL語(yǔ)言昨忆,實(shí)現(xiàn)完整的SQL查詢功能∩荚剩可以將SQL語(yǔ)句轉(zhuǎn)換為MapReduce任務(wù)運(yùn)行邑贴,十分適合數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析席里。

不足之處:

采用行存儲(chǔ)的方式(SequenceFile)來(lái)存儲(chǔ)和讀取數(shù)據(jù)。效率低:當(dāng)要讀取數(shù)據(jù)表某一列數(shù)據(jù)時(shí)需要先取出所有數(shù)據(jù)然后再提取出某一列的數(shù)據(jù)拢驾,效率很低奖磁。同時(shí),它還占用較多的磁盤(pán)空間繁疤。

由于以上的不足咖为,有人(查禮博士)介紹了一種將分布式數(shù)據(jù)處理系統(tǒng)中以記錄為單位的存儲(chǔ)結(jié)構(gòu)變?yōu)橐粤袨閱挝坏拇鎯?chǔ)結(jié)構(gòu),進(jìn)而減少磁盤(pán)訪問(wèn)數(shù)量稠腊,提高查詢處理性能躁染。這樣,由于相同屬性值具有相同數(shù)據(jù)類型和相近的數(shù)據(jù)特性架忌,以屬性值為單位進(jìn)行壓縮存儲(chǔ)的壓縮比更高吞彤,能節(jié)省更多的存儲(chǔ)空間。如下圖所示(行列存儲(chǔ)的比較圖):

4叹放、 HBase

HBase是一個(gè)分布式的饰恕、面向列的開(kāi)源數(shù)據(jù)庫(kù),它不同于一般的關(guān)系數(shù)據(jù)庫(kù),是一個(gè)適合于非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)庫(kù)井仰。另一個(gè)不同的是HBase基于列的而不是基于行的模式埋嵌。HBase使用和 BigTable非常相同的數(shù)據(jù)模型。用戶存儲(chǔ)數(shù)據(jù)行在一個(gè)表里俱恶。一個(gè)數(shù)據(jù)行擁有一個(gè)可選擇的鍵和任意數(shù)量的列莉恼,一個(gè)或多個(gè)列組成一個(gè)ColumnFamily,一個(gè)Fmaily下的列位于一個(gè)HFile中速那,易于緩存數(shù)據(jù)俐银。表是疏松的存儲(chǔ)的,因此用戶可以給行定義各種不同的列端仰。在HBase中數(shù)據(jù)按主鍵排序捶惜,同時(shí)表按主鍵劃分為多個(gè)HRegion,如下圖所示(HBase數(shù)據(jù)表結(jié)構(gòu)圖):

Ok荔烧,行文至此吱七,看似洋洋灑灑近千里,但若給讀者造成閱讀上的負(fù)擔(dān)鹤竭,則不是我本意踊餐。接下來(lái)的內(nèi)容,我不會(huì)再引用諸多繁雜的專業(yè)術(shù)語(yǔ)臀稚,以給讀者心里上造成不良影響吝岭。

我再給出一副圖,算是對(duì)上文所說(shuō)的hadoop框架及其組成部分做個(gè)總結(jié),如下圖所示窜管,便是hadoop的內(nèi)部結(jié)構(gòu)散劫,我們可以看到,海量的數(shù)據(jù)交給hadoop處理后幕帆,在hadoop的內(nèi)部中获搏,正如上文所述:hadoop提供一個(gè)分布式文件系統(tǒng)(HDFS)及分布式數(shù)據(jù)庫(kù)(Hbase)用來(lái)存儲(chǔ)或部署到各個(gè)計(jì)算點(diǎn)上,最終在內(nèi)部采取mapreduce的模式對(duì)其數(shù)據(jù)進(jìn)行處理失乾,然后輸出處理結(jié)果:

第二部分常熙、淘寶海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)解讀—學(xué)習(xí)海量數(shù)據(jù)處理經(jīng)驗(yàn)

在上面的本文的第一部分中,我們已經(jīng)對(duì)mapreduce模式及hadoop框架有了一個(gè)深入而全面的了解碱茁。不過(guò)症概,如果一個(gè)東西,或者一個(gè)概念不放到實(shí)際應(yīng)用中去早芭,那么你對(duì)這個(gè)理念永遠(yuǎn)只是停留在理論之內(nèi)彼城,無(wú)法向?qū)嵺`邁進(jìn)。

Ok退个,接下來(lái)募壕,本文的第二部分,咱們以淘寶的數(shù)據(jù)魔方技術(shù)架構(gòu)為依托语盈,通過(guò)介紹淘寶的海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)舱馅,來(lái)進(jìn)一步學(xué)習(xí)和了解海量數(shù)據(jù)處理的經(jīng)驗(yàn)。

淘寶海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)

如下圖2-1所示刀荒,即是淘寶的海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)代嗤,咱們下面要針對(duì)這個(gè)架構(gòu)來(lái)一一剖析與解讀。

在此之前缠借,有一點(diǎn)必須說(shuō)明的是:本文下面的內(nèi)容大都是參考自朋春先生的這篇文章:淘寶數(shù)據(jù)魔方技術(shù)架構(gòu)解析所寫(xiě)干毅,我個(gè)人所作的工作是對(duì)這篇文章的一種解讀與關(guān)鍵技術(shù)和內(nèi)容的抽取,以為讀者更好的理解淘寶的海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)泼返。與此同時(shí)硝逢,還能展示我自己讀此篇的思路與感悟,順帶學(xué)習(xí)绅喉,何樂(lè)而不為呢?渠鸽。

本文接下來(lái),要詳細(xì)闡述這個(gè)架構(gòu)柴罐。我也做了不少準(zhǔn)備工作(如把這圖2-1打印了下來(lái)徽缚,經(jīng)常琢磨):

圖2-1 淘寶海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)

好的,如上圖所示革屠,我們可以看到凿试,淘寶的海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)排宰,分為以下五個(gè)層次,從上至下來(lái)看红省,它們分別是:數(shù)據(jù)源,計(jì)算層国觉,存儲(chǔ)層吧恃,查詢層和產(chǎn)品層。我們來(lái)一一了解這五層:

數(shù)據(jù)來(lái)源層麻诀。存放著淘寶各店的交易數(shù)據(jù)痕寓。在數(shù)據(jù)源層產(chǎn)生的數(shù)據(jù),通過(guò)DataX蝇闭,DbSync和Timetunel準(zhǔn)實(shí)時(shí)的傳輸?shù)较旅娴?點(diǎn)所述的“云梯”呻率。

計(jì)算層。在這個(gè)計(jì)算層內(nèi)呻引,淘寶采用的是hadoop集群礼仗,這個(gè)集群,我們暫且稱之為云梯逻悠,是計(jì)算層的主要組成部分元践。在云梯上,系統(tǒng)每天會(huì)對(duì)數(shù)據(jù)產(chǎn)品進(jìn)行不同的mapreduce計(jì)算童谒。

存儲(chǔ)層单旁。在這一層,淘寶采用了兩個(gè)東西饥伊,一個(gè)使MyFox象浑,一個(gè)是Prom。MyFox是基于MySQL的分布式關(guān)系型數(shù)據(jù)庫(kù)的集群琅豆,Prom是基于hadoop Hbase技術(shù) 的(讀者可別忘了愉豺,在上文第一部分中,咱們介紹到了這個(gè)hadoop的組成部分之一茫因,Hbase—在hadoop之內(nèi)的一個(gè)分布式的開(kāi)源數(shù)據(jù)庫(kù))的一個(gè)NoSQL的存儲(chǔ)集群粒氧。

查詢層。在這一層中节腐,有一個(gè)叫做glider的東西外盯,這個(gè)glider是以HTTP協(xié)議對(duì)外提供restful方式的接口。數(shù)據(jù)產(chǎn)品通過(guò)一個(gè)唯一的URL來(lái)獲取到它想要的數(shù)據(jù)翼雀。同時(shí)饱苟,數(shù)據(jù)查詢即是通過(guò)MyFox來(lái)查詢的。下文將具體介紹MyFox的數(shù)據(jù)查詢過(guò)程狼渊。

產(chǎn)品層箱熬。簡(jiǎn)單理解类垦,不作過(guò)多介紹。

接下來(lái)城须,咱們重點(diǎn)來(lái)了解第三層-存儲(chǔ)層中的MyFox與Prom蚤认,然后會(huì)稍帶分析下glide的技術(shù)架構(gòu),最后糕伐,再了解下緩存砰琢。文章即宣告結(jié)束。

我們知道良瞧,關(guān)系型數(shù)據(jù)庫(kù)在我們現(xiàn)在的工業(yè)生產(chǎn)中有著廣泛的引用陪汽,它包括Oracle,MySQL褥蚯、DB2挚冤、Sybase和SQL Server等等。

MyFOX

淘寶選擇了MySQL的MyISAM引擎作為底層的數(shù)據(jù)存儲(chǔ)引擎赞庶。且為了應(yīng)對(duì)海量數(shù)據(jù)训挡,他們?cè)O(shè)計(jì)了分布式MySQL集群的查詢代理層-MyFOX。

如下圖所示歧强,是MySQL的數(shù)據(jù)查詢過(guò)程:

圖2-2 MyFOX的數(shù)據(jù)查詢過(guò)程

在MyFOX的每一個(gè)節(jié)點(diǎn)中舍哄,存放著熱節(jié)點(diǎn)和冷節(jié)點(diǎn)兩種節(jié)點(diǎn)數(shù)據(jù)。顧名思義誊锭,熱節(jié)點(diǎn)存放著最新的表悬,被訪問(wèn)頻率較高的數(shù)據(jù);冷節(jié)點(diǎn)丧靡,存放著相對(duì)而來(lái)比較舊的蟆沫,訪問(wèn)頻率比較低的數(shù)據(jù)。而為了存儲(chǔ)這兩種節(jié)點(diǎn)數(shù)據(jù)温治,出于硬件條件和存儲(chǔ)成本的考慮饭庞,你當(dāng)然會(huì)考慮選擇兩種不同的硬盤(pán),來(lái)存儲(chǔ)這兩種訪問(wèn)頻率不同的節(jié)點(diǎn)數(shù)據(jù)熬荆。如下圖所示:

圖2-3 MyFOX節(jié)點(diǎn)結(jié)構(gòu)

“熱節(jié)點(diǎn)”舟山,選擇每分鐘15000轉(zhuǎn)的SAS硬盤(pán),按照一個(gè)節(jié)點(diǎn)兩臺(tái)機(jī)器來(lái)計(jì)算卤恳,單位數(shù)據(jù)的存儲(chǔ)成本約為4.5W/TB累盗。相對(duì)應(yīng)地,“冷數(shù)據(jù)”我們選擇了每分鐘7500轉(zhuǎn)的SATA硬盤(pán)突琳,單碟上能夠存放更多的數(shù)據(jù)若债,存儲(chǔ)成本約為1.6W/TB。

Prom

出于文章篇幅的考慮拆融,本文接下來(lái)不再過(guò)多闡述這個(gè)Prom了蠢琳。如下面兩幅圖所示啊终,他們分別表示的是Prom的存儲(chǔ)結(jié)構(gòu)以及Prom查詢過(guò)程:

圖2-4 Prom的存儲(chǔ)結(jié)構(gòu)

圖2-5 Prom查詢過(guò)程

glide的技術(shù)架構(gòu)

圖2-6 glider的技術(shù)架構(gòu)

在這一層-查詢層中,淘寶主要是基于用中間層隔離前后端的理念而考慮傲须。Glider這個(gè)中間層負(fù)責(zé)各個(gè)異構(gòu)表之間的數(shù)據(jù)JOIN和UNION等計(jì)算蓝牲,并且負(fù)責(zé)隔離前端產(chǎn)品和后端存儲(chǔ),提供統(tǒng)一的數(shù)據(jù)查詢服務(wù)泰讽。

緩存

除了起到隔離前后端以及異構(gòu)“表”之間的數(shù)據(jù)整合的作用之外例衍,glider的另外一個(gè)不容忽視的作用便是緩存管理。我們有一點(diǎn)須了解菇绵,在特定的時(shí)間段內(nèi)肄渗,我們認(rèn)為數(shù)據(jù)產(chǎn)品中的數(shù)據(jù)是只讀的镇眷,這是利用緩存來(lái)提高性能的理論基礎(chǔ)咬最。

在上文圖2-6中我們看到,glider中存在兩層緩存欠动,分別是基于各個(gè)異構(gòu)“表”(datasource)的二級(jí)緩存和整合之后基于獨(dú)立請(qǐng)求的一級(jí)緩存永乌。除此之外,各個(gè)異構(gòu)“表”內(nèi)部可能還存在自己的緩存機(jī)制具伍。

圖2-7 緩存控制體系

圖2-7向我們展示了數(shù)據(jù)魔方在緩存控制方面的設(shè)計(jì)思路翅雏。用戶的請(qǐng)求中一定是帶了緩存控制的“命令”的,這包括URL中的query string人芽,和HTTP頭中的“If-None-Match”信息望几。并且,這個(gè)緩存控制“命令”一定會(huì)經(jīng)過(guò)層層傳遞萤厅,最終傳遞到底層存儲(chǔ)的異構(gòu)“表”模塊橄抹。

緩存系統(tǒng)往往有兩個(gè)問(wèn)題需要面對(duì)和考慮:緩存穿透與失效時(shí)的雪崩效應(yīng)。

緩存穿透是指查詢一個(gè)一定不存在的數(shù)據(jù)惕味,由于緩存是不命中時(shí)被動(dòng)寫(xiě)的楼誓,并且出于容錯(cuò)考慮,如果從存儲(chǔ)層查不到數(shù)據(jù)則不寫(xiě)入緩存名挥,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到存儲(chǔ)層去查詢疟羹,失去了緩存的意義。至于如何有效地解決緩存穿透問(wèn)題禀倔,最常見(jiàn)的則是采用布隆過(guò)濾器(這個(gè)東西榄融,在我的此篇文章中有介紹:),將所有可能存在的數(shù)據(jù)哈希到一個(gè)足夠大的bitmap中救湖,一個(gè)一定不存在的數(shù)據(jù)會(huì)被這個(gè)bitmap攔截掉剃袍,從而避免了對(duì)底層存儲(chǔ)系統(tǒng)的查詢壓力。

而在數(shù)據(jù)魔方里捎谨,淘寶采用了一個(gè)更為簡(jiǎn)單粗暴的方法民效,如果一個(gè)查詢返回的數(shù)據(jù)為空(不管是數(shù)據(jù)不存在憔维,還是系統(tǒng)故障),我們?nèi)匀话堰@個(gè)空結(jié)果進(jìn)行緩存畏邢,但它的過(guò)期時(shí)間會(huì)很短业扒,最長(zhǎng)不超過(guò)五分鐘。

2舒萎、緩存失效時(shí)的雪崩效應(yīng)盡管對(duì)底層系統(tǒng)的沖擊非吵檀ⅲ可怕。但遺憾的是臂寝,這個(gè)問(wèn)題目前并沒(méi)有很完美的解決方案章鲤。大多數(shù)系統(tǒng)設(shè)計(jì)者考慮用加鎖或者隊(duì)列的方式保證緩存的單線程(進(jìn)程)寫(xiě),從而避免失效時(shí)大量的并發(fā)請(qǐng)求落到底層存儲(chǔ)系統(tǒng)上咆贬。

在數(shù)據(jù)魔方中败徊,淘寶設(shè)計(jì)的緩存過(guò)期機(jī)制理論上能夠?qū)⒏鱾€(gè)客戶端的數(shù)據(jù)失效時(shí)間均勻地分布在時(shí)間軸上,一定程度上能夠避免緩存同時(shí)失效帶來(lái)的雪崩效應(yīng)掏缎。

本文參考:

基于云計(jì)算的海量數(shù)據(jù)存儲(chǔ)模型皱蹦,侯建等。

基于hadoop的海量日志數(shù)據(jù)處理眷蜈,王小森

基于hadoop的大規(guī)模數(shù)據(jù)處理系統(tǒng)沪哺,王麗兵。

淘寶數(shù)據(jù)魔方技術(shù)架構(gòu)解析酌儒,朋春辜妓。

Hadoop作業(yè)調(diào)優(yōu)參數(shù)整理及原理,guili忌怎。

掃描下方二維碼籍滴,關(guān)注我們。每天都有精彩內(nèi)容哦呆躲!~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末异逐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子插掂,更是在濱河造成了極大的恐慌灰瞻,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辅甥,死亡現(xiàn)場(chǎng)離奇詭異酝润,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)璃弄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)要销,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人夏块,你說(shuō)我怎么就攤上這事疏咐∠说В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵浑塞,是天一觀的道長(zhǎng)借跪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)酌壕,這世上最難降的妖魔是什么掏愁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮卵牍,結(jié)果婚禮上果港,老公的妹妹穿的比我還像新娘。我一直安慰自己糊昙,他們只是感情好辛掠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著溅蛉,像睡著了一般公浪。 火紅的嫁衣襯著肌膚如雪他宛。 梳的紋絲不亂的頭發(fā)上船侧,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音厅各,去河邊找鬼镜撩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛队塘,可吹牛的內(nèi)容都是我干的袁梗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼憔古,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遮怜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鸿市,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锯梁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后焰情,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體陌凳,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年内舟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了合敦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡验游,死狀恐怖充岛,靈堂內(nèi)的尸體忽然破棺而出保檐,到底是詐尸還是另有隱情,我是刑警寧澤崔梗,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布展东,位于F島的核電站,受9級(jí)特大地震影響炒俱,放射性物質(zhì)發(fā)生泄漏盐肃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一权悟、第九天 我趴在偏房一處隱蔽的房頂上張望砸王。 院中可真熱鬧,春花似錦峦阁、人聲如沸谦铃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驹闰。三九已至,卻和暖如春撒会,著一層夾襖步出監(jiān)牢的瞬間嘹朗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工诵肛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屹培,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓怔檩,卻偏偏與公主長(zhǎng)得像褪秀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薛训,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容