大數據Hadoop生態圈-組件介紹
Hadoop是目前應用最為廣泛的分布式大數據處理框架,其具備可靠、高效、可伸縮等特點。
Hadoop的核心是YARN,HDFS和Mapreduce。隨着處理任務不同,各種組件相繼出現,豐富Hadoop生態圈,目前生態圈結構大致如圖所示:

根據服務對象和層次分為:數據來源層、數據傳輸層、數據存儲層、資源管理層、數據計算層、任務調度層、業務模型層。接下來對Hadoop生態圈中出現的相關組件做一個簡要介紹。
1、HDFS(分布式文件系統)
HDFS是整個hadoop體系的基礎,負責數據的存儲與管理。HDFS有着高容錯性(fault-tolerant)的特點,並且設計用來部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有着超大數據集(large data set)的應用程序。
client:切分文件,訪問HDFS時,首先與NameNode交互,獲取目標文件的位置信息,然后與DataNode交互,讀寫數據
NameNode:master節點,每個HDFS集群只有一個,管理HDFS的名稱空間和數據塊映射信息,配置相關副本信息,處理客戶端請求。
DataNode:slave節點,存儲實際數據,並匯報狀態信息給NameNode,默認一個文件會備份3份在不同的DataNode中,實現高可靠性和容錯性。
Secondary NameNode:輔助NameNode,實現高可靠性,定期合並fsimage和fsedits,推送給NameNode;緊急情況下輔助和恢復NameNode,但其並非NameNode的熱備份。
Hadoop 2為HDFS引入了兩個重要的新功能 ——Federation和高可用(HA):
-
Federation允許集群中出現多個NameNode,之間相互獨立且不需要互相協調,各自分工,管理自己的區域。 DataNode 被用作通用的數據塊存儲設備。每個 DataNode 要向集群中所有NameNode 注冊,並發送心跳報告,執行所有 namenode的命令。
-
HDFS中的高可用性消除了Hadoop 1中存在的單點故障,其中,NameNode故障將導致集群中斷。HDFS的高可用性提供故障轉移功能(備用節點從失敗的主NameNode接管工作的過程)以實現自動化。
2、MapReduce(分布式計算框架)
MapReduce是一種基於磁盤的分布式並行批處理計算模型,用於處理大數據量的計算。其中Map對應數據集上的獨立元素進行指定的操作,生成鍵-值對形式中間,Reduce則對中間結果中相同的鍵的所有值進行規約,以得到最終結果。
Jobtracker:master節點,只有一個,管理所有作業,任務/作業的監控,錯誤處理等,將任務分解成一系列任務,並分派給Tasktracker。
Tacktracker:slave節點,運行 Map task和Reduce task;並與Jobtracker交互,匯報任務狀態。
Map task:解析每條數據記錄,傳遞給用戶編寫的map()函數並執行,將輸出結果寫入到本地磁盤(如果為map—only作業,則直接寫入HDFS)。
Reduce task:從Map 它深刻地執行結果中,遠程讀取輸入數據,對數據進行排序,將數據分組傳遞給用戶編寫的Reduce()函數執行。
3、Spark(分布式計算框架)
Spark是一種基於內存的分布式並行計算框架,不同於MapReduce的是——Job中間輸出結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要迭代的MapReduce的算法。
Cluster Manager:在standalone模式中即為Master主節點,控制整個集群,監控worker。在YARN模式中為資源管理器
Worker節點:從節點,負責控制計算節點,啟動Executor或者Driver。
Driver: 運行Application 的main()函數
Executor:執行器,是為某個Application運行在worker node上的一個進程
Spark將數據抽象為RDD(彈性分布式數據集),內部提供了大量的庫,包括Spark Core、Spark SQL、Spark Streaming、MLlib、GraphX。 開發者可以在同一個應用程序中無縫組合使用這些庫。
Spark Core:包含Spark的基本功能;尤其是定義RDD的API、操作以及這兩者上的動作。其他Spark的庫都是構建在RDD和Spark Core之上的
Spark SQL:提供通過Apache Hive的SQL變體Hive查詢語言(HiveQL)與Spark進行交互的API。每個數據庫表被當做一個RDD,Spark SQL查詢被轉換為Spark操作。
Spark Streaming:對實時數據流進行處理和控制。Spark Streaming允許程序能夠像普通RDD一樣處理實時數據,通過短時批處理實現的偽流處理。
MLlib:一個常用機器學習算法庫,算法被實現為對RDD的Spark操作。這個庫包含可擴展的學習算法,比如分類、回歸等需要對大量數據集進行迭代的操作。
GraphX:控制圖、並行圖操作和計算的一組算法和工具的集合。GraphX擴展了RDD API,包含控制圖、創建子圖、訪問路徑上所有頂點的操作
4、Flink(分布式計算框架)
Flink是一個基於內存的分布式並行處理框架,類似於Spark,但在部分設計思想有較大出入。對 Flink 而言,其所要處理的主要場景就是流數據,批數據只是流數據的一個極限特例而已。
Flink VS Spark
Spark中,RDD在運行時是表現為Java Object,而Flink主要表現為logical plan。所以在Flink中使用的類Dataframe api是被作為第一優先級來優化的。但是相對來說在spark RDD中就沒有了這塊的優化了。
Spark中,對於批處理有RDD,對於流式有DStream,不過內部實際還是RDD抽象;在Flink中,對於批處理有DataSet,對於流式我們有DataStreams,但是是同一個公用的引擎之上兩個獨立的抽象,並且Spark是偽流處理,而Flink是真流處理。
5、Yarn/Mesos(分布式資源管理器)
YARN是下一代MapReduce,即MRv2,是在第一代MapReduce基礎上演變而來的,主要是為了解決原始Hadoop擴展性較差,不支持多計算框架而提出的。
Mesos誕生於UC Berkeley的一個研究項目,現已成為Apache項目,當前有一些公司使用Mesos管理集群資源,比如Twitter。與yarn類似,Mesos是一個資源統一管理和調度的平台,同樣支持比如MR、steaming等多種運算框架。
6、Zookeeper(分布式協作服務)
解決分布式環境下的數據管理問題:統一命名,狀態同步,集群管理,配置同步等。
Hadoop的許多組件依賴於Zookeeper,它運行在計算機集群上面,用於管理Hadoop操作。
7、Sqoop(數據同步工具)
Sqoop是SQL-to-Hadoop的縮寫,主要用於傳統數據庫和Hadoop之前傳輸數據。數據的導入和導出本質上是Mapreduce程序,充分利用了MR的並行化和容錯性。
Sqoop利用數據庫技術描述數據架構,用於在關系數據庫、數據倉庫和Hadoop之間轉移數據。
8、Hive/Impala(基於Hadoop的數據倉庫)
Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉化為MapReduce任務在Hadoop上執行。通常用於離線分析。
HQL用於運行存儲在Hadoop上的查詢語句,Hive讓不熟悉MapReduce開發人員也能編寫數據查詢語句,然后這些語句被翻譯為Hadoop上面的MapReduce任務。
Impala是用於處理存儲在Hadoop集群中的大量數據的MPP(大規模並行處理)SQL查詢引擎。 它是一個用C ++和Java編寫的開源軟件。 與Apache Hive不同,Impala不基於MapReduce算法。 它實現了一個基於守護進程的分布式架構,它負責在同一台機器上運行的查詢執行的所有方面。因此執行效率高於Apache Hive。
9、HBase(分布式列存儲數據庫)
HBase是一個建立在HDFS之上,面向列的針對結構化數據的可伸縮、高可靠、高性能、分布式和面向列的動態模式數據庫。
HBase采用了BigTable的數據模型:增強的稀疏排序映射表(Key/Value),其中,鍵由行關鍵字、列關鍵字和時間戳構成。
HBase提供了對大規模數據的隨機、實時讀寫訪問,同時,HBase中保存的數據可以使用MapReduce來處理,它將數據存儲和並行計算完美地結合在一起。
10、Flume(日志收集工具)
Flume是一個可擴展、適合復雜環境的海量日志收集系統。它將數據從產生、傳輸、處理並最終寫入目標的路徑的過程抽象為數據流,在具體的數據流中,數據源支持在Flume中定制數據發送方,從而支持收集各種不同協議數據。
同時,Flume數據流提供對日志數據進行簡單處理的能力,如過濾、格式轉換等。此外,Flume還具有能夠將日志寫往各種數據目標(可定制)的能力。
Flume以Agent為最小的獨立運行單位,一個Agent就是一個JVM。單個Agent由Source、Sink和Channel三大組件構成

Source:從客戶端收集數據,並傳遞給Channel。
Channel:緩存區,將Source傳輸的數據暫時存放。
Sink:從Channel收集數據,並寫入到指定地址。
Event:日志文件、avro對象等源文件。
11、Kafka(分布式消息隊列)
Kafka是一種高吞吐量的分布式發布訂閱消息系統,它可以處理消費者規模的網站中的所有動作流數據。實現了主題、分區及其隊列模式以及生產者、消費者架構模式。
生產者組件和消費者組件均可以連接到KafKa集群,而KafKa被認為是組件通信之間所使用的一種消息中間件。KafKa內部氛圍很多Topic(一種高度抽象的數據結構),每個Topic又被分為很多分區(partition),每個分區中的數據按隊列模式進行編號存儲。被編號的日志數據稱為此日志數據塊在隊列中的偏移量(offest),偏移量越大的數據塊越新,即越靠近當前時間。生產環境中的最佳實踐架構是Flume+KafKa+Spark Streaming。
12、Oozie(工作流調度器)
Oozie是一個可擴展的工作體系,集成於Hadoop的堆棧,用於協調多個MapReduce作業的執行。它能夠管理一個復雜的系統,基於外部事件來執行,外部事件包括數據的定時和數據的出現。
Oozie工作流是放置在控制依賴DAG(有向無環圖 Direct Acyclic Graph)中的一組動作(例如,Hadoop的Map/Reduce作業、Pig作業等),其中指定了動作執行的順序。
Oozie使用hPDL(一種XML流程定義語言)來描述這個圖。
