2004年升敲,整個(gè)互聯(lián)網(wǎng)界還處于懵懂時(shí)代答倡,Google發(fā)布了三篇論文,分別是分布式文件系統(tǒng)GFS驴党,大數(shù)據(jù)分布式計(jì)算框架MapReduce瘪撇,分布式存儲(chǔ)系統(tǒng)bigTable。當(dāng)時(shí)Lucene開(kāi)源項(xiàng)目的創(chuàng)始人Dong Cutting在閱讀了Google的論文后港庄,非常贊嘆并且極為興奮倔既,之后根據(jù)論文細(xì)節(jié)原理初步實(shí)現(xiàn)了類(lèi)GFS和MapReduce的功能,這也是之后Hadoop的雛形鹏氧。
2006年渤涌,cutting將這些大數(shù)據(jù)相關(guān)的功能從Nutch中分離了出來(lái),啟動(dòng)了一個(gè)獨(dú)立的運(yùn)行維護(hù)大數(shù)據(jù)項(xiàng)目把还,這就是鼎鼎有名的Hadoop实蓬,主要包括分布式文件系統(tǒng)HDFS和計(jì)算引擎MapReduce。
HDFS采用master/slave架構(gòu)吊履。一個(gè)HDFS集群是有一個(gè)Namenode和一定數(shù)目的Datanode組成安皱。Namenode是一個(gè)中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的namespace和客戶端對(duì)文件的訪問(wèn)艇炎。Namenode執(zhí)行文件系統(tǒng)的namespace操作酌伊,例如打開(kāi)、關(guān)閉缀踪、重命名文件和目錄腺晾,同時(shí)決定block到具體Datanode節(jié)點(diǎn)的映射。Namenode和Datanode都是設(shè)計(jì)成可以跑在普通的廉價(jià)的運(yùn)行Linux的機(jī)器上辜贵。集群中單一Namenode的結(jié)構(gòu)大大簡(jiǎn)化了系統(tǒng)的架構(gòu)悯蝉。Namenode是所有HDFS元數(shù)據(jù)的仲裁者和管理者,Datanode在Namenode的指揮下進(jìn)行block的創(chuàng)建托慨、刪除和復(fù)制鼻由。Datanode在集群中一般是一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理節(jié)點(diǎn)上它們附帶的存儲(chǔ)。在內(nèi)部蕉世,一個(gè)文件其實(shí)分成一個(gè)或多個(gè)block蔼紧,這些block存儲(chǔ)在Datanode集合里。
MapReduce 來(lái)處理大數(shù)據(jù)集的過(guò)程, 這個(gè) MapReduce 的計(jì)算過(guò)程簡(jiǎn)而言之狠轻,就是將大數(shù)據(jù)集分解為成百上千的小數(shù)據(jù)集奸例,每個(gè)(或若干個(gè))數(shù)據(jù)集分別由集群中的一個(gè)結(jié)點(diǎn)(一般就是一臺(tái)普通的計(jì)算機(jī))進(jìn)行處理并生成中間結(jié)果,然后這些中間結(jié)果又由大量的結(jié)點(diǎn)進(jìn)行合并, 形成最終結(jié)果向楼。
計(jì)算模型的核心是 Map 和 Reduce 兩個(gè)函數(shù)查吊,這兩個(gè)函數(shù)由用戶負(fù)責(zé)實(shí)現(xiàn),功能是按一定的映射規(guī)則將輸入的 <key, value> 對(duì)轉(zhuǎn)換成另一個(gè)或一批 <key, value> 對(duì)輸出湖蜕。
這段期間人們需要編寫(xiě)MapReduce程序逻卖,然后丟到Hadoop平臺(tái)在運(yùn)行,有人覺(jué)得編寫(xiě)MapReduce程序很麻煩昭抒,于是FaceBook發(fā)布了Hive评也,Hive支持sql語(yǔ)法來(lái)進(jìn)行大數(shù)據(jù)計(jì)算,Hive會(huì)將sql語(yǔ)句轉(zhuǎn)換成MapReduce的計(jì)算程序灭返。所以這時(shí)期那些熟悉數(shù)據(jù)庫(kù)的工程師們便可以無(wú)門(mén)檻的使用大數(shù)據(jù)技術(shù)來(lái)進(jìn)行分析和處理了盗迟。Hive的出現(xiàn)極大的降低Hadoop的使用難度,2011年的時(shí)候熙含,F(xiàn)acebook大數(shù)據(jù)平臺(tái)上運(yùn)行的作業(yè)90%都來(lái)源于Hive罚缕。
在Hadoop早期,MapReduce既是一個(gè)執(zhí)行引擎婆芦,又是一個(gè)資源調(diào)度框架怕磨,服務(wù)器集群的資源調(diào)度管理由MapReduce自己完成。但是這樣不利于資源復(fù)用消约,也使得MapReduce非常臃腫肠鲫。于是一個(gè)新項(xiàng)目啟動(dòng)了,將MapReduce執(zhí)行引擎和資源調(diào)度分離開(kāi)來(lái)或粮,這就是Yarn导饲。2012年,Yarn成為一個(gè)獨(dú)立的項(xiàng)目開(kāi)始運(yùn)營(yíng)氯材,隨后被各類(lèi)大數(shù)據(jù)產(chǎn)品支持渣锦,成為大數(shù)據(jù)平臺(tái)上最主流的資源調(diào)度系統(tǒng)。
同樣是在2012年氢哮,UC伯克利AMP實(shí)驗(yàn)室(Algorithms袋毙、Machine和People的縮寫(xiě))開(kāi)發(fā)的Spark開(kāi)始嶄露頭角。當(dāng)時(shí)AMP實(shí)驗(yàn)室的馬鐵博士發(fā)現(xiàn)使用MapReduce進(jìn)行機(jī)器學(xué)習(xí)計(jì)算的時(shí)候性能非常差冗尤,因?yàn)闄C(jī)器學(xué)習(xí)算法通常需要進(jìn)行很多次的迭代計(jì)算听盖,而MapReduce每執(zhí)行一次Map和Reduce計(jì)算都需要重新啟動(dòng)一次作業(yè)胀溺,帶來(lái)大量的無(wú)謂消耗。還有一點(diǎn)就是MapReduce主要使用磁盤(pán)作為存儲(chǔ)介質(zhì)皆看,而2012年的時(shí)候仓坞,內(nèi)存已經(jīng)突破容量和成本限制,成為數(shù)據(jù)運(yùn)行過(guò)程中主要的存儲(chǔ)介質(zhì)腰吟。Spark一經(jīng)推出无埃,立即受到業(yè)界的追捧,并逐步替代MapReduce在企業(yè)應(yīng)用中的地位毛雇。Spark的優(yōu)點(diǎn)如下
1.運(yùn)行速度快,Spark擁有DAG執(zhí)行引擎嫉称,支持在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行迭代計(jì)算。官方提供的數(shù)據(jù)表明禾乘,如果數(shù)據(jù)由磁盤(pán)讀取澎埠,速度是Hadoop MapReduce的10倍以上虽缕,如果數(shù)據(jù)從內(nèi)存中讀取始藕,速度可以高達(dá)100多倍。
2.適用場(chǎng)景廣泛,大數(shù)據(jù)分析統(tǒng)計(jì)氮趋,實(shí)時(shí)數(shù)據(jù)處理伍派,圖計(jì)算及機(jī)器學(xué)習(xí)
3.易用性,編寫(xiě)簡(jiǎn)單,支持80種以上的高級(jí)算子剩胁,支持多種語(yǔ)言诉植,數(shù)據(jù)源豐富,可部署在多種集群中
4.容錯(cuò)性高昵观。Spark引進(jìn)了彈性分布式數(shù)據(jù)集RDD (Resilient Distributed Dataset) 的抽象晾腔,它是分布在一組節(jié)點(diǎn)中的只讀對(duì)象集合,這些集合是彈性的啊犬,如果數(shù)據(jù)集一部分丟失灼擂,則可以根據(jù)“血統(tǒng)”(即充許基于數(shù)據(jù)衍生過(guò)程)對(duì)它們進(jìn)行重建。另外在RDD計(jì)算時(shí)可以通過(guò)CheckPoint來(lái)實(shí)現(xiàn)容錯(cuò)觉至,而CheckPoint有兩種方式:CheckPoint Data剔应,和Logging The Updates,用戶可以控制采用哪種方式來(lái)實(shí)現(xiàn)容錯(cuò)语御。
用戶編排的代碼由一個(gè)個(gè)的RDD Objects組成峻贮,DAGScheduler負(fù)責(zé)根據(jù)RDD的寬依賴拆分DAG為一個(gè)個(gè)的Stage,每個(gè)Stage包含一組邏輯完全相同的可以并發(fā)執(zhí)行的Task应闯。TaskScheduler負(fù)責(zé)將Task推送給從ClusterManager那里獲取到的Worker啟動(dòng)的Executor纤控。
一般說(shuō)來(lái),像MapReduce碉纺、Spark這類(lèi)計(jì)算框架處理的業(yè)務(wù)場(chǎng)景都被稱(chēng)作批處理計(jì)算船万,因?yàn)樗鼈兺ǔa槍?duì)以“天”為單位產(chǎn)生的數(shù)據(jù)進(jìn)行一次計(jì)算细层,然后得到需要的結(jié)果,這中間計(jì)算需要花費(fèi)的時(shí)間大概是幾十分鐘甚至更長(zhǎng)的時(shí)間唬涧。因?yàn)橛?jì)算的數(shù)據(jù)是非在線得到的實(shí)時(shí)數(shù)據(jù)疫赎,而是歷史數(shù)據(jù),所以這類(lèi)計(jì)算也被稱(chēng)為大數(shù)據(jù)離線計(jì)算碎节。
而在大數(shù)據(jù)領(lǐng)域捧搞,還有另外一類(lèi)應(yīng)用場(chǎng)景,它們需要對(duì)實(shí)時(shí)產(chǎn)生的大量數(shù)據(jù)進(jìn)行即時(shí)計(jì)算狮荔,比如對(duì)于遍布城市的監(jiān)控?cái)z像頭進(jìn)行人臉識(shí)別和嫌犯追蹤胎撇。這類(lèi)計(jì)算稱(chēng)為大數(shù)據(jù)流計(jì)算,相應(yīng)地殖氏,有Storm晚树、Flink、Spark Streaming等流計(jì)算框架來(lái)滿足此類(lèi)大數(shù)據(jù)應(yīng)用的場(chǎng)景雅采。 流式計(jì)算要處理的數(shù)據(jù)是實(shí)時(shí)在線產(chǎn)生的數(shù)據(jù)爵憎,所以這類(lèi)計(jì)算也被稱(chēng)為大數(shù)據(jù)實(shí)時(shí)計(jì)算。
在典型的大數(shù)據(jù)的業(yè)務(wù)場(chǎng)景下婚瓜,數(shù)據(jù)業(yè)務(wù)最通用的做法是宝鼓,采用批處理的技術(shù)處理歷史全量數(shù)據(jù),采用流式計(jì)算處理實(shí)時(shí)新增數(shù)據(jù)巴刻。而像Flink這樣的計(jì)算引擎愚铡,可以同時(shí)支持流式計(jì)算和批處理計(jì)算