从hadoop框架与MapReduce模式中谈海量数据处理
前言
??? 幾周前,當(dāng)我最初聽到,以致后來初次接觸Hadoop與MapReduce這兩個(gè)東西,我便稍顯興奮,覺得它們很是神秘,而神秘的東西常能勾起我的興趣,在看過介紹它們的文章或論文之后,覺得Hadoop是一項(xiàng)富有趣味和挑戰(zhàn)性的技術(shù),且它還牽扯到了一個(gè)我更加感興趣的話題:海量數(shù)據(jù)處理。
??? 由此,最近凡是空閑時(shí),便在看“Hadoop”,“MapReduce”“海量數(shù)據(jù)處理”這方面的論文。但在看論文的過程中,總覺得那些論文都是淺嘗輒止,常常看的很不過癮,總是一個(gè)東西剛要講到緊要處,它便結(jié)束了,讓我好生“憤懣”。
??? 盡管我對這個(gè)Hadoop與MapReduce知之甚淺,但我還是想記錄自己的學(xué)習(xí)過程,說不定,關(guān)于這個(gè)東西的學(xué)習(xí)能督促我最終寫成和“經(jīng)典算法研究系列”一般的一系列文章。
??? Ok,閑話少說。本文從最基本的mapreduce模式,Hadoop框架開始談起,然后由各自的架構(gòu)引申開來,談到海量數(shù)據(jù)處理,最后談?wù)勌詫毜暮A繑?shù)據(jù)產(chǎn)品技術(shù)架構(gòu),以為了兼?zhèn)錅\出與深入之效,最終,希望得到讀者的喜歡與支持。謝謝。
??? 由于本人是初次接觸這兩個(gè)東西,文章有任何問題,歡迎不吝指正。Ok,咱們開始吧。
第一部分、mapreduce模式與hadoop框架深入淺出
架構(gòu)扼要
???????? 想讀懂此文,讀者必須先要明確以下幾點(diǎn),以作為閱讀后續(xù)內(nèi)容的基礎(chǔ)知識儲備:
??? 所以,你現(xiàn)在,知道了什么是mapreduce,什么是hadoop,以及這兩者之間最簡單的聯(lián)系,而本文的主旨即是,一句話概括:在hadoop的框架上采取mapreduce的模式處理海量數(shù)據(jù)。下面,咱們可以依次深入學(xué)習(xí)和了解mapreduce和hadoop這兩個(gè)東西了。
Mapreduce模式
??? 前面說了,mapreduce是一種模式,一種什么模式呢?一種云計(jì)算的核心計(jì)算模式,一種分布式運(yùn)算技術(shù),也是簡化的分布式編程模式,它主要用于解決問題的程序開發(fā)模型,也是開發(fā)人員拆解問題的方法。
??? Ok,光說不上圖,沒用。如下圖所示,mapreduce模式的主要思想是將自動(dòng)分割要執(zhí)行的問題(例如程序)拆解成map(映射)和reduce(化簡)的方式,流程圖如下圖1所示:
??? 在數(shù)據(jù)被分割后通過Map 函數(shù)的程序?qū)?shù)據(jù)映射成不同的區(qū)塊,分配給計(jì)算機(jī)機(jī)群處理達(dá)到分布式運(yùn)算的效果,在通過Reduce 函數(shù)的程序?qū)⒔Y(jié)果匯整,從而輸出開發(fā)者需要的結(jié)果。
??? MapReduce 借鑒了函數(shù)式程序設(shè)計(jì)語言的設(shè)計(jì)思想,其軟件實(shí)現(xiàn)是指定一個(gè)Map 函數(shù),把鍵值對(key/value)映射成新的鍵值對(key/value),形成一系列中間結(jié)果形式的key/value 對,然后把它們傳給Reduce(規(guī)約)函數(shù),把具有相同中間形式key 的value 合并在一起。Map 和Reduce 函數(shù)具有一定的關(guān)聯(lián)性。函數(shù)描述如表1 所示:
??? MapReduce致力于解決大規(guī)模數(shù)據(jù)處理的問題,因此在設(shè)計(jì)之初就考慮了數(shù)據(jù)的局部性原理,利用局部性原理將整個(gè)問題分而治之。MapReduce集群由普通PC機(jī)構(gòu)成,為無共享式架構(gòu)。在處理之前,將數(shù)據(jù)集分布至各個(gè)節(jié)點(diǎn)。處理時(shí),每個(gè)節(jié)點(diǎn)就近讀取本地存儲的數(shù)據(jù)處理(map),將處理后的數(shù)據(jù)進(jìn)行合并(combine)、排序(shuffle and sort)后再分發(fā)(至reduce節(jié)點(diǎn)),避免了大量數(shù)據(jù)的傳輸,提高了處理效率。無共享式架構(gòu)的另一個(gè)好處是配合復(fù)制(replication)策略,集群可以具有良好的容錯(cuò)性,一部分節(jié)點(diǎn)的down機(jī)對集群的正常工作不會造成影響。
??? ok,你可以再簡單看看下副圖,整幅圖是有關(guān)hadoop的作業(yè)調(diào)優(yōu)參數(shù)及原理,圖的左邊是MapTask運(yùn)行示意圖,右邊是ReduceTask運(yùn)行示意圖:
??? 如上圖所示,其中map階段,當(dāng)map task開始運(yùn)算,并產(chǎn)生中間數(shù)據(jù)后并非直接而簡單的寫入磁盤,它首先利用內(nèi)存buffer來對已經(jīng)產(chǎn)生的buffer進(jìn)行緩存,并在內(nèi)存buffer中進(jìn)行一些預(yù)排序來優(yōu)化整個(gè)map的性能。而上圖右邊的reduce階段則經(jīng)歷了三個(gè)階段,分別Copy->Sort->reduce。我們能明顯的看出,其中的Sort是采用的歸并排序,即merge sort。
??? 了解了什么是mapreduce,接下來,咱們可以來了解實(shí)現(xiàn)了mapreduce模式的開源框架—hadoop。
Hadoop框架
??? 前面說了,hadoop是一個(gè)框架,一個(gè)什么樣的框架呢?Hadoop 是一個(gè)實(shí)現(xiàn)了MapReduce 計(jì)算模型的開源分布式并行編程框架,程序員可以借助Hadoop 編寫程序,將所編寫的程序運(yùn)行于計(jì)算機(jī)機(jī)群上,從而實(shí)現(xiàn)對海量數(shù)據(jù)的處理。
??? 此外,Hadoop 還提供一個(gè)分布式文件系統(tǒng)(HDFS)及分布式數(shù)據(jù)庫(HBase)用來將數(shù)據(jù)存儲或部署到各個(gè)計(jì)算節(jié)點(diǎn)上。所以,你可以大致認(rèn)為:Hadoop=HDFS(文件系統(tǒng),數(shù)據(jù)存儲技術(shù)相關(guān))+HBase(數(shù)據(jù)庫)+MapReduce(數(shù)據(jù)處理)。Hadoop 框架如圖2 所示:
??? 借助Hadoop 框架及云計(jì)算核心技術(shù)MapReduce 來實(shí)現(xiàn)數(shù)據(jù)的計(jì)算和存儲,并且將HDFS 分布式文件系統(tǒng)和HBase 分布式數(shù)據(jù)庫很好的融入到云計(jì)算框架中,從而實(shí)現(xiàn)云計(jì)算的分布式、并行計(jì)算和存儲,并且得以實(shí)現(xiàn)很好的處理大規(guī)模數(shù)據(jù)的能力。
Hadoop的組成部分
??? 我們已經(jīng)知道,Hadoop是Google的MapReduce一個(gè)Java實(shí)現(xiàn)。MapReduce是一種簡化的分布式編程模式,讓程序自動(dòng)分布到一個(gè)由普通機(jī)器組成的超大集群上并發(fā)執(zhí)行。Hadoop主要由HDFS、MapReduce和HBase等組成。具體的hadoop的組成如下圖:
??? 由上圖,我們可以看到:
??? 1、?????????????Hadoop HDFS是Google GFS存儲系統(tǒng)的開源實(shí)現(xiàn),主要應(yī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和客戶端對文件的訪問。Datanode在集群中一般是一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理節(jié)點(diǎn)上它們附帶的存儲。在內(nèi)部,一個(gè)文件其實(shí)分成一個(gè)或多個(gè)block,這些block存儲在Datanode集合里。如下圖所示(HDFS體系結(jié)構(gòu)圖):
??? 2、?????????????Hadoop MapReduce是一個(gè)使用簡易的軟件框架,基于它寫出來的應(yīng)用程序能夠運(yùn)行在由上千個(gè)商用機(jī)器組成的大型集群上,并以一種可靠容錯(cuò)的方式并行處理上TB級別的數(shù)據(jù)集。
??? 一個(gè)MapReduce作業(yè)(job)通常會把輸入的數(shù)據(jù)集切分為若干獨(dú)立的數(shù)據(jù)塊,由 Map任務(wù)(task)以完全并行的方式處理它們。框架會對Map的輸出先進(jìn)行排序,然后把結(jié)果輸入給Reduce任務(wù)。通常作業(yè)的輸入和輸出都會被存儲在文件系統(tǒng)中。整個(gè)框架負(fù)責(zé)任務(wù)的調(diào)度和監(jiān)控,以及重新執(zhí)行已經(jīng)失敗的任務(wù)。如下圖所示(Hadoop MapReduce處理流程圖):
??? 3、?????????????Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉庫工具,處理能力強(qiáng)而且成本低廉。
主要特點(diǎn):
存儲方式是將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表。提供類SQL語言,實(shí)現(xiàn)完整的SQL查詢功能。可以將SQL語句轉(zhuǎn)換為MapReduce任務(wù)運(yùn)行,十分適合數(shù)據(jù)倉庫的統(tǒng)計(jì)分析。
不足之處:
采用行存儲的方式(SequenceFile)來存儲和讀取數(shù)據(jù)。效率低:當(dāng)要讀取數(shù)據(jù)表某一列數(shù)據(jù)時(shí)需要先取出所有數(shù)據(jù)然后再提取出某一列的數(shù)據(jù),效率很低。同時(shí),它還占用較多的磁盤空間。
由于以上的不足,有人(查禮博士)介紹了一種將分布式數(shù)據(jù)處理系統(tǒng)中以記錄為單位的存儲結(jié)構(gòu)變?yōu)橐粤袨閱挝坏拇鎯Y(jié)構(gòu),進(jìn)而減少磁盤訪問數(shù)量,提高查詢處理性能。這樣,由于相同屬性值具有相同數(shù)據(jù)類型和相近的數(shù)據(jù)特性,以屬性值為單位進(jìn)行壓縮存儲的壓縮比更高,能節(jié)省更多的存儲空間。如下圖所示(行列存儲的比較圖):
4、?????????????HBase
??? HBase是一個(gè)分布式的、面向列的開源數(shù)據(jù)庫,它不同于一般的關(guān)系數(shù)據(jù)庫,是一個(gè)適合于非結(jié)構(gòu)化數(shù)據(jù)存儲的數(shù)據(jù)庫。另一個(gè)不同的是HBase基于列的而不是基于行的模式。HBase使用和 BigTable非常相同的數(shù)據(jù)模型。用戶存儲數(shù)據(jù)行在一個(gè)表里。一個(gè)數(shù)據(jù)行擁有一個(gè)可選擇的鍵和任意數(shù)量的列,一個(gè)或多個(gè)列組成一個(gè)ColumnFamily,一個(gè)Fmaily下的列位于一個(gè)HFile中,易于緩存數(shù)據(jù)。表是疏松的存儲的,因此用戶可以給行定義各種不同的列。在HBase中數(shù)據(jù)按主鍵排序,同時(shí)表按主鍵劃分為多個(gè)HRegion,如下圖所示(HBase數(shù)據(jù)表結(jié)構(gòu)圖):
??? Ok,行文至此,看似洋洋灑灑近千里,但若給讀者造成閱讀上的負(fù)擔(dān),則不是我本意。接下來的內(nèi)容,我不會再引用諸多繁雜的專業(yè)術(shù)語,以給讀者心里上造成不良影響。
??? 我再給出一副圖,算是對上文所說的hadoop框架及其組成部分做個(gè)總結(jié),如下圖所示,便是hadoop的內(nèi)部結(jié)構(gòu),我們可以看到,海量的數(shù)據(jù)交給hadoop處理后,在hadoop的內(nèi)部中,正如上文所述:hadoop提供一個(gè)分布式文件系統(tǒng)(HDFS)及分布式數(shù)據(jù)庫(Hbase)用來存儲或部署到各個(gè)計(jì)算點(diǎn)上,最終在內(nèi)部采取mapreduce的模式對其數(shù)據(jù)進(jìn)行處理,然后輸出處理結(jié)果:
?
?
第二部分、淘寶海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)解讀—學(xué)習(xí)海量數(shù)據(jù)處理經(jīng)驗(yàn)
??? 在上面的本文的第一部分中,我們已經(jīng)對mapreduce模式及hadoop框架有了一個(gè)深入而全面的了解。不過,如果一個(gè)東西,或者一個(gè)概念不放到實(shí)際應(yīng)用中去,那么你對這個(gè)理念永遠(yuǎn)只是停留在理論之內(nèi),無法向?qū)嵺`邁進(jìn)。
??? Ok,接下來,本文的第二部分,咱們以淘寶的數(shù)據(jù)魔方技術(shù)架構(gòu)為依托,通過介紹淘寶的海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu),來進(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),咱們下面要針對這個(gè)架構(gòu)來一一剖析與解讀。
??? 相信,看過本博客內(nèi)其它文章的細(xì)心讀者,定會發(fā)現(xiàn),圖2-1最初見于本博客內(nèi)的此篇文章:從幾幅架構(gòu)圖中偷得半點(diǎn)海量數(shù)據(jù)處理經(jīng)驗(yàn)之上,同時(shí),此圖2-1最初發(fā)表于《程序員》8月刊,作者:朋春。
??? 在此之前,有一點(diǎn)必須說明的是:本文下面的內(nèi)容大都是參考自朋春先生的這篇文章:淘寶數(shù)據(jù)魔方技術(shù)架構(gòu)解析所寫,我個(gè)人所作的工作是對這篇文章的一種解讀與關(guān)鍵技術(shù)和內(nèi)容的抽取,以為讀者更好的理解淘寶的海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)。與此同時(shí),還能展示我自己讀此篇的思路與感悟,順帶學(xué)習(xí),何樂而不為呢?。
??? Ok,不過,與本博客內(nèi)之前的那篇文章(幾幅架構(gòu)圖中偷得半點(diǎn)海量數(shù)據(jù)處理經(jīng)驗(yàn))不同,本文接下來,要詳細(xì)闡述這個(gè)架構(gòu)。我也做了不少準(zhǔn)備工作(如把這圖2-1打印了下來,經(jīng)常琢磨):
?
??????????????????????????????????????????? ? 圖2-1 淘寶海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)
??? 好的,如上圖所示,我們可以看到,淘寶的海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu),分為以下五個(gè)層次,從上至下來看,它們分別是:數(shù)據(jù)源,計(jì)算層,存儲層,查詢層和產(chǎn)品層。我們來一一了解這五層:
??? 接下來,咱們重點(diǎn)來了解第三層-存儲層中的MyFox與Prom,然后會稍帶分析下glide的技術(shù)架構(gòu),最后,再了解下緩存。文章即宣告結(jié)束。
??? 我們知道,關(guān)系型數(shù)據(jù)庫在我們現(xiàn)在的工業(yè)生產(chǎn)中有著廣泛的引用,它包括Oracle,MySQL、DB2、Sybase和SQL Server等等。
MyFOX
??? 淘寶選擇了MySQL的MyISAM引擎作為底層的數(shù)據(jù)存儲引擎。且為了應(yīng)對海量數(shù)據(jù),他們設(shè)計(jì)了分布式MySQL集群的查詢代理層-MyFOX。
如下圖所示,是MySQL的數(shù)據(jù)查詢過程:
??????????????????????????????????????????????????????????? 圖2-2 MyFOX的數(shù)據(jù)查詢過程
??? 在MyFOX的每一個(gè)節(jié)點(diǎn)中,存放著熱節(jié)點(diǎn)和冷節(jié)點(diǎn)兩種節(jié)點(diǎn)數(shù)據(jù)。顧名思義,熱節(jié)點(diǎn)存放著最新的,被訪問頻率較高的數(shù)據(jù);冷節(jié)點(diǎn),存放著相對而來比較舊的,訪問頻率比較低的數(shù)據(jù)。而為了存儲這兩種節(jié)點(diǎn)數(shù)據(jù),出于硬件條件和存儲成本的考慮,你當(dāng)然會考慮選擇兩種不同的硬盤,來存儲這兩種訪問頻率不同的節(jié)點(diǎn)數(shù)據(jù)。如下圖所示:
?????????????????????????????????????????????????????????? 圖2-3 MyFOX節(jié)點(diǎn)結(jié)構(gòu)
??? ?“熱節(jié)點(diǎn)”,選擇每分鐘15000轉(zhuǎn)的SAS硬盤,按照一個(gè)節(jié)點(diǎn)兩臺機(jī)器來計(jì)算,單位數(shù)據(jù)的存儲成本約為4.5W/TB。相對應(yīng)地,“冷數(shù)據(jù)”我們選擇了每分鐘7500轉(zhuǎn)的SATA硬盤,單碟上能夠存放更多的數(shù)據(jù),存儲成本約為1.6W/TB。
Prom
出于文章篇幅的考慮,本文接下來不再過多闡述這個(gè)Prom了。如下面兩幅圖所示,他們分別表示的是Prom的存儲結(jié)構(gòu)以及Prom查詢過程:
??????????????????????????????????????????????圖2-4 Prom的存儲結(jié)構(gòu)
?
????????????????????????????????????????????????????????? 圖2-5 Prom查詢過程
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)品和后端存儲,提供統(tǒng)一的數(shù)據(jù)查詢服務(wù)。
緩存
??? 除了起到隔離前后端以及異構(gòu)“表”之間的數(shù)據(jù)整合的作用之外,glider的另外一個(gè)不容忽視的作用便是緩存管理。我們有一點(diǎn)須了解,在特定的時(shí)間段內(nèi),我們認(rèn)為數(shù)據(jù)產(chǎn)品中的數(shù)據(jù)是只讀的,這是利用緩存來提高性能的理論基礎(chǔ)。
在上文圖2-6中我們看到,glider中存在兩層緩存,分別是基于各個(gè)異構(gòu)“表”(datasource)的二級緩存和整合之后基于獨(dú)立請求的一級緩存。除此之外,各個(gè)異構(gòu)“表”內(nèi)部可能還存在自己的緩存機(jī)制。
?????????????????????????????????????????? ????????????? ??圖2-7 緩存控制體系
??? 圖2-7向我們展示了數(shù)據(jù)魔方在緩存控制方面的設(shè)計(jì)思路。用戶的請求中一定是帶了緩存控制的“命令”的,這包括URL中的query string,和HTTP頭中的“If-None-Match”信息。并且,這個(gè)緩存控制“命令”一定會經(jīng)過層層傳遞,最終傳遞到底層存儲的異構(gòu)“表”模塊。
??? 緩存系統(tǒng)往往有兩個(gè)問題需要面對和考慮:緩存穿透與失效時(shí)的雪崩效應(yīng)。
??? 而在數(shù)據(jù)魔方里,淘寶采用了一個(gè)更為簡單粗暴的方法,如果一個(gè)查詢返回的數(shù)據(jù)為空(不管是數(shù)據(jù)不存在,還是系統(tǒng)故障),我們?nèi)匀话堰@個(gè)空結(jié)果進(jìn)行緩存,但它的過期時(shí)間會很短,最長不超過五分鐘。
??????2、緩存失效時(shí)的雪崩效應(yīng)盡管對底層系統(tǒng)的沖擊非常可怕。但遺憾的是,這個(gè)問題目前并沒有很完美的解決方案。大多數(shù)系統(tǒng)設(shè)計(jì)者考慮用加鎖或者隊(duì)列的方式保證緩存的單線程(進(jìn)程)寫,從而避免失效時(shí)大量的并發(fā)請求落到底層存儲系統(tǒng)上。
??? 在數(shù)據(jù)魔方中,淘寶設(shè)計(jì)的緩存過期機(jī)制理論上能夠?qū)⒏鱾€(gè)客戶端的數(shù)據(jù)失效時(shí)間均勻地分布在時(shí)間軸上,一定程度上能夠避免緩存同時(shí)失效帶來的雪崩效應(yīng)。
本文參考:
?
原文鏈接http://blog.csdn.net/v_july_v/article/details/6704077
轉(zhuǎn)載于:https://www.cnblogs.com/apex/p/3994050.html
總結(jié)
以上是生活随笔為你收集整理的从hadoop框架与MapReduce模式中谈海量数据处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP中不用第三个变量交换两个变量的值
- 下一篇: 自己写一个树形导航菜单