Hadoop生态系统的详细介绍
hadoop生態(tài)系統(tǒng)的詳細介紹
簡介
Hadoop是一個開發(fā)和運行處理大規(guī)模數(shù)據(jù)的軟件平臺,是Appach的一個用java語言實現(xiàn)開源軟件框架,實現(xiàn)在大量計算機組成的集群中對海量數(shù)據(jù)進行分布式計算。今天我們來詳細介紹下hadoop的生態(tài)系統(tǒng)。
Hadoop生態(tài)系統(tǒng)概況
Hadoop是一個能夠?qū)Υ罅繑?shù)據(jù)進行分布式處理的軟件框架。具有可靠、高效、可伸縮的特點。
Hadoop的核心是HDFS和MapReduce,hadoop2.0還包括YARN。
下圖為hadoop的生態(tài)系統(tǒng):
HDFS(Hadoop分布式文件系統(tǒng))
源自于Google的GFS論文,發(fā)表于2003年10月,HDFS是GFS克隆版。
是Hadoop體系中數(shù)據(jù)存儲管理的基礎(chǔ)。它是一個高度容錯的系統(tǒng),能檢測和應(yīng)對硬件故障,用于在低成本的通用硬件上運行。HDFS簡化了文件的一致性模型,通過流式數(shù)據(jù)訪問,提供高吞吐量應(yīng)用程序數(shù)據(jù)訪問功能,適合帶有大型數(shù)據(jù)集的應(yīng)用程序。
HDFS主要有以下幾個部分組成:
1.對于大型的集群,namenode的內(nèi)存成為瓶頸,namenode的擴展性的問題;
2.namenode的單點故障問題。
3.針對以上的兩個缺陷,Hadoop2.x以后分別對這兩個問題進行了解決。
4.對于缺陷1)提出了Federation namenode來解決,該方案主要是通過多個namenode來實現(xiàn)多個命名空間來實現(xiàn)namenode的橫向擴張。從而減輕單個namenode內(nèi)存問題。
5.針對缺陷2),hadoop2.X提出了實現(xiàn)兩個namenode實現(xiàn)熱備HA的方案來解決。其中一個是處于standby狀態(tài),一個處于active狀態(tài)。
目前,在硬盤不壞的情況,我們可以通過secondarynamenode來實現(xiàn)namenode的恢復(fù)。
Mapreduce(分布式計算框架)
源自于google的MapReduce論文,發(fā)表于2004年12月,Hadoop MapReduce是google MapReduce 克隆版。MapReduce是一種計算模型,用以進行大數(shù)據(jù)量的計算。其中Map對數(shù)據(jù)集上的獨立元素進行指定的操作,生成鍵-值對形式中間結(jié)果。Reduce則對中間結(jié)果中相同“鍵”的所有“值”進行規(guī)約,以得到最終結(jié)果。MapReduce這樣的功能劃分,非常適合在大量計算機組成的分布式并行環(huán)境里進行數(shù)據(jù)處理。
MapReduce計算框架發(fā)展到現(xiàn)在有兩個版本的MapReduce的API,針對MR1主要組件有以下幾個部分組成:
(1)JobTracker:Master節(jié)點,只有一個,主要任務(wù)是資源的分配和作業(yè)的調(diào)度及監(jiān)督管理,管理所有作業(yè),作業(yè)/任務(wù)的監(jiān)控、錯誤處理等;將任務(wù)分解成一系列任務(wù),并分派給TaskTracker。
(2)TaskTracker:Slave節(jié)點,運行Map Task和Reduce Task;并與JobTracker交互,匯報任務(wù)狀態(tài)。
(3)Map Task:解析每條數(shù)據(jù)記錄,傳遞給用戶編寫的map(),并執(zhí)行,將輸出結(jié)果寫入本地磁盤。
(4)Reducer Task:從Map Task的執(zhí)行結(jié)果中,遠程讀取輸入數(shù)據(jù),對數(shù)據(jù)進行排序,將數(shù)據(jù)按照分組傳遞給用戶編寫的reduce函數(shù)執(zhí)行。
在這個過程中,有一個shuffle過程,對于該過程是理解MapReduce計算框架是關(guān)鍵。該過程包含map函數(shù)輸出結(jié)果到reduce函數(shù)輸入這一個中間過程中所有的操作,稱之為shuffle過程。在這個過程中,可以分為map端和reduce端。
Map端:
1) 輸入數(shù)據(jù)進行分片之后,分片的大小跟原始的文件大小、文件塊的大小有關(guān)。每一個分片對應(yīng)的一個map任務(wù)。
2) map任務(wù)在執(zhí)行的過程中,會將結(jié)果存放到內(nèi)存當(dāng)中,當(dāng)內(nèi)存占用達到一定的閾值(這個閾值是可以設(shè)置的)時,map會將中間的結(jié)果寫入到本地磁盤上,形成臨時文件這個過程叫做溢寫。
3) map在溢寫的過程中,會根據(jù)指定reduce任務(wù)個數(shù)分別寫到對應(yīng)的分區(qū)當(dāng)中,這就是partition過程。每一個分區(qū)對應(yīng)的是一個reduce任務(wù)。并且在寫的過程中,進行相應(yīng)的排序。在溢寫的過程中還可以設(shè)置conbiner過程,該過程跟reduce產(chǎn)生的結(jié)果應(yīng)該是一致的,因此該過程應(yīng)用存在一定的限制,需要慎用。
4) 每一個map端最后都只存在一個臨時文件作為reduce的輸入,因此會對中間溢寫到磁盤的多個臨時文件進行合并Merge操作。最后形成一個內(nèi)部分區(qū)的一個臨時文件。
Reduce端:
1) 首先要實現(xiàn)數(shù)據(jù)本地化,需要將遠程節(jié)點上的map輸出復(fù)制到本地。
2) Merge過程,這個合并過程主要是對不同的節(jié)點上的map輸出結(jié)果進行合并。
3) 不斷的復(fù)制和合并之后,最終形成一個輸入文件。Reduce將最終的計算結(jié)果存放在HDFS上。
針對MR2是新一代的MR的API。其主要是運行在Yarn的資源管理框架上。
Yarn(資源管理框架)
YARN (Yet Another Resource Negotiator,另一種資源協(xié)調(diào)者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統(tǒng),可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度,它的引入為集群在利用率、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來了巨大好處。
YARN的基本思想是將JobTracker的兩個主要功能(資源管理和作業(yè)調(diào)度/監(jiān)控)分離,主要方法是創(chuàng)建一個全局的ResourceManager(RM)和若干個針對應(yīng)用程序的ApplicationMaster(AM)。這里的應(yīng)用程序是指傳統(tǒng)的MapReduce作業(yè)或作業(yè)的DAG(有向無環(huán)圖)。
該框架是hadoop2.x以后對hadoop1.x之前JobTracker和TaskTracker模型的優(yōu)化,而產(chǎn)生出來的,將JobTracker的資源分配和作業(yè)調(diào)度及監(jiān)督分開。該框架主要有ResourceManager,Applicationmatser,nodemanager。其主要工作過程如下:
ResourceManager主要負責(zé)所有的應(yīng)用程序的資源分配,
ApplicationMaster主要負責(zé)每個作業(yè)的任務(wù)調(diào)度,也就是說每一個作業(yè)對應(yīng)一個ApplicationMaster。
Nodemanager是接收Resourcemanager 和ApplicationMaster的命令來實現(xiàn)資源的分配執(zhí)行體。
ResourceManager在接收到client的作業(yè)提交請求之后,會分配一個Container,這里需要說明一下的是Resoucemanager分配資源是以Container為單位分配的。第一個被分配的Container會啟動Applicationmaster,它主要負責(zé)作業(yè)的調(diào)度。Applicationmanager啟動之后則會直接跟NodeManager通信。
在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的調(diào)度器負責(zé)資源的分配,而NodeManager則負責(zé)資源的供給和隔離。ResourceManager將某個NodeManager上資源分配給任務(wù)(這就是所謂的“資源調(diào)度”)后,NodeManager需按照要求為任務(wù)提供相應(yīng)的資源,甚至保證這些資源應(yīng)具有獨占性,為任務(wù)運行提供基礎(chǔ)的保證,這就是所謂的資源隔離。
在Yarn平臺上可以運行多個計算框架,如:MR,Tez,Storm,Spark等計算,框架。
Sqoop(數(shù)據(jù)同步工具)
Sqoop是SQL-to-Hadoop的縮寫,主要用于傳統(tǒng)數(shù)據(jù)庫和Hadoop之間傳輸數(shù)據(jù)。數(shù)據(jù)的導(dǎo)入和導(dǎo)出本質(zhì)上是Mapreduce程序,充分利用了MR的并行化和容錯性。其中主要利用的是MP中的Map任務(wù)來實現(xiàn)并行導(dǎo)入,導(dǎo)出。Sqoop發(fā)展到現(xiàn)在已經(jīng)出現(xiàn)了兩個版本,一個是sqoop1.x.x系列,一個是sqoop1.99.X系列。對于sqoop1系列中,主要是通過命令行的方式來操作。
sqoop1 import原理:從傳統(tǒng)數(shù)據(jù)庫獲取元數(shù)據(jù)信息(schema、table、field、field type),把導(dǎo)入功能轉(zhuǎn)換為只有Map的Mapreduce作業(yè),在mapreduce中有很多map,每個map讀一片數(shù)據(jù),進而并行的完成數(shù)據(jù)的拷貝。
sqoop1 export原理:獲取導(dǎo)出表的schema、meta信息,和Hadoop中的字段match;多個map only作業(yè)同時運行,完成hdfs中數(shù)據(jù)導(dǎo)出到關(guān)系型數(shù)據(jù)庫中。
Sqoop1.99.x是屬于sqoop2的產(chǎn)品,該款產(chǎn)品目前功能還不是很完善,處于一個測試階段,一般并不會應(yīng)用于商業(yè)化產(chǎn)品當(dāng)中。
Mahout(數(shù)據(jù)挖掘算法庫)
Mahout起源于2008年,最初是Apache Lucent的子項目,它在極短的時間內(nèi)取得了長足的發(fā)展,現(xiàn)在是Apache的頂級項目。相對于傳統(tǒng)的MapReduce編程方式來實現(xiàn)機器學(xué)習(xí)的算法時,往往需要話費大量的開發(fā)時間,并且周期較長,而Mahout的主要目標是創(chuàng)建一些可擴展的機器學(xué)習(xí)領(lǐng)域經(jīng)典算法的實現(xiàn),旨在幫助開發(fā)人員更加方便快捷地創(chuàng)建智能應(yīng)用程序。
Mahout現(xiàn)在已經(jīng)包含了聚類、分類、推薦引擎(協(xié)同過濾)和頻繁集挖掘等廣泛使用的數(shù)據(jù)挖掘方法。除了算法,Mahout還包含數(shù)據(jù)的輸入/輸出工具、與其他存儲系統(tǒng)(如數(shù)據(jù)庫、MongoDB 或Cassandra)集成等數(shù)據(jù)挖掘支持架構(gòu)。
mahout的各個組件下面都會生成相應(yīng)的jar包。此時我們需要明白一個問題:到底如何使用mahout呢?
實際上,mahout只是一個機器學(xué)習(xí)的算法庫,在這個庫當(dāng)中是想了相應(yīng)的機器學(xué)習(xí)的算法,如:推薦系統(tǒng)(包括基于用戶和基于物品的推薦),聚類和分類算法。并且這些算法有些實現(xiàn)了MapReduce,spark從而可以在hadoop平臺上運行,在實際的開發(fā)過程中,只需要將相應(yīng)的jar包即可。
Hbase(分布式列存數(shù)據(jù)庫)
源自Google的Bigtable論文,發(fā)表于2006年11月,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫是對面向行的數(shù)據(jù)庫。HBase是Google Bigtable克隆版,HBase是一個針對結(jié)構(gòu)化數(shù)據(jù)的可伸縮、高可靠、高性能、分布式和面向列的動態(tài)模式數(shù)據(jù)庫。和傳統(tǒng)關(guān)系數(shù)據(jù)庫不同,HBase采用了BigTable的數(shù)據(jù)模型:增強的稀疏排序映射表(Key/Value),其中,鍵由行關(guān)鍵字、列關(guān)鍵字和時間戳構(gòu)成。HBase提供了對大規(guī)模數(shù)據(jù)的隨機、實時讀寫訪問,同時,HBase中保存的數(shù)據(jù)可以使用MapReduce來處理,它將數(shù)據(jù)存儲和并行計算完美地結(jié)合在一起。
Hbase表的特點
-
大:一個表可以有數(shù)十億行,上百萬列;
-
無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據(jù)需要動態(tài)的增加,同一張表中不同的行可以有截然不同的列;
-
面向列:面向列(族)的存儲和權(quán)限控制,列(族)獨立檢索; 稀疏:空(null)列并不占用存儲空間,表可以設(shè)計的非常稀疏;
-
數(shù)據(jù)多版本:每個單元中的數(shù)據(jù)可以有多個版本,默認情況下版本號自動分配,是單元格插入時的時間戳;
-
數(shù)據(jù)類型單一:Hbase中的數(shù)據(jù)都是字符串,沒有類型。 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,隨著數(shù)據(jù)增多,region不斷增大,當(dāng)增大到一個閥值的時候,region就會等分會兩個新的region,之后會有越來越多的region;
??4.Region是Hbase中分布式存儲和負載均衡的最小單元,不同Region分布到不同RegionServer上。、
??5.Region雖然是分布式存儲的最小單元,但并不是存儲的最小單元。Region由一個或者多個Store組成,每個store保存一個columns family;每個Strore又由一個memStore和0至多個StoreFile組成,StoreFile包含HFile;memStore存儲在內(nèi)存中,StoreFile存儲在HDFS上。
Zookeeper(分布式協(xié)作服務(wù))
源自Google的Chubby論文,發(fā)表于2006年11月,Zookeeper是Chubby克隆版,主要解決分布式環(huán)境下的數(shù)據(jù)管理問題:統(tǒng)一命名,狀態(tài)同步,集群管理,配置同步等。
Zookeeper的主要實現(xiàn)兩步:
- 選舉Leader
- 同步數(shù)據(jù)。這個組件在實現(xiàn)namenode的HA高可用性的時候,需要用到。
Pig(基于Hadoop的數(shù)據(jù)流系統(tǒng))
由yahoo!開源,設(shè)計動機是提供一種基于MapReduce的ad-hoc(計算在query時發(fā)生)數(shù)據(jù)分析工具
定義了一種數(shù)據(jù)流語言—Pig Latin,將腳本轉(zhuǎn)換為MapReduce任務(wù)在Hadoop上執(zhí)行。通常用于進行離線分析。
Hive(基于Hadoop的數(shù)據(jù)倉庫)
由facebook開源,最初用于解決海量結(jié)構(gòu)化的日志數(shù)據(jù)統(tǒng)計問題。
Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉(zhuǎn)化為MapReduce任務(wù)在Hadoop上執(zhí)行。通常用于離線分析。
Flume(日志收集工具)
Cloudera開源的日志收集系統(tǒng),具有分布式、高可靠、高容錯、易于定制和擴展的特點。
它將數(shù)據(jù)從產(chǎn)生、傳輸、處理并最終寫入目標的路徑的過程抽象為數(shù)據(jù)流,在具體的數(shù)據(jù)流中,數(shù)據(jù)源支持在Flume中定制數(shù)據(jù)發(fā)送方,從而支持收集各種不同協(xié)議數(shù)據(jù)。同時,Flume數(shù)據(jù)流提供對日志數(shù)據(jù)進行簡單處理的能力,如過濾、格式轉(zhuǎn)換等。此外,Flume還具有能夠?qū)⑷罩緦懲鞣N數(shù)據(jù)目標(可定制)的能力。總的來說,Flume是一個可擴展、適合復(fù)雜環(huán)境的海量日志收集系統(tǒng)。
Oozie
在Hadoop中執(zhí)行的任務(wù)有時候需要把多個Map/Reduce作業(yè)連接到一起,這樣才能夠達到目的。在Hadoop生態(tài)圈中,有一種相對比較新的組件叫做Oozie,它讓我們可以把多個Map/Reduce作業(yè)組合到一個邏輯工作單元中,從而完成更大型的任務(wù)。
Oozie是一種Java Web應(yīng)用程序,它運行在Java servlet容器——即Tomcat——中,并使用數(shù)據(jù)庫來存儲以下內(nèi)容:
1、工作流定義
2、當(dāng)前運行的工作流實例,包括實例的狀態(tài)和變量
Oozie工作流是放置在控制依賴DAG(有向無環(huán)圖 Direct Acyclic Graph)中的一組動作(例如,Hadoop的Map/Reduce作業(yè)、Pig作業(yè)等),其中指定了動作執(zhí)行的順序。我們會使用hPDL(一種XML流程定義語言)來描述這個圖。
Spark
Spark 是專為大規(guī)模數(shù)據(jù)處理而設(shè)計的快速通用的計算引擎。Spark是UC Berkeley AMP lab (加州大學(xué)伯克利分校的AMP實驗室)所開源的類Hadoop MapReduce的通用并行框架,Spark,擁有Hadoop MapReduce所具有的優(yōu)點;但不同于MapReduce的是——Job中間輸出結(jié)果可以保存在內(nèi)存中,從而不再需要讀寫HDFS,因此Spark能更好地適用于數(shù)據(jù)挖掘與機器學(xué)習(xí)等需要迭代的MapReduce的算法。
Spark 是一種與 Hadoop 相似的開源集群計算環(huán)境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負載方面表現(xiàn)得更加優(yōu)越,換句話說,Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負載。
Spark 是在 Scala 語言中實現(xiàn)的,它將 Scala 用作其應(yīng)用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對象一樣輕松地操作分布式數(shù)據(jù)集。
盡管創(chuàng)建 Spark 是為了支持分布式數(shù)據(jù)集上的迭代作業(yè),但是實際上它是對 Hadoop 的補充,可以在 Hadoop 文件系統(tǒng)中并行運行。通過名為 Mesos 的第三方集群框架可以支持此行為。Spark 由加州大學(xué)伯克利分校 AMP 實驗室 (Algorithms, Machines, and People Lab) 開發(fā),可用來構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序。
Tez
Tez是一個針對Hadoop數(shù)據(jù)處理應(yīng)用程序的新分布式執(zhí)行框架。Tez是Apache最新的支持DAG作業(yè)的開源計算框架,它可以將多個有依賴的作業(yè)轉(zhuǎn)換為一個作業(yè)從而大幅提升DAG作業(yè)的性能。Tez并不直接面向最終用戶——事實上它允許開發(fā)者為最終用戶構(gòu)建性能更快、擴展性更好的應(yīng)用程序。Hadoop傳統(tǒng)上是一個大量數(shù)據(jù)批處理平臺。但是,有很多用例需要近乎實時的查詢處理性能。還有一些工作則不太適合MapReduce,例如機器學(xué)習(xí)。Tez的目的就是幫助Hadoop處理這些用例場景。
Tez項目的目標是支持高度定制化,這樣它就能夠滿足各種用例的需要,讓人們不必借助其他的外部方式就能完成自己的工作,如果 Hive和 Pig 這樣的項目使用Tez而不是MapReduce作為其數(shù)據(jù)處理的骨干,那么將會顯著提升它們的響應(yīng)時間。Tez構(gòu)建在YARN之上,后者是Hadoop所使用的新資源管理框架。
Storm
Storm為分布式實時計算提供了一組通用原語,可被用于“流處理”之中,實時處理消息并更新數(shù)據(jù)庫。這是管理隊列及工作者集群的另一種方式。 Storm也可被用于“連續(xù)計算”(continuous computation),對數(shù)據(jù)流做連續(xù)查詢,在計算時就將結(jié)果以流的形式輸出給用戶。它還可被用于“分布式RPC”,以并行的方式運行昂貴的運算。
Storm可以方便地在一個計算機集群中編寫與擴展復(fù)雜的實時計算,Storm用于實時處理,就好比 Hadoop 用于批處理。Storm保證每個消息都會得到處理,而且它很快——在一個小集群中,每秒可以處理數(shù)以百萬計的消息。更棒的是你可以使用任意編程語言來做開發(fā)。
總結(jié)
以上是生活随笔為你收集整理的Hadoop生态系统的详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 焊门员稳了!3000多位米粉还不知道Re
- 下一篇: 31.99万起 阿维塔11单电机版上市: