1. 程式人生 > 其它 >Hadoop生態系統

Hadoop生態系統

簡介


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

Hadoop生態系統概況


Hadoop是一個能夠對大量資料進行分散式處理的軟體框架。具有可靠、高效、可伸縮的特點。
Hadoop的核心是HDFS和MapReduce,hadoop2.0還包括YARN。
下圖為hadoop的生態系統:

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的恢復。

Mapreduce(分散式計算框架)


源自於google的MapReduce論文,發表於2004年12月,Hadoop MapReduce是google MapReduce 克隆版。MapReduce是一種計算模型,用以進行大資料量的計算。其中Map對資料集上的獨立元素進行指定的操作,生成鍵-值對形式中間結果。Reduce則對中間結果中相同“鍵”的所有“值”進行規約,以得到最終結果。MapReduce這樣的功能劃分,非常適合在大量計算機組成的分散式並行環境裡進行資料處理。
MapReduce計算框架發展到現在有兩個版本的MapReduce的API,針對MR1主要元件有以下幾個部分組成:
(1)JobTracker:Master節點,只有一個,主要任務是資源的分配和作業的排程及監督管理,管理所有作業,作業/任務的監控、錯誤處理等;將任務分解成一系列任務,並分派給TaskTracker。
(2)TaskTracker:Slave節點,執行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的資源管理框架上。

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等計算,框架。

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的產品,該款產品目前功能還不是很完善,處於一個測試階段,一般並不會應用於商業化產品當中。

Mahout(資料探勘演算法庫)


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

Hbase(分散式列存資料庫)


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

Zookeeper(分散式協作服務)


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

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

Pig(基於Hadoop的資料流系統)


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

Hive(基於Hadoop的資料倉庫)


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

Flume(日誌收集工具)


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

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

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流程定義語言)來描述這個圖。

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) 開發,可用來構建大型的、低延遲的資料分析應用程式。

Tez


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

Storm


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