hadoop詳解

1.    什麼是大數據
      國際頂級權威諮詢機構麥肯錫定義大數據爲:大數據指的是所涉及的數據集規模已經超過了傳統數據軟件獲取,存儲,管理和分析的能力。    
從上面的定義可以看出以下幾點:

    多大的數據纔算大數據,這並沒有一個明確的規定,且不同行業有不同的標準。

    大數據不僅僅是大,它還包含了數據集規模已經超過了傳統數據庫軟件獲取,存儲,分析和管理這一層意思。

   大數據不一定永遠是大數據,大數據的標準是可變的,在20年前1GB的數據也可以叫大數據,可見,隨着計算機技術發展,符合大數據標準的數據集容量也會增長。 

2.    Haoop的定義

       hadoop的定義:Hadoop軟件庫是一個框架,允許在集羣中使用簡單的編程模型對大規模數據集進行分佈式計算。它被設計爲可以從單一服務器擴展到數以千計的本地計算和存儲的節點,並且Hadoop會在應用層面監測和處理錯誤,而不依靠硬件的高可用性,所以Hadoop能夠在每一個節點都有可能出錯的集羣之上提供一個高可用服務。
特點:
      hadoop是一個框架。是由一系列的軟件庫組成的框架。最主要的是Commons:提供遠程過程調用RPC和序列化機制。HDFS:負責數據的存儲。YARN:負責統一資源調度和管理。
      hadoop適合處理大規模數據。處理海量數據的能力十分可觀,並且能夠實現分佈式存儲和分佈式計算。
      hadoop被部署在一個集羣上。通過一組網絡互聯的計算機,集羣裏的每一臺計算機稱作一個節點。hadoop被部署在集羣之上,對外提供服務。

3.    hadoop的運行模式
        單機模式是Hadoop的默認模式。當配置文件爲空時,Hadoop完全運行在本地。因爲不需要與其他節點交互,單機模式就不使用HDFS,也不加載任何Hadoop的守護進程。該模式主要用於開發調試MapReduce程序的應用邏輯。
       僞分佈模式. Hadoop守護進程運行在本地機器上,所有的守護進程都運行在一個節點上,模擬一個小規模的的集羣。該模式在單機模式之上增加了代碼調試功能,允許你檢查內存使用情況,HDFS輸入輸出,以及其他的守護進程交互。
      集羣模式:hadoop的守護進程運行在多個節點上,形成一個真正意義上的集羣。
4.    hadoop的安裝

           hadoop的安裝步驟:
         安裝運行環境 -----ubuntu14.04或者虛擬機
         修改主機名和用戶名----爲了統一開發環境
         配置靜態IP地址-----hadoop集羣啓動時通過固定的主機名和IP地址啓動
         配置SSH無密碼連接----安全進行網絡數據傳輸
         安裝JDK
         配置hadoop
         格式化hdfs
         啓動hdoop並驗證安裝

5.     HDFS(Hdoop distributed file system)

          HDFS的思想:當數據集的大小超過單臺計算機的存儲能力的時,就有必要將其進行分區並存儲到若干臺單獨的計算機上,而管理網絡中跨多臺計算機存儲的文件系統就是分佈式文件系統。該系統架構於網絡之上,勢必會引入網絡編程的複雜性,該文件系統能夠容忍節點故障並且不丟失數據。是一個抽象的系統概念。
特點:
         適合存儲超大文件
         運行於廉價的硬件之上
         流式數據訪問:一次寫入,多次讀取
6.    MapReduce的運行機制和原理

      1)    MapReduce初析
          MapReduce是一個計算框架,既然是做計算的框架,那麼表現形式是有個輸入(input),mapreduce操作這個輸入,通過本身定義好的模型,得到一個輸出(output),這個輸出就是我麼所需要的結果。
          我們要學習的就是這個計算模型的運行規則。在運行一個MapReduce計算任務時候,任務過程被分爲兩個階段:map階段和reduce階段,每個階段都是用鍵值對(key/value)作爲輸入和輸出。而程序員要做的就是定義好這兩個階段的函數:map函數和reduce函數。
      2)   mapreduce運行機制
       從物理實體來分析mapreduce:
          參入mapreduce作業執行涉及4個獨立的實體:
客戶端(client):編寫mapreduce程序,配置作業,提交作業,這就是程序員完成的工作;
JobTracker:初始化作業,分配作業,與TaskTracker通信,協調整個作業的執行;
TaskTracker:保持與JobTracker的通信,在分配的數據片段上執行Map或Reduce任務,TaskTracker和JobTracker的不同有個很重要的方面,就是在執行任務時候TaskTracker可以有n多個,JobTracker則只會有一個;
Hdfs:保存作業的數據、配置信息等等,最後的結果也是保存在hdfs上面;
 

從邏輯實體來分析mapreduce:輸入分片(input split)、map階段、combiner階段、shuffle階段和reduce階段。
    流程:每個map task都有一個內存緩衝區,存儲着map的輸出結果,當緩衝區快滿的時候需要將緩衝區的數據以一個臨時文件的方式存放到磁盤,當整個map task結束後再對磁盤中這個map task產生的所有臨時文件做合併,生成最終的正式輸出文件,然後等待reduce task來拉數據。


對流程的每一步都有很多細節,下面我來一一說明:

       1)       在map task執行時,它的輸入數據來源於HDFS的block,當然在MapReduce概念中,map task只讀取split。Split與block的對應關係可能是多對一,默認是一對一。在WordCount例子裏,假設map的輸入數據都是像“aaa”這樣的字符串。


      2)      在經過mapper的運行後,我們得知mapper的輸出是這樣一個key/value對: key是“aaa”, value是數值1。因爲當前map端只做加1的操作,在reduce task裏纔去合併結果集。假設這個job有3個reduce task,到底當前的“aaa”應該交由哪個reduce去做呢,是需要現在決定的。


        MapReduce提供Partitioner接口,它的作用就是根據key或value及reduce的數量來決定當前的這對輸出數據最終應該交由哪個reduce task處理。默認對key hash後再以reduce task數量取模。默認的取模方式只是爲了平均reduce的處理能力,如果用戶自己對Partitioner有需求,可以訂製並設置到job上。 在我們的例子中,“aaa”經過Partitioner後返回0,也就是這對值應當交由第一個reducer來處理。接下來,需要將數據寫入內存緩衝區中,緩衝區的作用是批量收集map結果,減少磁盤IO的影響。我們的key/value對以及Partition的結果都會被寫入緩衝區。當然寫入之前,key與value值都會被序列化成字節數組。


        3)       這個內存緩衝區是有大小限制的,默認是100MB。當map task的輸出結果很多時,就可能會撐爆內存,所以需要在一定條件下將緩衝區中的數據臨時寫入磁盤,然後重新利用這塊緩衝區。這個從內存往磁盤寫數據的過程被稱爲Spill,中文可譯爲溢寫,字面意思很直觀。這個溢寫是由單獨線程來完成,不影響往緩衝區寫map結果的線程。溢寫線程啓動時不應該阻止map的結果輸出,所以整個緩衝區有個溢寫的比例spill.percent。這個比例默認是0.8,也就是當緩衝區的數據已經達到閾值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢寫線程啓動,鎖定這80MB的內存,執行溢寫過程。Map task的輸出結果還可以往剩下的20MB內存中寫,互不影響。

          當溢寫線程啓動後,需要對這80MB空間內的key做排序(Sort)。排序是MapReduce模型默認的行爲,這裏的排序也是對序列化的字節做的排序。


        在針對每個reduce端而合併數據時,有些數據可能像這樣:“aaa”/1, “aaa”/1。對於WordCount例子,就是簡單地統計單詞出現的次數,如果在同一個map task的結果中有很多個像“aaa”一樣出現多次的key,我們就應該把它們的值合併到一塊,這個過程叫reduce也叫combine。但MapReduce的術語中,reduce只指reduce端執行從多個map task取數據做計算的過程。除reduce外,非正式地合併數據只能算做combine了。其實大家知道的,MapReduce中將Combiner等同於Reducer。


        如果client設置過Combiner,那麼現在就是使用Combiner的時候了。將有相同key的key/value對的value加起來,減少溢寫到磁盤的數據量。Combiner會優化MapReduce的中間結果,所以它在整個模型中會多次使用。那哪些場景才能使用Combiner呢?從這裏分析,Combiner的輸出是Reducer的輸入,Combiner絕不能改變最終的計算結果。所以從我的想法來看,Combiner只應該用於那種Reduce的輸入key/value與輸出key/value類型完全一致,且不影響最終結果的場景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它對job執行效率有幫助,反之會影響reduce的最終結果。


        4)     每次溢寫會在磁盤上生成一個溢寫文件,如果map的輸出結果真的很大,有多次這樣的溢寫發生,磁盤上相應的就會有多個溢寫文件存在。當map task真正完成時,內存緩衝區中的數據也全部溢寫到磁盤中形成一個溢寫文件。最終磁盤中會至少有一個這樣的溢寫文件存在(如果map的輸出結果很少,當map執行完成時,只會產生一個溢寫文件),因爲最終的文件只有一個,所以需要將這些溢寫文件歸併到一起,這個過程就叫做Merge。Merge是怎樣的?如前面的例子,“aaa”從某個map task讀取過來時值是5,從另外一個map 讀取時值是8,因爲它們有相同的key,所以得merge成group。什麼是group。對於“aaa”就是像這樣的:{“aaa”, [5, 8, 2, …]},數組中的值就是從不同溢寫文件中讀取出來的,然後再把這些值加起來。請注意,因爲merge是將多個溢寫文件合併到一個文件,所以可能也有相同的key存在,在這個過程中如果client設置過Combiner,也會使用Combiner來合併相同的key。


         至此,map端的所有工作都已結束,最終生成的這個文件也存放在TaskTracker夠得着的某個本地目錄內。每個reduce task不斷地通過RPC從JobTracker那裏獲取map task是否完成的信息,如果reduce task得到通知,獲知某臺TaskTracker上的map task執行完成,Shuffle的後半段過程開始啓動。

         Reducer真正運行之前,所有的時間都是在拉取數據,做merge,且不斷重複地在做。如前面的方式一樣,下面我也分段地描述reduce 端的Shuffle細節:

         Copy過程,簡單地拉取數據。Reduce進程啓動一些數據copy線程(Fetcher),通過HTTP方式請求map task所在的TaskTracker獲取map task的輸出文件。因爲map task早已結束,這些文件就歸TaskTracker管理在本地磁盤中。


         Merge階段。這裏的merge如map端的merge動作,只是數組中存放的是不同map端copy來的數值。Copy過來的數據會先放入內存緩衝區中,這裏的緩衝區大小要比map端的更爲靈活,它基於JVM的heap size設置,因爲Shuffle階段Reducer不運行,所以應該把絕大部分的內存都給Shuffle用。這裏需要強調的是,merge有三種形式:1)內存到內存  2)內存到磁盤  3)磁盤到磁盤。默認情況下第一種形式不啓用,讓人比較困惑,是吧。當內存中的數據量到達一定閾值,就啓動內存到磁盤的merge。與map 端類似,這也是溢寫的過程,這個過程中如果你設置有Combiner,也是會啓用的,然後在磁盤中生成了衆多的溢寫文件。第二種merge方式一直在運行,直到沒有map端的數據時才結束,然後啓動第三種磁盤到磁盤的merge方式生成最終的那個文件。


          Reducer的輸入文件。不斷地merge後,最後會生成一個“最終文件”。爲什麼加引號?因爲這個文件可能存在於磁盤上,也可能存在於內存中。對我們來說,當然希望它存放於內存中,直接作爲Reducer的輸入,但默認情況下,這個文件是存放於磁盤中的.當Reducer的輸入文件已定,整個Shuffle才最終結束。然後就是Reducer執行,把結果放到HDFS上。

主要借鑑的文章地址:http://blog.csdn.net/liujianfei526/article/details/51460806 和 http://langyu.iteye.com/blog/992916  和 http://blog.csdn.net/csj941227

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章