1. 程式人生 > >Hadoop簡介:Hadoop的應用場合及其核心設計

Hadoop簡介:Hadoop的應用場合及其核心設計

本節向大家描述一下Hadoop簡介,主要包括Hadoop應用場合和Hadoop框架中最核心的設計等內容,相信通過本節的學習大家對Hadoop有全面的認識,讓我們一起來了解一下Hadoop吧。

Hadoop簡介

Hadoop是一個分散式系統基礎架構,由Apache基金會開發。使用者可以在不瞭解分散式底層細節的情況下,開發分散式程式。充分利用叢集的威力高速運算和儲存。
簡單地說來,Hadoop是一個可以更容易開發和執行處理大規模資料的軟體平臺。
Hadoop實現了一個分散式檔案系統(HadoopDistributedFileSystem),簡稱HDFS。HDFS有著高容錯性(fault-tolerent)的特點,並且設計用來部署在低廉的(low-cost)硬體上。而且它提供高傳輸率(highthroughput)來訪問應用程式的資料,適合那些有著超大資料集(largedataset)的應用程式。HDFS放寬了(relax)POSIX的要求(requirements)這樣可以流的形式訪問(streamingaccess)檔案系統中的資料。

談到Hadoop就不得不提到Lucene和Nutch。首先,Lucene並不是一個應用程式,而是提供了一個純Java的高效能全文索引引擎工具包,它可以方便的嵌入到各種實際應用中實現全文搜尋/索引功能。Nutch是一個應用程式,是一個以Lucene為基礎實現的搜尋引擎應用,Lucene為Nutch提供了文字搜尋和索引的API,Nutch不光有搜尋的功能,還有資料抓取的功能。在nutch0.8.0版本之前,Hadoop還屬於Nutch的一部分,而從nutch0.8.0開始,將其中實現的NDFS和MapReduce剝離出來成立一個新的開源專案,這就是Hadoop,而nutch0.8.0版本較之以前的Nutch在架構上有了根本性的變化,那就是完全構建在Hadoop的基礎之上了。在Hadoop中實現了Google的GFS和MapReduce演算法,使Hadoop成為了一個分散式的計算平臺。
其實,Hadoop並不僅僅是一個用於儲存的分散式檔案系統,而是設計用來在由通用計算裝置組成的大型叢集上執行分散式應用的框架。

Hadoop包含兩個部分:

1、HDFS

Hadoop簡介中的HDFS。HDFS即HadoopDistributedFileSystem(Hadoop分散式檔案系統)
HDFS具有高容錯性,並且可以被部署在低價的硬體裝置之上。HDFS很適合那些有大資料集的應用,並且提供了對資料讀寫的高吞吐率。HDFS是一個master/slave的結構,就通常的部署來說,在master上只執行一個Namenode,而在每一個slave上執行一個Datanode。
HDFS支援傳統的層次檔案組織結構,同現有的一些檔案系統在操作上很類似,比如你可以建立和刪除一個檔案,把一個檔案從一個目錄移到另一個目錄,重新命名等等操作。Namenode管理著整個分散式檔案系統,對檔案系統的操作(如建立、刪除檔案和資料夾)都是通過Namenode來控制。

HDFS的結構圖中可以看出,Namenode,Datanode,Client之間的通訊都是建立在TCP/IP的基礎之上的。當Client要執行一個寫入的操作的時候,命令不是馬上就傳送到Namenode,Client首先在本機上臨時資料夾中快取這些資料,當臨時資料夾中的資料塊達到了設定的Block的值(預設是64M)時,Client便會通知Namenode,Namenode便響應Client的RPC請求,將檔名插入檔案系統層次中並且在Datanode中找到一塊存放該資料的block,同時將該Datanode及對應的資料塊資訊告訴Client,Client便這些本地臨時資料夾中的資料塊寫入指定的資料節點。
HDFS採取了副本策略,其目的是為了提高系統的可靠性,可用性。HDFS的副本放置策略是三個副本,一個放在本節點上,一個放在同一機架中的另一個節點上,還有一個副本放在另一個不同的機架中的一個節點上。當前版本的hadoop0.12.0中還沒有實現,但是正在進行中,相信不久就可以出來了。

2、MapReduce的實現

Hadoop簡介中MapReduce的實現。MapReduce是Google的一項重要技術,它是一個程式設計模型,用以進行大資料量的計算。對於大資料量的計算,通常採用的處理手法就是平行計算。至少現階段而言,對許多開發人員來說,平行計算還是一個比較遙遠的東西。MapReduce就是一種簡化平行計算的程式設計模型,它讓那些沒有多少平行計算經驗的開發人員也可以開發並行應用。
MapReduce的名字源於這個模型中的兩項核心操作:Map和Reduce。也許熟悉FunctionalProgramming(函數語言程式設計)的人見到這兩個詞會倍感親切。簡單的說來,Map是把一組資料一對一的對映為另外的一組資料,其對映的規則由一個函式來指定,比如對[1,2,3,4]進行乘2的對映就變成了[2,4,6,8]。Reduce是對一組資料進行歸約,這個歸約的規則由一個函式指定,比如對[1,2,3,4]進行求和的歸約得到結果是10,而對它進行求積的歸約結果是24。

1.Hadoop的應用場合:

適合海量資料的分析,其實Google最早提出MapReduce也就是為了海量資料分析。同時HDFS最早是為了搜尋引擎實現而開發的,後來才被用於分散式計算框架中。海量資料被分割於多個節點,然後由每一個節點平行計算,將得出的結果歸併到輸出。同時第一階段的輸出又可以作為下一階段計算的輸入,因此可以想象到一個樹狀結構的分散式計算圖,在不同階段都有不同產出,同時並行和序列結合的計算也可以很好地在分散式叢集的資源下得以高效的處理。

2.Hadoop框架中最核心的設計
Hadoop簡介中Hadoop框架中最核心的設計就是:MapReduce和HDFS,MapReduce的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapReduce就是“任務的分解與結果的彙總”。HDFS是Hadoop分散式檔案系統(HadoopDistributedFileSystem)的縮寫,為分散式計算儲存提供了底層支援。

MapReduce:
名字上來看就大致可以看出個緣由,兩個動詞Map和Reduce,“Map(展開)”就是將一個任務分解成為多個任務,“Reduce”就是將分解後多工處理的結果彙總起來,得出最後的分析結果。這不是什麼新思想,其實在前面提到的多執行緒,多工的設計就可以找到這種思想的影子。不論是現實社會,還是在程式設計中,一項工作往往可以被拆分成為多個任務,任務之間的關係可以分為兩種:一種是不相關的任務,可以並行執行;另一種是任務之間有相互的依賴,先後順序不能夠顛倒,這類任務是無法並行處理的。

上圖就是MapReduce大致的結構圖,在Map前還可能會對輸入的資料有Split(分割)的過程,保證任務並行效率,在Map之後還會有Shuffle(混合)的過程,對於提高Reduce的效率以及減小資料傳輸的壓力有很大的幫助。後面會具體提及這些部分的細節。
Hadoop簡介中的HDFS的工作流程圖:

整個流程圖中有三個重要角色:NameNode、DataNode和Client。NameNode可以看作是分散式檔案系統中的管理者,主要負責管理檔案系統的名稱空間、叢集配置資訊和儲存塊的複製等。NameNode會將檔案系統的Meta-data儲存在記憶體中,這些資訊主要包括了檔案資訊、每一個檔案對應的檔案塊的資訊和每一個檔案塊在DataNode的資訊等。DataNode是檔案儲存的基本單元,它將Block儲存在本地檔案系統中,儲存了Block的Meta-data,同時週期性地將所有存在的Block資訊傳送給NameNode。Client就是需要獲取分散式檔案系統檔案的應用程式。這裡通過三個操作來說明他們之間的互動關係。

檔案寫入:
1.Client向NameNode發起檔案寫入的請求。
2.NameNode根據檔案大小和檔案塊配置情況,返回給Client它所管理部分DataNode的資訊。
3.Client將檔案劃分為多個Block,根據DataNode的地址資訊,按順序寫入到每一個DataNode塊中。

檔案讀取:
1.Client向NameNode發起檔案讀取的請求。
2.NameNode返回檔案儲存的DataNode的資訊。
3.Client讀取檔案資訊。

檔案Block複製:
1.NameNode發現部分檔案的Block不符合最小複製數或者部分DataNode失效。
2.通知DataNode相互複製Block。
3.DataNode開始直接相互複製。
3.MapReduce和HDFS來看Hadoop的結構:

Hadoop結構示意圖

在Hadoop的系統中,會有一臺Master,主要負責NameNode的工作以及JobTracker的工作。JobTracker的主要職責就是啟動、跟蹤和排程各個Slave的任務執行。還會有多臺Slave,每一臺Slave通常具有DataNode的功能並負責TaskTracker的工作。TaskTracker根據應用要求來結合本地資料執行Map任務以及Reduce任務。