原創|行業資訊|編輯:陳俊吉|2017-04-28 10:42:06.000|閱讀 1031 次
概述:Hadoop是Apache開源組織的一個分布式計算開源框架,在很多大型網站上都已經得到了應用,如亞馬遜、Facebook和Yahoo等等。對于我來說,最近的一個使用點就是服務集成平臺的日志分析。服務集成平臺的日志量將會很大,而這也正好符合了分布式計算的適用場景(日志分析和索引建立就是兩大應用場景)。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在SIP項目設計的過程中,對于它龐大的日志在開始時就考慮使用任務分解的多線程處理模式來分析統計,在我從前寫的文章《Tiger Concurrent Practice —日志分析并行分解設計與實現》中有所提到。但是由于統計的內容暫時還是十分簡單,所以就采用Memcache作為計數器,結合MySQL就完成了訪問控制以及統計的工作。然而未來,對于海量的工作,還是需要有所準備?,F在最火的技術詞匯莫過于“云計算”,在Open API日益盛行的今天,互聯網應用的數據將會越來越有價值,如何去分析這些數據,挖掘其內在價值,就需要分布式計算來支撐海量數據的分析工作。
回過頭來看,早先那種多線程,多任務分解的日志分析設計,其實是分布式計算的一個單機版縮略,如何將這種單機的工作進行分拆,變成協同工作的集群,其實就是設計所涉及的。在去年參加BEA大會的時候,BEA和VMWare合作采用虛擬機來構建集群,無非就是希望使得計算機硬件能夠類似于應用程序中資源池的資源,使用者無需關心資源的分配情況,從而最大化了硬件資源的使用價值。分布式計算也是如此,具體的計算任務交由哪一臺機器執行,執行后由誰來匯總,這都由分布式框架的Master來抉擇,而使用者只需簡單地將待分析內容提供給系統作為輸入,就可以得到分布式計算后的結果。
是Apache開源組織的一個分布式計算開源框架,在很多大型網站上都已經得到了應用,如亞馬遜、Facebook和Yahoo等等。對于我來說,最近的一個使用點就是服務集成平臺的日志分析。服務集成平臺的日志量將會很大,而這也正好符合了分布式計算的適用場景(日志分析和索引建立就是兩大應用場景)。
當前沒有正式確定使用,所以也是自己業余摸索,后續所寫的相關內容,都是一個新手的學習過程,難免會有一些錯誤,只是希望記錄下來可以分享給更多志同道合的朋友。
搞什么東西之前,第一步是要知道What(是什么),然后是Why(為什么),最后才是How(怎么做)。但很多開發的朋友在做了多年項目以后,都習慣是先How,然后What,最后才是Why,這樣只會讓自己變得浮躁,同時往往會將技術誤用于不適合的場景。
Hadoop框架中最核心的設計就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapReduce就是“任務的分解與結果的匯總”。HDFS是Hadoop分布式文件系統(Hadoop Distributed File System)的縮寫,為分布式計算存儲提供了底層支持。
MapReduce從它名字上來看就大致可以看出個緣由,兩個動詞Map和Reduce,“Map(展開)”就是將一個任務分解成為多個任務,“Reduce”就是將分解后多任務處理的結果匯總起來,得出最后的分析結果。這不是什么新思想,其實在前面提到的多線程,多任務的設計就可以找到這種思想的影子。不論是現實社會,還是在程序設計中,一項工作往往可以被拆分成為多個任務,任務之間的關系可以分為兩種:一種是不相關的任務,可以并行執行;另一種是任務之間有相互的依賴,先后順序不能夠顛倒,這類任務是無法并行處理的?;氐酱髮W時期,教授上課時讓大家去分析關鍵路徑,無非就是找最省時的任務分解執行方式。在分布式系統中,機器集群就可以看作硬件資源池,將并行的任務拆分,然后交由每一個空閑機器資源去處理,能夠極大地提高計算效率,同時這種資源無關性,對于計算集群的擴展無疑提供了最好的設計保證。(其實我一直認為Hadoop的卡通圖標不應該是一個小象,應該是螞蟻,分布式計算就好比螞蟻吃大象,廉價的機器群可以匹敵任何高性能的計算機,縱向擴展的曲線始終敵不過橫向擴展的斜線)。任務分解處理以后,那就需要將處理以后的結果再匯總起來,這就是Reduce要做的工作。
上圖就是MapReduce大致的結構圖,在Map前還可能會對輸入的數據有Split(分割)的過程,保證任務并行效率,在Map之后還會有Shuffle(混合)的過程,對于提高Reduce的效率以及減小數據傳輸的壓力有很大的幫助。后面會具體提及這些部分的細節。
HDFS是分布式計算的存儲基石,Hadoop的分布式文件系統和其他分布式文件系統有很多類似的特質。分布式文件系統基本的幾個特點:
上圖中展現了整個HDFS三個重要角色:NameNode、DataNode和Client。NameNode可以看作是分布式文件系統中的管理者,主要負責管理文件系統的命名空間、集群配置信息和存儲塊的復制等。NameNode會將文件系統的Meta-data存儲在內存中,這些信息主要包括了文件信息、每一個文件對應的文件塊的信息和每一個文件塊在DataNode的信息等。DataNode是文件存儲的基本單元,它將Block存儲在本地文件系統中,保存了Block的Meta-data,同時周期性地將所有存在的Block信息發送給NameNode。Client就是需要獲取分布式文件系統文件的應用程序。這里通過三個操作來說明他們之間的交互關系。
文件寫入:
文件讀?。?/strong>
文件Block復制:
最后再說一下HDFS的幾個設計特點(對于框架設計值得借鑒):
下面綜合MapReduce和HDFS來看Hadoop的結構:
在Hadoop的系統中,會有一臺Master,主要負責NameNode的工作以及JobTracker的工作。JobTracker的主要職責就是啟動、跟蹤和調度各個Slave的任務執行。還會有多臺Slave,每一臺Slave通常具有DataNode的功能并負責TaskTracker的工作。TaskTracker根據應用要求來結合本地數據執行Map任務以及Reduce任務。
說到這里,就要提到分布式計算最重要的一個設計點:Moving Computation is Cheaper than Moving Data。就是在分布式處理中,移動數據的代價總是高于轉移計算的代價。簡單來說就是分而治之的工作,需要將數據也分而存儲,本地任務處理本地數據然后歸總,這樣才會保證分布式計算的高效性。
說完了What,簡單地說一下Why。官方網站已經給了很多的說明,這里就大致說一下其優點及使用的場景(沒有不好的工具,只用不適用的工具,因此選擇好場景才能夠真正發揮分布式計算的作用):
使用場景:
個人覺得最適合的就是海量數據的分析,其實Google最早提出MapReduce也就是為了海量數據分析。同時HDFS最早是為了搜索引擎實現而開發的,后來才被用于分布式計算框架中。海量數據被分割于多個節點,然后由每一個節點并行計算,將得出的結果歸并到輸出。同時第一階段的輸出又可以作為下一階段計算的輸入,因此可以想象到一個樹狀結構的分布式計算圖,在不同階段都有不同產出,同時并行和串行結合的計算也可以很好地在分布式集群的資源下得以高效的處理。
編輯推薦:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn