說(shuō)道Hadoop,就要先講到大數(shù)據(jù)。
上個(gè)世紀(jì),好遠(yuǎn)。。。九十年代后,開(kāi)始,數(shù)據(jù)開(kāi)始大量的產(chǎn)生,總之到了快沒(méi)法弄的程度了。
比如說(shuō)之前90年代,一個(gè)1G的硬盤(pán),傳輸速度4.4M每秒,讀取全盤(pán)大概需要5分鐘。
現(xiàn)在呢,一個(gè)1T的硬盤(pán),傳輸速度100M每秒,橫掃全盤(pán)2個(gè)半小時(shí),讀取全部數(shù)據(jù)的話。。。。。不知道多長(zhǎng)時(shí)間。
簡(jiǎn)單幾句帶過(guò),也就是說(shuō),數(shù)據(jù)太多了,我們?cè)撊绾谓鉀Q快速讀取的問(wèn)題。
那么就提出了分布式。
也就是說(shuō),我們用一頭牛去拉不動(dòng)火車(chē),就沒(méi)必要培養(yǎng)一頭又大又壯能拉動(dòng)火車(chē)的牛,只需要多弄些牛就可以了,小孩子都懂。
這樣呢,問(wèn)題就出現(xiàn)了,如何分配合控制這么多牛,就是我們的著手要解決的問(wèn)題了。那么這個(gè)道理就是分布式,一個(gè)簡(jiǎn)單的減少讀取數(shù)據(jù)時(shí)間的方法,就是同時(shí)從多塊硬盤(pán)上讀取。
如果我們有100塊硬盤(pán),每個(gè)存儲(chǔ)所有數(shù)據(jù)的1%,然后并行讀取,那么幾分鐘就能操作完成。但是只使用硬盤(pán)容量的1%的話,就太浪費(fèi)資源了。這樣,我們可以將數(shù)據(jù)分為100個(gè)數(shù)據(jù)集,每個(gè)數(shù)據(jù)集1T,并實(shí)現(xiàn)共享磁盤(pán)的訪問(wèn)。
可以想像,這樣便可以大量縮短數(shù)據(jù)分析的時(shí)間。有點(diǎn)像再說(shuō)P2P下載哈。但是象我剛才說(shuō)到的,處理多個(gè)硬盤(pán)數(shù)據(jù)的并行操作,還有很多問(wèn)題。
一般來(lái)說(shuō)呢,
第一,是如何解決硬盤(pán)故障問(wèn)題,硬盤(pán)越多,故障概率越高。
現(xiàn)在解決的方式就是建立副本。比如RAID方式,冗余磁盤(pán)陣列。或者在Hadoop中所采用的HDFS,也是一種方式,只是方法不同。
第二個(gè)問(wèn)題,數(shù)據(jù)分開(kāi)存儲(chǔ)到100塊硬盤(pán)上,那么,我們使用的時(shí)候而必須要合并使用。
在Hadoop中采用MapReduce來(lái)提供這個(gè)問(wèn)題的解決方法。
MapReduce和HDFS是Hadoop中的兩個(gè)重要部分,MapReduce提供了一個(gè)編程模型,將磁盤(pán)讀寫(xiě)問(wèn)題進(jìn)行抽象。我們可以理解HDFS像是數(shù)據(jù)庫(kù),而MapReduce那么像是SQL語(yǔ)句和引擎一樣運(yùn)作。
MapReduce將數(shù)據(jù)抽象成并演變成為對(duì)一個(gè)數(shù)據(jù)集(key/value對(duì)組成的集合)的計(jì)算。這個(gè)計(jì)算是由map和reduce兩部分所完成的,也就是將數(shù)據(jù)抽象成為map和reduce兩個(gè)對(duì)外的接口。
那么,簡(jiǎn)而言之,Hadoop能做到提供一個(gè)穩(wěn)定可靠的共享存儲(chǔ)和分析系統(tǒng)。
其中,
HDFS實(shí)現(xiàn)存儲(chǔ)
MapReduce實(shí)現(xiàn)分析處理
當(dāng)然Hadoop還有其他功能,但是這兩部分是我們所需要知道的,最重要的。
Hadoop和其他系統(tǒng)的比較
關(guān)于MapReduce的每個(gè)查詢(xún)基本上都需要處理整個(gè)map(整個(gè)數(shù)據(jù)集)或者至少要用到數(shù)據(jù)集的一大部分?jǐn)?shù)據(jù)。
MapReduce是一個(gè)批量查詢(xún)處理器,它能夠在合理的時(shí)間范圍內(nèi)處理針對(duì)整個(gè)數(shù)據(jù)集的即時(shí)查詢(xún)(Ad hoc)。
注:Ad hoc 查詢(xún)(即席查詢(xún))是信息學(xué)的一個(gè)術(shù)語(yǔ)。是拉丁語(yǔ)常用短語(yǔ),意思是“特設(shè)的、特定目的的(地)、即席的、臨時(shí)的”
優(yōu)點(diǎn):解放了以前存儲(chǔ)在磁盤(pán)上的數(shù)據(jù)。能在短時(shí)間內(nèi)處理以前很長(zhǎng)時(shí)間才能獲得的結(jié)果。
事例:使用Hadoop處理用戶(hù)日志。即席查詢(xún)找出用戶(hù)的地理分布。通過(guò)整合大量數(shù)據(jù),并使用MapReduce分析,
可以了解到我們以前不曾留意的數(shù)據(jù),運(yùn)用這些數(shù)據(jù)可以改善我們現(xiàn)有的服務(wù)。
那么,我們需要解釋一下,為什么上面的事情一樣可以用關(guān)系型數(shù)據(jù)庫(kù)來(lái)做到批量分析,而要用MapReduce。簡(jiǎn)單的從存儲(chǔ)數(shù)據(jù)開(kāi)始說(shuō)起,硬盤(pán)是我們存儲(chǔ)數(shù)據(jù)的主要介質(zhì),這里面就出現(xiàn)個(gè)問(wèn)題:
首先,硬盤(pán)讀取數(shù)據(jù)之前需要尋址,尋找到分散在硬盤(pán)上的各個(gè)地址上的數(shù)據(jù),那么這里產(chǎn)生兩個(gè)時(shí)間問(wèn)題,
第一是硬盤(pán)的尋址時(shí)間,第二是硬盤(pán)數(shù)據(jù)的傳輸時(shí)間。
尋址操作需要磁頭在硬盤(pán)上不斷移動(dòng)而在指定的位置進(jìn)行讀寫(xiě)。隨著硬盤(pán)技術(shù)的發(fā)展,尋址時(shí)間的提高遠(yuǎn)遠(yuǎn)落后于數(shù)據(jù)傳輸速率的進(jìn)步。這導(dǎo)致磁盤(pán)大量的尋址操作成為數(shù)據(jù)存儲(chǔ)的瓶頸,而數(shù)據(jù)傳輸速率取決于硬盤(pán)總線的帶寬。
對(duì)大量數(shù)據(jù)進(jìn)行訪問(wèn)中,包含由大量的磁盤(pán)尋址工作,那么讀取大量數(shù)據(jù)集就會(huì)花更長(zhǎng)的時(shí)間。
和關(guān)系型數(shù)據(jù)庫(kù)比較
那么HDFS和傳統(tǒng)的RDBMS各有什么優(yōu)缺點(diǎn)呢?
HDFS采用的是流式數(shù)據(jù)讀取模式,而流式數(shù)據(jù)讀取模式主要取決于數(shù)據(jù)的傳輸速率。RDBMS呢?采用的傳統(tǒng)的B樹(shù),RDBMS中使用的B樹(shù)結(jié)構(gòu),受限制于尋址的比例。
一般來(lái)說(shuō),對(duì)于大數(shù)據(jù)量的讀取流式模式的效率要遠(yuǎn)遠(yuǎn)高于B樹(shù)。但是當(dāng),只更新一小部分?jǐn)?shù)據(jù)的話,那么傳統(tǒng)的B樹(shù)更有優(yōu)勢(shì)。
因?yàn)樵诖髷?shù)據(jù)量更新時(shí),B樹(shù)需要使用sort/merge(排序/合并)來(lái)重建數(shù)據(jù)庫(kù)。也就是說(shuō),可以將MapReduce看作RDBMS的一個(gè)補(bǔ)充。
MapReduce適合以批處理的方式處理需要分析的整個(gè)數(shù)據(jù)集。它適合一次性寫(xiě)入,多次的讀取的應(yīng)用。
RDBMS適用于point query(點(diǎn)查詢(xún))和更新,數(shù)據(jù)集被建立索引后,數(shù)據(jù)庫(kù)能夠提供快速的數(shù)據(jù)檢索和少量的數(shù)據(jù)更新。它更適合持續(xù)更新的數(shù)據(jù)集。
RDBMS | MapReduce | |
數(shù)據(jù)大小 | GB | TB |
訪問(wèn) | 交互式和批處理 | 批處理 |
更新 | 多次讀寫(xiě) | 一次寫(xiě)入多次讀取 |
結(jié)構(gòu) | 靜態(tài)模式 | 動(dòng)態(tài)模式 |
完整性 | 高 | 低 |
橫向擴(kuò)展 | 非線性 | 線性 |
MapReduce和RDBMS之間的另外一個(gè)區(qū)別在于他們所操作的數(shù)據(jù)集的結(jié)構(gòu)化程度。
結(jié)構(gòu)化數(shù)據(jù)(structured data)是具有既定格式的實(shí)體化數(shù)據(jù),比如XML等滿(mǎn)足特定格式要求的數(shù)據(jù)表,比如數(shù)據(jù)庫(kù)表中的定義好的特定類(lèi)型的字段。
半結(jié)構(gòu)化數(shù)據(jù)(semi-structured data)屬于比較松散,雖然可能有格式,單常常被視而不見(jiàn),所以它只能用作數(shù)據(jù)結(jié)構(gòu)的一般說(shuō)明。比如,單元格組成的網(wǎng)格中,每個(gè)單元都可以保存任何形式的數(shù)據(jù)。
非結(jié)構(gòu)化數(shù)據(jù)(unstructured data)沒(méi)有特定的結(jié)構(gòu)。比如,文本文件,圖片,視頻。
MapReduce對(duì)于非結(jié)構(gòu)化或半結(jié)構(gòu)化數(shù)據(jù)的讀取是非常有效的,這時(shí)因?yàn)镸apReduce只有在讀取數(shù)據(jù)時(shí)才對(duì)數(shù)據(jù)進(jìn)行解釋。也就是說(shuō),MapReduce輸入的key和value并不是固定的屬性,而是又分析數(shù)據(jù)的用戶(hù)來(lái)指定的,就像object map。
而,RDBMS的數(shù)據(jù)往往是規(guī)范的(normalized),以能夠保持其數(shù)據(jù)的完整性且不含冗余。但是這種規(guī)范的數(shù)據(jù)卻給MapReduce的讀取帶來(lái)了麻煩,因?yàn)樗褂卯惖夭僮鬟M(jìn)行記錄的讀取工作,并且,MapReduce的核心價(jià)值之一,就是可以進(jìn)行高速流式讀寫(xiě)操作。
例如:web server上的日志就是一個(gè)典型的非結(jié)構(gòu)化非規(guī)范化的數(shù)據(jù)記錄,大家都知道,
所以MapReduce非常適合分析各種咋樣的日志,比如用戶(hù)登陸日志。MapReduce是一種線性可伸縮的編程模式。
程序猿可以編寫(xiě)兩個(gè)方法,分別為map和reduce,每個(gè)方法定義一個(gè)[key/value對(duì)集合]到另一個(gè)[key/value對(duì)集合]的映射。而這些方法并不需要關(guān)心數(shù)據(jù)集及其所用集群的大小,因此可以原封不動(dòng)地應(yīng)用到[小規(guī)模的數(shù)據(jù)集]或是 [大規(guī)模的數(shù)據(jù)集]。
注:就是說(shuō)方法寫(xiě)好后,數(shù)據(jù)大小無(wú)需考慮,方法都是一樣的。
另外一點(diǎn),如果輸入的數(shù)據(jù)量是原來(lái)的兩倍,那么運(yùn)行的時(shí)間也是原來(lái)的兩倍,但是,如果把集群的大小擴(kuò)大到原來(lái)的兩倍,那么運(yùn)行的時(shí)間就和原來(lái)一樣了。這個(gè)特性比RDBMS好哈,都懂哈!不過(guò)現(xiàn)在很多RDBMS開(kāi)始向著這方面發(fā)展,而,MapReduce也開(kāi)始具有了數(shù)據(jù)庫(kù)的一些特性。凌亂了~!
Hadoop與其他傳統(tǒng)工作方式的比較
這里大概可以粗略講到網(wǎng)格計(jì)算。
High Performance Computing(HPC高性能計(jì)算)和Grid Computing(網(wǎng)格計(jì)算)的組織,多年來(lái)一直在研究大數(shù)據(jù)處理方法。一般主要采用類(lèi)似于消息傳遞接口MPI(Message Passing Interface)的API。
HPC的方法是將任務(wù)分散到集群中的各臺(tái)計(jì)算機(jī)上,這些計(jì)算機(jī)訪問(wèn)由存儲(chǔ)區(qū)域網(wǎng)絡(luò)(Storage Area Network,SAN)組成的共享文件系統(tǒng)。
注:儲(chǔ)區(qū)域網(wǎng)絡(luò)(Storage Area Network,SAN)是一種連接外接存儲(chǔ)設(shè)備和服務(wù)器的架構(gòu)。包括磁盤(pán)陣列,磁帶柜等各種技術(shù)實(shí)現(xiàn)。該架構(gòu)的特點(diǎn)是,連接到服務(wù)器的存儲(chǔ)設(shè)備,將被操作系統(tǒng)視為直接連接的存儲(chǔ)設(shè)備進(jìn)行使用。
MapReduce實(shí)現(xiàn)計(jì)算節(jié)點(diǎn)數(shù)據(jù)本地化。
這種組成比較適用于計(jì)算密集型任務(wù),但是如果節(jié)點(diǎn)需要使用更大量的數(shù)據(jù)進(jìn)行計(jì)算時(shí),那么很多計(jì)算節(jié)點(diǎn)(也就是網(wǎng)格中計(jì)算單元)會(huì)由于網(wǎng)絡(luò)帶寬的瓶頸而變的空閑,且,一直等待數(shù)據(jù)的到來(lái),這時(shí)候MapReduce就開(kāi)始有用了。
MapReduce可以盡量把計(jì)算節(jié)點(diǎn)上存儲(chǔ)數(shù)據(jù),以實(shí)現(xiàn)數(shù)據(jù)的本地快速訪問(wèn)。而數(shù)據(jù)本地化(data locality)也正是MapReduce的一個(gè)核心特性。
當(dāng)我們現(xiàn)在意識(shí)到網(wǎng)絡(luò)帶寬是我們系統(tǒng)架構(gòu)中最寶貴的資源的時(shí)候,MapReduce則通過(guò)顯式網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)來(lái)盡量保留帶寬資源并且顯式網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)并沒(méi)有降低MapReduce的計(jì)算密集型的數(shù)據(jù)分析能力。
MapReduce無(wú)需考慮底層數(shù)據(jù)控制。
消息傳遞接口MPI給了程序員很大的控制空間,需要程序員顯式的控制數(shù)據(jù)流機(jī)制,包括底層的功能模塊(soket通信接口)和上層的數(shù)據(jù)分析算法。
而MapReduce則在更高層次上去運(yùn)行,也就是程序員只需要考慮如何操作數(shù)據(jù)集(key/value對(duì))就可以了。
MapReduce無(wú)需考慮節(jié)點(diǎn)失效。
大規(guī)模分布式計(jì)算的問(wèn)題在于,如何很好的協(xié)調(diào)各進(jìn)程之間關(guān)系。如何在處理一個(gè)計(jì)算過(guò)程處理失效的問(wèn)題中,在無(wú)法知道一個(gè)遠(yuǎn)程的進(jìn)程是否已經(jīng)失效的情況下,還要繼續(xù)去完成整個(gè)計(jì)算。
而,MapReduce給我們的是,無(wú)需考慮系統(tǒng)的部分失效的問(wèn)題,因?yàn)镸apReduce的系統(tǒng)實(shí)現(xiàn)能夠檢測(cè)到失敗的map或者reduce任務(wù),并讓某個(gè)其他節(jié)點(diǎn)正常的機(jī)器來(lái)重新執(zhí)行這些失敗的任務(wù)。
MapReduce采用無(wú)共享(shared-nothing)框架來(lái)實(shí)現(xiàn)失敗檢測(cè),這樣需要在各任務(wù)之間彼此獨(dú)立運(yùn)行。這樣,程序員就無(wú)需考慮各任務(wù)的執(zhí)行順序,至少是無(wú)關(guān)緊要的事情。
相比之下MPI雖然控制權(quán)比較大,但是也同樣加大了編程難度。(If there is great power comes great responsibility)
那么,MapReduce是個(gè)相當(dāng)嚴(yán)格的模型,用戶(hù)被限定于使用操作特定的數(shù)據(jù)集(key/value對(duì))。相對(duì)應(yīng)的mapper和reducer彼此之間可以做的協(xié)調(diào)是極其有限度的,僅僅是傳遞key/value對(duì)。
MapReduce適合于普通的分析和計(jì)算么?
其實(shí),MapReduce是用于構(gòu)建搜索引擎的索引,并且能夠非常好的完成。許多算法可以使用MapReduce來(lái)表達(dá),從圖形圖像分析到各類(lèi)機(jī)遇圖像的分析,再到機(jī)器學(xué)習(xí),都可以。MapReduce是由Google的工程師開(kāi)發(fā)的,靈感來(lái)自于傳統(tǒng)的函數(shù)式編程,分布式計(jì)算和數(shù)據(jù)庫(kù)社區(qū)。
它的優(yōu)秀,能夠完成我們的大部分需求。
和志愿計(jì)算的比較
志愿計(jì)算呢,就是很多志愿者將自己的計(jì)算機(jī)空閑出來(lái)的CPU時(shí)間志愿貢獻(xiàn)出來(lái),用來(lái)協(xié)助計(jì)算一些大型的計(jì)算事務(wù)。
比較有名的項(xiàng)目:
加利福尼亞大學(xué)的SETI@home,
全稱(chēng):Search for Extra-Terrestrial Intelligence(搜索外星智慧)項(xiàng)目。
志愿者把自己計(jì)算機(jī)的CPU空閑時(shí)間貢獻(xiàn)出來(lái)分析無(wú)線天文射電望遠(yuǎn)鏡的返回?cái)?shù)據(jù),借此尋找外星智慧生命信號(hào)。
可以通過(guò) http://setiathome.berkeley.edu/ 注冊(cè)參加,或者式了解這個(gè)項(xiàng)目。
其他還有很多類(lèi)似的項(xiàng)目,可以下載BOINCManager來(lái)參加這些項(xiàng)目為人類(lèi)作出些貢獻(xiàn)。
下載地址 http://boinc.berkeley.edu/download.php
這里用到志愿計(jì)算,志愿計(jì)算項(xiàng)目就是將需要解決的問(wèn)題分成多個(gè)塊,每個(gè)塊被稱(chēng)為一個(gè)工作單元或者(work unit)或者任務(wù)(task)。并將他們發(fā)到世界各地的電腦上進(jìn)行分析。
完成分析后,將數(shù)據(jù)發(fā)回到服務(wù)器合并,客戶(hù)端回獲得另外一個(gè)工作單元。為了防止欺騙星文,每個(gè)工作單元被分配到三個(gè)不同的機(jī)器上進(jìn)行執(zhí)行,并且至少收到兩個(gè)相同的結(jié)果才被接受。
這里看來(lái)志愿計(jì)算和MapReduce看上去很相似,都是將問(wèn)題分為獨(dú)立的單元,然后進(jìn)行并行計(jì)算。但,還是由很大的差異。
志愿計(jì)算問(wèn)題是CPU高度密集的,比較適合世界上成千上萬(wàn)的計(jì)算機(jī)上運(yùn)行,因?yàn)橛?jì)算時(shí)間遠(yuǎn)遠(yuǎn)大于傳輸數(shù)據(jù)的時(shí)間。而,志愿者貢獻(xiàn)的是CPU周期,而不是網(wǎng)絡(luò)帶寬。
MapReduce的設(shè)計(jì)目標(biāo)在于服務(wù)于那些只需要數(shù)分鐘或者幾小時(shí)就可以完成的即時(shí)任務(wù),并運(yùn)行于內(nèi)部通過(guò)高速網(wǎng)絡(luò)相互連接的網(wǎng)絡(luò)內(nèi),并且這個(gè)網(wǎng)絡(luò)內(nèi)的計(jì)算機(jī)需要由可靠的,定制的硬件構(gòu)成。此外,志愿計(jì)算需要在接入護(hù)兩旺的不可信的計(jì)算機(jī)上長(zhǎng)時(shí)間運(yùn)行,這些計(jì)算機(jī)具有不同的帶寬,且對(duì)數(shù)據(jù)本地化沒(méi)有太多要求。
作者:Markboo