Hadoop生態系統介紹-彙總-標註重點

hadoop生態系統的詳細介紹

轉自:https://blog.csdn.net/wdr2003/article/details/79692886

補充參考:https://blog.csdn.net/woshiwanxin102213/article/details/19688393


簡介


Hadoop是一個開發和運行處理大規模數據的軟件平臺,是Appach的一個用java語言實現開源軟件框架,實現在大量計算機組成的集羣中對海量數據進行分佈式計算。今天我們來詳細介紹下hadoop的生態系統。

 

Hadoop生態系統概況


Hadoop是一個能夠對大量數據進行分佈式處理的軟件框架。具有可靠、高效、可伸縮的特點。 

下圖爲Hadoop 1.0生態系統:


Hadoop的核心是HDFS和MapReduce,hadoop2.0還包括YARN。 
下圖爲hadoop 2.0的生態系統: 

1. HDFS(Hadoop分佈式文件系統)


源自於Google的GFS論文,發表於2003年10月,HDFS是GFS克隆版。 
是Hadoop體系中數據存儲管理的基礎。它是一個高度容錯的系統,能檢測和應對硬件故障,用於在低成本的通用硬件上運行。HDFS簡化了文件的一致性模型,通過流式數據訪問,提供高吞吐量應用程序數據訪問功能,適合帶有大型數據集的應用程序。 
HDFS主要有以下幾個部分組成:

  1. Client:切分文件;訪問HDFS;與NameNode交互,獲取文件位置信息;與DataNode交互,讀取和寫入數據。
  2. NameNode:Master節點,在hadoop1.X中只有一個,管理HDFS的名稱空間和數據塊映射信息,配置副本策略,處理客戶端請求。對於大型的集羣來講,Hadoop1.x存在兩個最大的缺陷: 
    • 1)對於大型的集羣,namenode的內存成爲瓶頸,namenode的擴展性的問題;
    • 2)namenode的單點故障問題。
    • 針對以上的兩個缺陷,Hadoop2.x以後分別對這兩個問題進行了解決。
    • 對於缺陷1)提出了Federation namenode來解決,該方案主要是通過多個namenode來實現多個命名空間來實現namenode的橫向擴張。從而減輕單個namenode內存問題。
    • 針對缺陷2),hadoop2.X提出了實現兩個namenode實現熱備HA的方案來解決。其中一個是處於standby狀態,一個處於active狀態。
  3. DataNode:Slave節點,存儲實際的數據,彙報存儲信息給NameNode。
  4. Secondary NameNode:輔助NameNode,分擔其工作量;定期合併fsimage和edits,推送給NameNode;緊急情況下,可輔助恢復NameNode,但Secondary NameNode並非NameNode的熱備。 
    目前,在硬盤不壞的情況,我們可以通過secondarynamenode來實現namenode的恢復。

2. Mapreduce(分佈式計算框架)


        Hadoop MapReduce是google MapReduce 克隆版。MapReduce是一種計算模型,用以進行大數據量的計算。其中Map對數據集上的獨立元素進行指定的操作,生成鍵-值對形式中間結果。Reduce則對中間結果中相同“鍵”的所有“值”進行規約,以得到最終結果。MapReduce這樣的功能劃分,非常適合在大量計算機組成的分佈式並行環境裏進行數據處理。 
        MapReduce計算框架發展到現在有兩個版本的MapReduce的API,針對MR1主要組件有以下幾個部分組成: 
(1)JobTrackerMaster節點,只有一個,主要任務是資源的分配和作業的調度及監督管理,管理所有作業,作業/任務的監控、錯誤處理等;將任務分解成一系列任務,並分派給TaskTracker。 
(2)TaskTrackerSlave節點,運行Map Task和Reduce Task;並與JobTracker交互,彙報任務狀態。 
(3)Map Task:解析每條數據記錄,傳遞給用戶編寫的map(),並執行,將輸出結果寫入本地磁盤。 
(4)Reducer Task:從Map Task的執行結果中,遠程讀取輸入數據,對數據進行排序,將數據按照分組傳遞給用戶編寫的reduce函數執行。 
        在這個過程中,有一個shuffle過程,對於該過程是理解MapReduce計算框架是關鍵。該過程包含map函數輸出結果到reduce函數輸入這一個中間過程中所有的操作,稱之爲shuffle過程。在這個過程中,可以分爲map端和reduce端。

Map端

1) 輸入數據進行分片之後,分片的大小跟原始的文件大小、文件塊的大小有關。每一個分片對應的一個map任務。 
2) map任務在執行的過程中,會將結果存放到內存當中,當內存佔用達到一定的閾值(這個閾值是可以設置的)時,map會將中間的結果寫入到本地磁盤上,形成臨時文件這個過程叫做溢寫。 
3) map在溢寫的過程中,會根據指定reduce任務個數分別寫到對應的分區當中,這就是partition過程。每一個分區對應的是一個reduce任務。並且在寫的過程中,進行相應的排序。在溢寫的過程中還可以設置conbiner過程,該過程跟reduce產生的結果應該是一致的,因此該過程應用存在一定的限制,需要慎用。 
4) 每一個map端最後都只存在一個臨時文件作爲reduce的輸入,因此會對中間溢寫到磁盤的多個臨時文件進行合併Merge操作。最後形成一個內部分區的一個臨時文件。

Reduce端

1) 首先要實現數據本地化,需要將遠程節點上的map輸出複製到本地。 
2) Merge過程,這個合併過程主要是對不同的節點上的map輸出結果進行合併。 
3) 不斷的複製和合並之後,最終形成一個輸入文件。Reduce將最終的計算結果存放在HDFS上。 
針對MR2是新一代的MR的API。其主要是運行在Yarn的資源管理框架上。

3. Yarn(資源管理框架)


        YARN (Yet Another Resource Negotiator,另一種資源協調者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,可爲上層應用提供統一的資源管理和調度,它的引入爲集羣在利用率、資源統一管理和數據共享等方面帶來了巨大好處。

        YARN的基本思想是將JobTracker的兩個主要功能(資源管理和作業調度/監控)分離,主要方法是創建一個全局的ResourceManager(RM)和若干個針對應用程序的ApplicationMaster(AM)。這裏的應用程序是指傳統的MapReduce作業或作業的DAG(有向無環圖)。

        該框架是hadoop2.x以後對hadoop1.x之前JobTracker和TaskTracker模型的優化,而產生出來的,將JobTracker的資源分配和作業調度及監督分開。該框架主要有ResourceManager,Applicationmatser,nodemanager。其主要工作過程如下:

  • ResourceManager主要負責所有的應用程序的資源分配,
  • ApplicationMaster主要負責每個作業的任務調度,也就是說每一個作業對應一個ApplicationMaster。
  • Nodemanager是接收Resourcemanager 和ApplicationMaster的命令來實現資源的分配執行體。

        ResourceManager在接收到client的作業提交請求之後,會分配一個Conbiner,這裏需要說明一下的是Resoucemanager分配資源是以Conbiner爲單位分配的。第一個被分配的Conbiner會啓動Applicationmaster,它主要負責作業的調度。Applicationmanager啓動之後則會直接跟NodeManager通信。 
        在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的調度器負責資源的分配,而NodeManager則負責資源的供給和隔離。ResourceManager將某個NodeManager上資源分配給任務(這就是所謂的“資源調度”)後,NodeManager需按照要求爲任務提供相應的資源,甚至保證這些資源應具有獨佔性,爲任務運行提供基礎的保證,這就是所謂的資源隔離。 
        在Yarn平臺上可以運行多個計算框架,如:MR,Tez,Storm,Spark等計算框架。

4. Sqoop(數據同步工具)


Sqoop是SQL-to-Hadoop的縮寫,主要用於傳統數據庫和Hadoop之間傳輸數據。數據的導入和導出本質上是Mapreduce程序,充分利用了MR的並行化和容錯性。其中主要利用的是MP中的Map任務來實現並行導入,導出。Sqoop發展到現在已經出現了兩個版本,一個是sqoop1.x.x系列,一個是sqoop1.99.X系列。對於sqoop1系列中,主要是通過命令行的方式來操作。

  • sqoop1 import原理:從傳統數據庫獲取元數據信息(schema、table、field、field type),把導入功能轉換爲只有Map的Mapreduce作業,在mapreduce中有很多map,每個map讀一片數據,進而並行的完成數據的拷貝。
  • sqoop1 export原理:獲取導出表的schema、meta信息,和Hadoop中的字段match;多個map only作業同時運行,完成hdfs中數據導出到關係型數據庫中。
  • Sqoop1.99.x是屬於sqoop2的產品,該款產品目前功能還不是很完善,處於一個測試階段,一般並不會應用於商業化產品當中。

5. Mahout(數據挖掘算法庫)


Mahout起源於2008年,最初是Apache Lucent的子項目,它在極短的時間內取得了長足的發展,現在是Apache的頂級項目。相對於傳統的MapReduce編程方式來實現機器學習的算法時,往往需要話費大量的開發時間,並且週期較長,而Mahout的主要目標是創建一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。 
Mahout現在已經包含了聚類、分類、推薦引擎(協同過濾)和頻繁集挖掘等廣泛使用的數據挖掘方法。除了算法,Mahout還包含數據的輸入/輸出工具、與其他存儲系統(如數據庫、MongoDB 或Cassandra)集成等數據挖掘支持架構。 
mahout的各個組件下面都會生成相應的jar包。此時我們需要明白一個問題:到底如何使用mahout呢? 
  實際上,mahout只是一個機器學習的算法庫,在這個庫當中是想了相應的機器學習的算法,如:推薦系統(包括基於用戶和基於物品的推薦),聚類和分類算法。並且這些算法有些實現了MapReduce,spark從而可以在hadoop平臺上運行,在實際的開發過程中,只需要將相應的jar包即可。 
  

6. Hbase(分佈式列存數據庫)


源自Google的Bigtable論文,發表於2006年11月,傳統的關係型數據庫是對面向行的數據庫。HBase是Google Bigtable克隆版,HBase是一個針對結構化數據的可伸縮、高可靠、高性能、分佈式和麪向列的動態模式數據庫。和傳統關係數據庫不同,HBase採用了BigTable的數據模型:增強的稀疏排序映射表(Key/Value),其中,鍵由行關鍵字、列關鍵字和時間戳構成。HBase提供了對大規模數據的隨機、實時讀寫訪問,同時,HBase中保存的數據可以使用MapReduce來處理,它將數據存儲和並行計算完美地結合在一起。 

數據模型:Schema-->Table-->Column Family-->Column-->RowKey-->TimeStamp-->Value

Hbase表的特點

  • 大:一個表可以有數十億行,上百萬列;
  • 無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中不同的行可以有截然不同的列;
  • 面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索;
  • 稀疏:空(null)列並不佔用存儲空間,表可以設計的非常稀疏;
  • 數據多版本:每個單元中的數據可以有多個版本,默認情況下版本號自動分配,是單元格插入時的時間戳;
  • 數據類型單一:Hbase中的數據都是字符串,沒有類型。 
    Hbase物理模型 
    每個column family存儲在HDFS上的一個單獨文件中,空值不會被保存。 
    Key 和 Version number在每個 column family中均有一份; 
    HBase 爲每個值維護了多級索引,即:”key, column family, column name, timestamp”,其物理存儲:

    1. Table中所有行都按照row key的字典序排列;
    2. Table在行的方向上分割爲多個Region;
    3. Region按大小分割的,每個表開始只有一個region,隨着數據增多,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region,之後會有越來越多的region;
    4. Region是Hbase中分佈式存儲和負載均衡的最小單元,不同Region分佈到不同RegionServer上。、
    5. Region雖然是分佈式存儲的最小單元,但並不是存儲的最小單元。Region由一個或者多個Store組成,每個store保存一個columns family;每個Strore又由一個memStore和0至多個StoreFile組成,StoreFile包含HFile;memStore存儲在內存中,StoreFile存儲在HDFS上。

7. Hive(基於Hadoop的數據倉庫)


由facebook開源,最初用於解決海量結構化的日誌數據統計問題。 
Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉化爲MapReduce任務在Hadoop上執行。通常用於離線分析。

8. Spark


        Spark 是專爲大規模數據處理而設計的快速通用的計算引擎。Spark是UC Berkeley AMP lab (加州大學伯克利分校的AMP實驗室)所開源的類Hadoop MapReduce的通用並行框架,Spark,擁有Hadoop MapReduce所具有的優點;但不同於MapReduce的是——Job中間輸出結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要迭代的MapReduce的算法。

        Spark 是一種與 Hadoop 相似的開源集羣計算環境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負載方面表現得更加優越,換句話說,Spark 啓用了內存分佈數據集,除了能夠提供交互式查詢外,它還可以優化迭代工作負載。
Spark 是在 Scala 語言中實現的,它將 Scala 用作其應用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對象一樣輕鬆地操作分佈式數據集。
        儘管創建 Spark 是爲了支持分佈式數據集上的迭代作業,但是實際上它是對 Hadoop 的補充,可以在 Hadoop 文件系統中並行運行。通過名爲 Mesos 的第三方集羣框架可以支持此行爲。Spark 由加州大學伯克利分校 AMP 實驗室 (Algorithms, Machines, and People Lab) 開發,可用來構建大型的、低延遲的數據分析應用程序。

 

9. Zookeeper(分佈式協作服務)


源自Google的Chubby論文,發表於2006年11月,Zookeeper是Chubby克隆版,主要解決分佈式環境下的數據管理問題:統一命名,狀態同步,集羣管理,配置同步等。 
Zookeeper的主要實現兩步:

  • 選舉Leader
  • 同步數據。這個組件在實現namenode的HA高可用性的時候,需要用到。

 

10. Flume(日誌收集工具)


Cloudera開源的日誌收集系統,具有分佈式、高可靠、高容錯、易於定製和擴展的特點。 

它將數據從產生、傳輸、處理並最終寫入目標的路徑的過程抽象爲數據流,在具體的數據流中,數據源支持在Flume中定製數據發送方,從而支持收集各種不同協議數據。同時,Flume數據流提供對日誌數據進行簡單處理的能力,如過濾、格式轉換等。此外,Flume還具有能夠將日誌寫往各種數據目標(可定製)的能力。總的來說,Flume是一個可擴展、適合複雜環境的海量日誌收集系統。

11. Oozie


在Hadoop中執行的任務有時候需要把多個Map/Reduce作業連接到一起,這樣才能夠達到目的。在Hadoop生態圈中,有一種相對比較新的組件叫做Oozie,它讓我們可以把多個Map/Reduce作業組合到一個邏輯工作單元中,從而完成更大型的任務

Oozie是一種Java Web應用程序,它運行在Java servlet容器——即Tomcat——中,並使用數據庫來存儲以下內容:
  1、工作流定義
  2、當前運行的工作流實例,包括實例的狀態和變量

Oozie工作流是放置在控制依賴DAG(有向無環圖 Direct Acyclic Graph)中的一組動作(例如,Hadoop的Map/Reduce作業、Pig作業等),其中指定了動作執行的順序。我們會使用hPDL(一種XML流程定義語言)來描述這個圖。

12. Pig(基於Hadoop的數據流系統)


由yahoo!開源,設計動機是提供一種基於MapReduce的ad-hoc(計算在query時發生)數據分析工具 
定義了一種數據流語言—Pig Latin,將腳本轉換爲MapReduce任務在Hadoop上執行。通常用於進行離線分析。

13. Tez


    Tez是一個針對Hadoop數據處理應用程序的新分佈式執行框架。Tez是Apache最新的支持DAG作業的開源計算框架,它可以將多個有依賴的作業轉換爲一個作業從而大幅提升DAG作業的性能。Tez並不直接面向最終用戶——事實上它允許開發者爲最終用戶構建性能更快、擴展性更好的應用程序。Hadoop傳統上是一個大量數據批處理平臺。但是,有很多用例需要近乎實時的查詢處理性能。還有一些工作則不太適合MapReduce,例如機器學習。Tez的目的就是幫助Hadoop處理這些用例場景。
    Tez項目的目標是支持高度定製化,這樣它就能夠滿足各種用例的需要,讓人們不必藉助其他的外部方式就能完成自己的工作,如果 Hive和 Pig 這樣的項目使用Tez而不是MapReduce作爲其數據處理的骨幹,那麼將會顯著提升它們的響應時間。Tez構建在YARN之上,後者是Hadoop所使用的新資源管理框架。

14. Storm


    Storm爲分佈式實時計算提供了一組通用原語,可被用於“流處理”之中,實時處理消息並更新數據庫。這是管理隊列及工作者集羣的另一種方式。 Storm也可被用於“連續計算”(continuous computation),對數據流做連續查詢,在計算時就將結果以流的形式輸出給用戶。它還可被用於“分佈式RPC”,以並行的方式運行昂貴的運算。 
    Storm可以方便地在一個計算機集羣中編寫與擴展複雜的實時計算,Storm用於實時處理,就好比 Hadoop 用於批處理。Storm保證每個消息都會得到處理,而且它很快——在一個小集羣中,每秒可以處理數以百萬計的消息。更棒的是你可以使用任意編程語言來做開發。

 

 

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