大数据技术——hadoop组件
1.1hadoop的概念
Hadoop是 Apache基金會下一個開源的分布式計算平臺,它以分布式文件系統(tǒng)HDFS和MapReduce算法為核心,為用戶提供了系統(tǒng)底層細節(jié)透明的分布式基礎(chǔ)架構(gòu)。用戶可以在不了解分布式底層細節(jié)的情況下,充分利用分布式集群進行高速運算和存儲。
1.2Hadoop的基本組成
Hadoop是一個大數(shù)據(jù)解決方案。它提供了一套分布式系統(tǒng)基礎(chǔ)架構(gòu).核心內(nèi)容包含HDFS和mapreduce。hadoop2.0以后引入Yarn.HDFS是提供數(shù)據(jù)存儲的,mapreduce方便數(shù)據(jù)計算的。
1. HDFS又對應(yīng)namenode 和 datanode. namenode 負責保存元數(shù)據(jù)的基本信息,datanode 直接存放數(shù)據(jù)本身;主要是為了解決海量數(shù)據(jù)的存儲工作。
2. mapreduce 對應(yīng) jobtracker 和 tasktracker. jobtracker 負責分發(fā)任務(wù), tasktracker 負責執(zhí)行具體任務(wù);主要是為了解決海量數(shù)據(jù)的計算問題
3. 對應(yīng)到 master/slave 架構(gòu), namenode 和 jobtracker 就應(yīng)該對應(yīng)到 master, datanode
和 tasktracker 就應(yīng)該對應(yīng)到 slave。
4.Yarn :是作業(yè)的調(diào)度和集群資源的管理框架:主要是是為了解決任務(wù)的調(diào)度工作。
1.3Hadoop的生態(tài)圈
Hadoop的生態(tài)圈中有很多產(chǎn)品的:
HDFS:分布式文件系統(tǒng)
HIVE:基于Hadoop的分布式數(shù)據(jù)倉庫
HBASE:基于Hadoop的海量數(shù)據(jù)庫
Zookeeper:分布式服務(wù)協(xié)調(diào)組件
Mahout:分布式機器學習庫
Oozie:工作流調(diào)度框架
Sqoop:數(shù)據(jù)導(dǎo)入導(dǎo)出工具
Flume:數(shù)據(jù)日志采集框架
Impala:基于hadoop的實時分析框架。
2.1HDFS 的基本原理
2.1.1NameNode
NamaeNode是HDFS的核心也是master nameNode僅僅存儲的HDFS原數(shù)據(jù),文件系統(tǒng)中的文件的所有的樹目錄,并跟蹤真?zhèn)€集群的文件。NameNode不存儲實際的數(shù)據(jù)的和數(shù)據(jù)集數(shù)據(jù)的本身在DataNodes中,Namenode知識知道HDFS任何文件中的塊列表的具體的位置,使用這個NameNode知道如何從快中構(gòu)建文件。NameNode并不持久化的存儲每一個文件在中和每個DataNodede的位置信息。這些信息在系統(tǒng)啟動的時候從數(shù)據(jù)的節(jié)點的重建。NameNode是HDFS的關(guān)鍵在NameNode關(guān)閉的時候集群是無法訪問的、namenode是hadoop的集群的點點故障。Namenode所在的機器是會配置大量的內(nèi)存RM的。
2.1.2DataName
DataNode是負責實際的數(shù)據(jù)的存儲的在HDFS中的。在集群中也是slave的這樣一個說法。Namenode和dataNode濕會保持不斷的通信的。在DataNode啟動的是將自己的發(fā)布到NameNode中。當DataNode關(guān)閉的時候不會影響豬呢個集群的可用性。Namenode 將安排和其他的數(shù)據(jù)的DataNode管理的塊驚醒復(fù)制。復(fù)制dataNode中所在的機器中有大量的硬盤的空間,是因為大量的數(shù)據(jù)存儲在其中。
HDFS上問價在物理上是分塊存儲的。每一個塊的代銷是默認是128M.
2.2HDFS的寫流程
1客戶端通過對DistributedFileSystem對象調(diào)用create()來新建對象。
2DistributedFileSystem對NameNode創(chuàng)建一個RPC調(diào)用,在文件系統(tǒng)的命名空間中新建一個文件,此時該文件中還沒有響應(yīng)的數(shù)據(jù)塊。NameNode執(zhí)行各種不同的檢查以確保這個文件不存在以及客戶端有新建該文件的權(quán)限。
1如果這些檢查均通過,NameNode就會為創(chuàng)建新文件記錄一條記錄;DistributedFileStream向客戶端返回一個FSDataOutputStream對象,由此客戶端可以開始寫入數(shù)據(jù)。就像讀取事件一樣,文件系統(tǒng)數(shù)據(jù)輸出流控制一個DFSOutputStream,負責處理datanode和namenode之間的通信。
2否則,文件創(chuàng)建失敗并向客戶端拋出一個IOException異常。
3在客戶端寫入數(shù)據(jù)時,DFSOutputStream將它分成一個個的數(shù)據(jù)包,并寫入內(nèi)部隊列,稱為“數(shù)據(jù)隊列”(data queue)。DataStreamer處理數(shù)據(jù)隊列,它的責任是挑選出適合存儲數(shù)據(jù)復(fù)本的一組DataNode,并據(jù)此來要求NameNode分配新的數(shù)據(jù)塊。這一組DataNode構(gòu)成一個管線——我們假設(shè)復(fù)本數(shù)為3,所以管線中有3個節(jié)點。
4DataStream將數(shù)據(jù)包流式傳輸?shù)焦芫€中第1個DataNode,該DataNode存儲數(shù)據(jù)包并將它發(fā)送到管線中的第2個DataNode。同樣,第2個DataNode存儲該數(shù)據(jù)包并且發(fā)送給管線中的第3個(也是最后一個)DataNode。
5DFSOutputStream也維護著一個內(nèi)部數(shù)據(jù)包隊列來等待DataNode的收到確認回執(zhí),稱為“確認隊列”(ack queue)。收到管道中所有DataNode確認信息后,該數(shù)據(jù)包才會從確認隊列刪除。如果有DataNode在數(shù)據(jù)寫入期間發(fā)生故障,則執(zhí)行以下操作(對寫入數(shù)據(jù)的客戶端是透明的)。
1首先關(guān)閉管線,確認把隊列中的所有數(shù)據(jù)包都添加回數(shù)據(jù)隊列的最前端,以確保故障節(jié)點下游的DataNode不會漏掉任何一個數(shù)據(jù)包。
2為存儲在另一正常DataNode的當前數(shù)據(jù)塊指定一個新的標識,并將該標識傳送給NameNode,以便故障DataNode在恢復(fù)后可以刪除存儲的部分數(shù)據(jù)塊。
3從管線中刪除故障DataNode,基于兩個正常DataNode構(gòu)建一條新管線。
4余下的數(shù)據(jù)塊寫入管線中正常的DataNode。
5NameNode注意到塊復(fù)本量不足時,會在另一個節(jié)點上創(chuàng)建一個新的復(fù)本。后續(xù)的數(shù)據(jù)塊繼續(xù)正常接受處理。
6客戶端完成數(shù)據(jù)的寫入后,對數(shù)據(jù)流調(diào)用close()。
7在聯(lián)系到NameNode告知其文件寫入完成之前,此操作會將剩余的所有數(shù)據(jù)包寫入DataNode管線并等待確認。NameNode已經(jīng)直到文件由哪些塊組成(因為Datastreamer請求分配數(shù)據(jù)塊),所以它在返回成功前只需要等待數(shù)據(jù)塊進行最小量的復(fù)制。
2.3HDFS的讀取流程
1、HDFS客戶端通過調(diào)用FileSyste對象的open()方法來打開希望讀取的文件,對于HDFS來說,這個對象是DistributedFileSystem的一個實例。
2、DistributedFileSystem通過使用遠程過程調(diào)用(RPC)來調(diào)用NameNode,以確定文件起始塊的位置。對于每個塊,NameNode返回具有該塊副本的DataNode地址。此外,這些DataNode根據(jù)它們與客戶端的距離來排序(根據(jù)集群的網(wǎng)絡(luò)拓撲),如果該客戶端本身就是一個DataNode,便從本地讀取數(shù)據(jù)。接著DistributedFileSystem類返回一個FSDataInputStream對象(一個支持文件定位的輸入流)給客戶端以便讀取數(shù)據(jù)。FSDataInputStream類轉(zhuǎn)而封裝DFSInputStream對象,該對象管理著DataNode和NameNode的 I/O。
3、客戶端對這個輸入流調(diào)用read()方法,存儲著文件起始幾個塊的DataNode地址的DFSInputStream隨即連接距離最近的文件中第一個塊所在的DataNode。
4、通過對數(shù)據(jù)流反復(fù)調(diào)用read()方法,可以將數(shù)據(jù)從DataNode傳輸?shù)紿DFS 客戶端。
5、讀取數(shù)據(jù)到塊的末端時,DFSInputStream關(guān)閉與該DataNode的連接,然后尋找下一個塊的最佳DataNode。在HDFS客戶端所看來它一直在讀取一個連續(xù)的流,這些對于客戶端來說是透明的。
6、客戶端從流中讀取數(shù)據(jù)時,塊是按照打開DFSInputStream與DataNode新建連接的順序讀取的,它也會根據(jù)需要詢問NameNode來檢索下一批數(shù)據(jù)塊的DataNode的位置,一旦客戶端讀取完畢,就會調(diào)用close()方法。但在讀取時,DFSInputStream與DataNode通信時遇到錯誤,會嘗試從這個塊的另外一個最鄰近DataNode讀取數(shù)據(jù),它也會記住那個故障DataNode,以保證以后不會反復(fù)讀取該節(jié)點上后續(xù)的塊。DFSInputStream也會通過校驗和確認從DataNode發(fā)來的數(shù)據(jù)是否完整。如果發(fā)現(xiàn)有損壞的塊,DFSInputStream會試圖從其他DataNode讀取其復(fù)本,也會將被損壞的塊通知給NameNode
HDFS讀數(shù)據(jù)過程這一設(shè)計的一個重點是:客戶端可以直接連接到DataNode檢索數(shù)據(jù),且NameNode告知客戶端每個塊所在的最佳DataNode,由于數(shù)據(jù)流分散在集群中的所有DataNode,所以這種設(shè)計能使HDFS擴展到大量的并發(fā)客戶端。同時,NameNode只需要響應(yīng)塊位置的請求(這些信息存儲在內(nèi)存中,因而非常高效),無需響應(yīng)數(shù)據(jù)請求,否則隨著客戶端數(shù)量的增長,NameNode會很快稱為瓶頸。
這里HdfsDataInputStream是FSDataInputStream的子類,這里是通過子類創(chuàng)建父類對象。
MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運算。主要思想是函數(shù)式編程語言中的"Map"和"Reduce"概念,來實現(xiàn)海量數(shù)據(jù)運算的“分而治之”。
Hadoop-mapreduce是hadoop中一個批量計算的框架,在整個mapreduce作業(yè)的過程中,包括從數(shù)據(jù)的輸入,數(shù)據(jù)的處理,數(shù)據(jù)的數(shù)據(jù)輸出這些部分,而其中數(shù)據(jù)的處理部分就要map,reduce,combiner等操作組成。在一個mapreduce的作業(yè)中必定會涉及到如下一些組件:
1、客戶端,提交mapreduce作業(yè)
2、yarn資源管理器,負責集群上計算資源的協(xié)調(diào)
3、yarn節(jié)點管理器,負責啟動和監(jiān)控集群中機器上的計算容器(container)
4、mapreduce的application master,負責協(xié)調(diào)運行mapreduce的作業(yè)
5、hdfs,分布式文件系統(tǒng),負責與其他實體共享作業(yè)文件。
3.1MapReduce架構(gòu):
Mapreduce2.0架構(gòu)圖
a、Client
與MapReduce 1.0 的Client類似,用戶通過Client與YARN交互,提交MapReduce作業(yè),查詢作業(yè)運行狀態(tài),管理作業(yè)等。
b、MRAppMaster
功能類似于 1.0 中的JobTracker ,但不負責資源管理;
功能包括:任務(wù)劃分、資源申請并將之二次分配個Map Task和Reduce Task。
a、MRAppMaster 容錯性
?? 一旦運行失敗,由YARN 的ResourceManager 負責重新啟動,最多重啟次數(shù)可由用戶設(shè)置,默認是2 次。一旦超過最高重啟次數(shù),則作業(yè)運行失敗。
b、Map Task/Reduce Task
? Task 周期性向MRAppMaster 匯報心跳;
? 一旦Task 掛掉,則MRAppMaster 將為之重新申請資源,并運行之。最多重新運行次數(shù)可由用戶設(shè)置,默認4 次。
MapReduce的執(zhí)行流程:
1向資源管理器(ResourceManager)請求,要運行一個程序。中獲取新的作業(yè)ID(jobId),以及程序資源存儲路徑
2ResourceManager檢查作業(yè)的輸出說明,然后返回一個存放程序資源的路徑以及jobId,這個路徑在hdfs的tmp文件夾中,如果程序中沒有指定輸出目錄或指定的輸出目錄已經(jīng)存在,作業(yè)就不提交,錯誤返回給MapReduce程序就是這個路徑存放程序資源,包括切邊信息,程序的jar包,job.xml配置文件等。
3客戶端去計算作業(yè)的輸入分片,把job對象序列化為job.XML配置文件,里面全是 key,value。并把切邊序列化成文件保存到hdfs的資源路徑下,如果無法計算,比如因為輸入路徑不存在,作業(yè)就無法提交,將錯誤返回給Mapreduce程序。作業(yè)客戶端檢查作業(yè)的輸出說明,在計算輸入分片
4將作業(yè)資源(包括JAR、配置和分片信息)復(fù)制到HDFS,默認保存10份。
5通過調(diào)用資源管理器上的submitApplication()方法提交作業(yè)。
6資源管理器收到調(diào)用它的submitApplication()消息后,如果容器不夠,任務(wù)會現(xiàn)在等待隊列中等待,之后便將請求傳遞給調(diào)度器(Schedule),調(diào)度器分配一個容器,然后資源管理器在節(jié)點管理器的管理下在容器中啟動應(yīng)用程序master進程也就是MRAPPMaster。
MapReduce作業(yè)的application master是一個Java應(yīng)用程序,它的主類是MRAPPMaster他對作業(yè)進行初始化,通過創(chuàng)建多個薄記對象以保持對作業(yè)進度的跟蹤,因為他將接受來自任務(wù)的進度和完成報告
7MRAPPMaster根據(jù)切邊信息,獲知要啟動多少個mapTask,向ResourceManager請求容器
8一旦資源管理器的調(diào)度器為任務(wù)分配了容器,MRAPPMaster(application master) 就通過與節(jié)點管理器NodeManager通信來啟動容器向已獲得容器的mapTask或reduceerTask發(fā)從啟動命令,也就是主類為YarnChild程序
MapReduce的應(yīng)用場景
1、? 簡單的數(shù)據(jù)統(tǒng)計,比如網(wǎng)站pv 、uv 統(tǒng)計
2、? 搜索引擎建索引
3、? 海量數(shù)據(jù)查找
4、? 復(fù)雜數(shù)據(jù)分析算法實現(xiàn)
5、? 聚類算法
6、? 分類算法
7、? 推薦算法
3.2MapReduce的序列化
Yarn的架構(gòu)和原理
YARN是Hadoop 2.0的資源管理器。它是一個通用的資源管理系統(tǒng),可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度,它的引入為集群在利用率、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來了巨大好處。
YARN的基本設(shè)計思想是將Hadoop 1.0中的JobTracker拆分成了兩個獨立的服務(wù):一個全局的資源管理器ResourceManager和每個應(yīng)用程序特有的ApplicationMaster。其中ResourceManager負責整個系統(tǒng)的資源管理和分配,而ApplicationMaster負責單個應(yīng)用程序的管理,其基本架構(gòu)如下圖所示:
YARN總體上仍然是Master/Slave結(jié)構(gòu)。在整個資源管理框架中,ResourceManager為Master,NodeManager為Slave,并通過HA方案實現(xiàn)了ResourceManager的高可用。ResourceManager負責對各個NodeManager上的資源進行統(tǒng)一管理和調(diào)度。當用戶提交一個應(yīng)用程序時,需要提供一個用以跟蹤和管理這個程序的ApplicationMaster,它負責向ResourceManager申請資源,并要求NodeManger啟動可以占用一定資源的任務(wù)。由于不同的ApplicationMaster被分布到不同的節(jié)點上,因此它們之間不會相互影響。
ResourceManager:它是一個全局的資源管理器,負責整個系統(tǒng)的資源管理和分配,主要由調(diào)度器和應(yīng)用程序管理器兩個組件構(gòu)成。
調(diào)度器:根據(jù)容量、隊列等限制條件,將系統(tǒng)中的資源分配給各個正在運行的應(yīng)用程序。調(diào)度器僅根據(jù)應(yīng)用程序的資源需求進行資源分配,而資源分配單位用一個抽象概念“資源容器”(簡稱Container)表示,Container是一個動態(tài)資源分配單位,它將內(nèi)存、CPU、磁盤、網(wǎng)絡(luò)等資源封裝在一起,從而限定每個任務(wù)使用的資源量。
應(yīng)用程序管理器:負責管理整個系統(tǒng)中所有的應(yīng)用程序,包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動ApplicationMaster、監(jiān)控ApplicationMaster運行狀態(tài)并在失敗時重新啟動它等。
ApplicationMaster:用戶提交的每個應(yīng)用程序均包含1個ApplicationMaster,主要功能包括與ResourceManager調(diào)度器協(xié)商以獲取資源、將得到的任務(wù)進一步分配給內(nèi)部的任務(wù)、與NodeManager通信以啟動/停止任務(wù)、監(jiān)控所有任務(wù)運行狀態(tài)并在任務(wù)運行失敗時重新為任務(wù)申請資源以重啟任務(wù)等。
NodeManager:它是每個節(jié)點上的資源和任務(wù)管理器,它不僅定時向ResourceManager匯報本節(jié)點上的資源使用情況和各個Container的運行狀態(tài),還接收并處理來自ApplicationMaster的Container啟動/停止等各種請求。
Container:它是YARN中的資源抽象,它封裝了某個節(jié)點上的多維度資源,如內(nèi)存、CPU、磁盤、網(wǎng)絡(luò)等,當ApplicationMaster向ResourceManager申請資源時,返回的資源便是用Container表示的。YARN會為每個任務(wù)分配一個Container,且該任務(wù)只能使用該Container中描述的資源。
1Yarn的工作流程
步驟1:用戶向YARN中提交應(yīng)用程序,其中包括用戶程序、ApplicationMaster程序、ApplicationMaster啟動命令等。
步驟2:ResourceManager為應(yīng)用程序分配第一個Container,并與對應(yīng)的NodeManager通信,要求它在這個Container中啟動應(yīng)用程序的ApplicationMaster。
步驟3:ApplicationMaster首先向ResourceManager注冊,這樣用戶可以直接通過ResourceManager查看應(yīng)用程序的運行狀態(tài),然后ApplicationMaster為各個任務(wù)申請資源,并監(jiān)控它們的運行狀態(tài),直到運行結(jié)束,即重復(fù)步驟4-7。
步驟4:ApplicationMaster用輪詢的方式通過RPC協(xié)議向ResourceManager申請和領(lǐng)取資源。
步驟5:一旦ApplicationMaster成功申請到資源,便開始與對應(yīng)的NodeManager通信,要求它啟動任務(wù)。
步驟6:NodeManager為任務(wù)設(shè)置好運行環(huán)境(包括環(huán)境變量、JAR包、二進制程序等)后,將任務(wù)啟動命令寫到一個腳本中,并通過運行該腳本啟動任務(wù)。
步驟7:各個任務(wù)通過某個RPC協(xié)議向ApplicationMaster匯報自己的狀態(tài)和進度,使ApplicationMaster能夠隨時掌握各個任務(wù)的運行狀態(tài),從而可以在任務(wù)失敗時重新啟動任務(wù)。在應(yīng)用程序運行過程中,用戶可隨時通過RPC向ApplicationMaster查詢應(yīng)用程序的當前運行狀態(tài)。
步驟8:應(yīng)用程序運行完成后,ApplicationMaster通過RPC協(xié)議向ResourceManager注銷并關(guān)閉自己。
hadoop的面試問題:
1HDFS的數(shù)據(jù)的寫數(shù)據(jù)流程:
HDFS的讀機制
HDFS中的NameNode的機制
?HDFS的DataNode工作機制
MapperReducer的機制
?
?
Yarn集群的架構(gòu)原理
?
?MapperReduce的的工作的機制:
總結(jié)
以上是生活随笔為你收集整理的大数据技术——hadoop组件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李宏毅机器学习--课后作业HW_1
- 下一篇: 三人表决器Verilog