1、服務(wù)概述
Hadoop是一個(gè)開源的分布式計(jì)算和存儲(chǔ)框架,由Apache基金會(huì)開發(fā)和維護(hù)。Hadoop 為龐大的計(jì)算機(jī)集群提供可靠的、可伸縮的應(yīng)用層計(jì)算和存儲(chǔ)支持,它允許使用簡(jiǎn)單的編程模型跨計(jì)算機(jī)群集分布式處理大型數(shù)據(jù)集,并且支持在單臺(tái)計(jì)算機(jī)到幾千臺(tái)計(jì)算機(jī)之間進(jìn)行擴(kuò)展。
Hadoop使用Java開發(fā),所以可以在多種不同硬件平臺(tái)的計(jì)算機(jī)上部署和使用。其核心部件包括分布式文件系統(tǒng) (Hadoop DFS,HDFS) 和MapReduce。
1.1 HDFS
Hadoop Distributed File System,Hadoop分布式文件系統(tǒng),簡(jiǎn)稱HDFS
1.1.1 架構(gòu)解析
1.1.1.1 Block 數(shù)據(jù)塊
- 基本存儲(chǔ)單元,1.x版本默認(rèn)64M,2.x版本之后默認(rèn)128M;
- 單個(gè)文件會(huì)被拆分成為一個(gè)個(gè)大小相同的塊數(shù)據(jù),存儲(chǔ)在不同的機(jī)器上,當(dāng)一個(gè)文件小于Block設(shè)置的大小,那么實(shí)際占用的空間為其文件的大小;
- 基本讀寫單位,類似于磁盤的頁(yè),每次都是讀寫一個(gè)塊;
- 每個(gè)塊都會(huì)被復(fù)制到多個(gè)機(jī)器上,默認(rèn)副本數(shù)量為3。
Hadoop 1.x版本默認(rèn)為64M,Hadoop 2.x版本之后默認(rèn)為128M。
- 減少搜索時(shí)間,一般情況下硬盤傳輸速率比尋道時(shí)間更快,較大的塊可以減少尋道時(shí)間;
- 減少管理塊的數(shù)據(jù)開銷,每個(gè)塊都需要在NameNode上有對(duì)應(yīng)記錄,數(shù)量少可以減少這些記錄;
- 對(duì)較大的數(shù)據(jù)塊進(jìn)行讀寫,可以降低網(wǎng)絡(luò)通信的次數(shù)和成本。
1.1.1.2 NameNode 名稱節(jié)點(diǎn)
- 存儲(chǔ)文件的metadata,運(yùn)行時(shí)所有數(shù)據(jù)都保存到內(nèi)存(因此推薦部署節(jié)點(diǎn)性能內(nèi)存偏大),整個(gè)HDFS可存儲(chǔ)的文件數(shù)受限于NameNode的內(nèi)存大??;
- NameNode主要存放文件系統(tǒng)樹及所有文件、目錄的元數(shù)據(jù)。元數(shù)據(jù)持久化為2種形式:namespcae image 鏡像文件 + edit log 日志文件,持久化數(shù)據(jù)中不包括Block所在的節(jié)點(diǎn)列表,及文件的Block分布在集群中的哪些節(jié)點(diǎn)上,這些信息是在系統(tǒng)重啟的時(shí)候重新構(gòu)建(通過Datanode匯報(bào)的Block信息)。
- 一個(gè)Block在NameNode中對(duì)應(yīng)一條記錄(一般一個(gè)Block占用150字節(jié)),如果是大量的小文件,會(huì)消耗大量?jī)?nèi)存;同時(shí)map task的數(shù)量是由splits來決定的,所以用MapReduce處理大量的小文件時(shí),就會(huì)產(chǎn)生過多的map task,線程管理開銷將會(huì)增加作業(yè)時(shí)間;處理大量小文件的速度遠(yuǎn)遠(yuǎn)小于處理同等大小的大文件的速度。因此Hadoop建議存儲(chǔ)大文件;
- 數(shù)據(jù)會(huì)定時(shí)保存到本地磁盤,但不保存Block的位置信息,而是由DataNode注冊(cè)時(shí)上報(bào)和運(yùn)行時(shí)維護(hù)(NameNode中與DataNode相關(guān)的信息并不保存到NameNode的文件系統(tǒng)中,而是NameNode每次重啟后,動(dòng)態(tài)重建);
- NameNode失效則整個(gè)HDFS都會(huì)失效,因此優(yōu)先保證NameNode的可用性,HDFS針對(duì)單點(diǎn)故障提供了2種解決機(jī)制: 備份持久化元數(shù)據(jù) / 使用Secondary NameNode。
1.1.1.3 Secondary NameNode 第二名稱節(jié)點(diǎn)
SecondaryNameNode有兩個(gè)作用:一是鏡像備份,二是日志與鏡像的定期合并。兩個(gè)過程同時(shí)進(jìn)行,稱為checkpoint。
鏡像備份:定期備份fsimage文件;
Checkpoint:將日志與鏡像的定期合并操作,避免edit log過大,通過創(chuàng)建檢查點(diǎn)checkpoint來合并(合并周期與鏡像大小可以通過core-site.xml設(shè)置)。它會(huì)維護(hù)一個(gè)合并后的namespace image副本, 可用于在Namenode完全崩潰時(shí)恢復(fù)數(shù)據(jù),因此SNN并非是NN的備用節(jié)點(diǎn),并不會(huì)再NN異常時(shí)主動(dòng)切換。具體流程如下:
- SecondaryNameNode通知NameNode準(zhǔn)備提交edits文件,此時(shí)主節(jié)點(diǎn)產(chǎn)生edits.new;
- SecondaryNameNode通過http get方式獲取NameNode的fsimage與edits文件(在SecondaryNameNode的current同級(jí)目錄下可見到 temp.check-point或者previous-checkpoint目錄,這些目錄中存儲(chǔ)著從namenode拷貝來的鏡像文件);
- SecondaryNameNode開始合并獲取的上述兩個(gè)文件,產(chǎn)生一個(gè)新的fsimage文件fsimage.ckpt;
- SecondaryNameNode用http post方式發(fā)送fsimage.ckpt至NameNode;
- NameNode將fsimage.ckpt與edits.new文件分別重命名為fsimage與edits,然后更新fstime,整個(gè)checkpoint過程到此結(jié)束。 在新版本的hadoop中(hadoop0.21.0),SecondaryNameNode兩個(gè)作用被兩個(gè)節(jié)點(diǎn)替換, checkpoint node與backup node. SecondaryNameNode備份由三個(gè)參數(shù)控制fs.checkpoint.period控制周期,fs.checkpoint.size控制日志文件超過多少大小時(shí)合并, dfs.http.address表示http地址,這個(gè)參數(shù)在SecondaryNameNode為單獨(dú)節(jié)點(diǎn)時(shí)需要設(shè)置。
Secondary Namenode通常運(yùn)行在另一臺(tái)機(jī)器,因?yàn)楹喜⒉僮餍枰馁M(fèi)大量的CPU和內(nèi)存。其數(shù)據(jù)落后于Namenode,因此當(dāng)Namenode完全崩潰時(shí),會(huì)出現(xiàn)數(shù)據(jù)丟失問題。 通常做法是拷貝NFS中的備份元數(shù)據(jù)到Secondary NameNode,將其作為新的Namenode。
1.1.1.4 DataNode 數(shù)據(jù)節(jié)點(diǎn)
- 存儲(chǔ)具體的Block數(shù)據(jù);
- 負(fù)責(zé)數(shù)據(jù)的讀寫操作和復(fù)制操作;
- DataNode啟動(dòng)時(shí)會(huì)向NameNode報(bào)告當(dāng)前存儲(chǔ)的數(shù)據(jù)塊信息,后續(xù)也會(huì)定時(shí)報(bào)告修改信息;
- DataNode之間會(huì)進(jìn)行通信,復(fù)制數(shù)據(jù)塊,保證數(shù)據(jù)的冗余性;
1.1.1.5 Block Caching 塊緩存
DataNode通常直接從磁盤讀取數(shù)據(jù),但是頻繁使用的Block可以在內(nèi)存中緩存。
默認(rèn)情況下,一個(gè)Block只有一個(gè)數(shù)據(jù)節(jié)點(diǎn)會(huì)緩存。但是可以針對(duì)每個(gè)文件設(shè)置個(gè)性化配置,作業(yè)調(diào)度器可以利用緩存提升性能,例如MapReduce可以把任務(wù)運(yùn)行在有Block緩存的節(jié)點(diǎn)上,用戶或者應(yīng)用可以向NameNode發(fā)送緩存指令(緩存哪個(gè)文件,緩存多久), 緩存池的概念用于管理一組緩存的權(quán)限和資源。
1.1.1.6 HDFS Federation 聯(lián)邦
我們知道NameNode的內(nèi)存會(huì)制約文件數(shù)量,HDFS Federation提供了一種橫向擴(kuò)展NameNode的方式。在Federation模式中,每個(gè)NameNode管理命名空間的一部分,例如一個(gè)NameNode管理/user目錄下的文件, 另一個(gè)NameNode管理/share目錄下的文件。
每個(gè)NameNode管理一個(gè)namespace volumn,所有volumn構(gòu)成文件系統(tǒng)的元數(shù)據(jù)。每個(gè)NameNode同時(shí)維護(hù)一個(gè)Block Pool,保存Block的節(jié)點(diǎn)映射等信息。各NameNode之間是獨(dú)立的,一個(gè)節(jié)點(diǎn)的失敗不會(huì)導(dǎo)致其他節(jié)點(diǎn)管理的文件不可用。
客戶端使用mount table將文件路徑映射到NameNode。mount table是在Namenode群組之上封裝了一層,這一層也是一個(gè)Hadoop文件系統(tǒng)的實(shí)現(xiàn),通過viewfs:協(xié)議訪問。
1.1.1.7 Rack Awareness 機(jī)架感知
參考官網(wǎng)文章
在讀取和寫入的過程中,namenode在分配Datanode的時(shí)候,會(huì)考慮節(jié)點(diǎn)之間的距離。HDFS中距離沒有
采用帶寬來衡量,因?yàn)閷?shí)際中很難準(zhǔn)確度量?jī)膳_(tái)機(jī)器之間的帶寬。
Hadoop把機(jī)器之間的拓?fù)浣Y(jié)構(gòu)組織成樹結(jié)構(gòu),并且用到達(dá)公共父節(jié)點(diǎn)所需跳轉(zhuǎn)數(shù)之和作為距離。事實(shí)上這是一個(gè)距離矩陣的例子。下面的例子簡(jiǎn)明地說明了距離的計(jì)算:
- 同一數(shù)據(jù)中心,同一機(jī)架,同一節(jié)點(diǎn)距離為0;
- 同一數(shù)據(jù)中心,同一機(jī)架,不同節(jié)點(diǎn)距離為2;
- 同一數(shù)據(jù)中心,不同機(jī)架,不同節(jié)點(diǎn)距離為4;
- 不同數(shù)據(jù)中心,不同機(jī)架,不同節(jié)點(diǎn)距離為6。
注意:Hadoop集群的拓?fù)浣Y(jié)構(gòu)需要手動(dòng)配置,如果沒配置,Hadoop默認(rèn)所有節(jié)點(diǎn)位于同一個(gè)數(shù)據(jù)中心的同一機(jī)架上!
1.1.2 讀寫操作與可靠性
1.1.2.1 寫操作
- 客戶端將文件寫入本地磁盤的HDFS Client文件中;
- 當(dāng)臨時(shí)文件大小達(dá)到一個(gè)Block大小時(shí),HDFS Client通知NameNode申請(qǐng)寫入文件;
- NameNode在HDFS的文件系統(tǒng)中創(chuàng)建一個(gè)文件,并把該Block ID和要寫入的DataNode列表返回給HDFS Client;
- HDFS Client收到這個(gè)信息后,將文件內(nèi)容寫入第一個(gè)DataNode(一般以4Kb單位進(jìn)行傳輸,集群讀寫操作時(shí)緩沖區(qū)大小可在core-site.xml配置io.file.buffer.size);
- 當(dāng)?shù)谝粋€(gè)DataNode接收后,將數(shù)據(jù)寫入本地磁盤,同時(shí)傳輸給第二個(gè)DataNode,以此類推當(dāng)?shù)谌齻€(gè)DataNode寫入本地磁盤(默認(rèn)副本數(shù)量為3),數(shù)據(jù)在DataNode之間是通過pipeline的方式進(jìn)行復(fù)制的;
- 當(dāng)寫入操作完成后,DataNode會(huì)發(fā)現(xiàn)一個(gè)確認(rèn)給前一個(gè)DataNode,最后由第一個(gè)DataNode返回確認(rèn)寫入完成給HDFS Client;
- 當(dāng)HDFS Client接收到這個(gè)確認(rèn)寫入數(shù)據(jù)后,會(huì)向NameNode發(fā)送一個(gè)最終的確認(rèn);
- 當(dāng)某個(gè)DataNode寫入失敗時(shí),數(shù)據(jù)會(huì)繼續(xù)寫入其他的DataNode,然后NameNode會(huì)尋找另一個(gè)正常的DataNode繼續(xù)復(fù)制,以保證數(shù)據(jù)副本數(shù);
- 每個(gè)Block都會(huì)有一個(gè)校驗(yàn)碼,并存儲(chǔ)在獨(dú)立的文件中,以便讀操作時(shí)校驗(yàn)其完整性;
- 文件寫完后(HDFS Client關(guān)閉),NameNode提交文件(這時(shí)文件才可見,如果提交前,NameNode垮掉,那文件也就丟失了。fsync:只保證數(shù)據(jù)的信息寫到NameNode上,但并不保證數(shù)據(jù)已經(jīng)被寫到DataNode中)。
1.1.2.2 讀操作
- HDFS Client向NameNode發(fā)送讀請(qǐng)求;
- NameNode返回文件的所有Block和這些Block所在的DataNodes(包括復(fù)制節(jié)點(diǎn));
- 客戶端直接從DataNode中讀取數(shù)據(jù),如果該DataNode讀取失?。―ataNode失效或校驗(yàn)碼不對(duì)),則從復(fù)制節(jié)點(diǎn)中讀?。ㄈ绻x取的數(shù)據(jù)就在本機(jī),則直接讀取,否則通過網(wǎng)絡(luò)讀取)。
1.1.2.3 可靠性
- 多副本機(jī)制:DataNode中存儲(chǔ)的Block均擁有多個(gè)副本數(shù),默認(rèn)為3,支持在hdfs-site.xml中設(shè)置。
- 機(jī)架感知:通過節(jié)點(diǎn)之間發(fā)送一個(gè)數(shù)據(jù)包,來感應(yīng)它們是否在同一個(gè)機(jī)架,不同副本存放在不同機(jī)架上節(jié)點(diǎn)。
- 心跳機(jī)制:NameNode周期性從DataNode接受心跳信息和塊報(bào)告,NameNode根據(jù)塊報(bào)告驗(yàn)證元數(shù)據(jù),沒有按時(shí)發(fā)送心跳的DataNode會(huì)被標(biāo)記為宕機(jī),NameNode不會(huì)發(fā)送任何I/O請(qǐng)求到異常節(jié)點(diǎn),若是DataNode失效造成副本數(shù)不足設(shè)定值,NameNode會(huì)在合適的時(shí)機(jī)重新下發(fā)復(fù)制操作到正常的DataNode。
- 安全模式:NameNode啟動(dòng)時(shí)會(huì)先經(jīng)過一個(gè)"安全模式"階段,安全模式階段不會(huì)產(chǎn)生數(shù)據(jù)寫操作,在此階段NameNode收集各個(gè)DataNode的報(bào)告,當(dāng)數(shù)據(jù)塊達(dá)到最小副本數(shù)以上時(shí),會(huì)被認(rèn)為是"安全"的,在一定比例(支持自定義設(shè)置)的數(shù)據(jù)塊被確定為"安全" 后,在過若干時(shí)間后安全模式結(jié)束;當(dāng)檢測(cè)到副本數(shù)不足的數(shù)據(jù)塊時(shí),該數(shù)據(jù)塊會(huì)被復(fù)制,直到滿足最小副本數(shù)要求。
- 校驗(yàn)機(jī)制:在文件創(chuàng)立時(shí),每個(gè)數(shù)據(jù)塊都產(chǎn)生效驗(yàn)和,效驗(yàn)和會(huì)作為單獨(dú)一個(gè)隱藏文件保存在命名空間下,客戶端獲取數(shù)據(jù)時(shí)可以檢查效驗(yàn)和是否相同,從而發(fā)現(xiàn)數(shù)據(jù)塊是否損壞,如果正在讀取的數(shù)據(jù)塊損壞,則可以繼續(xù)讀取其他副本。
- 回收站:刪除文件時(shí),其實(shí)是放入回收站 /trash路徑,回收站里的文件支持快速恢復(fù),支持設(shè)置一個(gè)時(shí)間閾值,當(dāng)回收站里文件的存放時(shí)間超過了這個(gè)閾值,就被徹底刪除,并且釋放占用的數(shù)據(jù)塊;
- 元數(shù)據(jù)保護(hù):映像文件和事物日志是NameNode的核心數(shù)據(jù),可配置為多副本,副本會(huì)降低NameNode的處理速度,但是會(huì)增加安全性,NameNode依然是單點(diǎn),弱發(fā)生故障需要手工進(jìn)行切換。
1.1.3 NameNode元數(shù)據(jù)解析
元數(shù)據(jù)持久化為2種形式:namespcae image 鏡像文件 + edit log 日志文件,存儲(chǔ)路徑通過在core-site.xml配置文件里設(shè)置參數(shù)hadoop.tmp.dir的值。
可以看到在dfs文件下的name目錄存放edits與fsimage文件,其內(nèi)容均為二進(jìn)制,無法直接查看(由于數(shù)據(jù)量較大,因此HDFS取消了編碼效果,可以通過工具查看)
$ hdfs oev -i <edits/fsimage_file> -o <tmp_file.xml>
# 將二進(jìn)制文件輸出為xml格式文件查看,文件路徑和名稱支持自定義
1.2 YARN
1.2.1 架構(gòu)演變
Hadoop 1.x 架構(gòu)
- JobTracker: 負(fù)責(zé)資源管理,跟蹤資源消耗和可用性,作業(yè)生命周期管理(調(diào)度作業(yè)任務(wù),跟蹤進(jìn)度,為任務(wù)提供容錯(cuò));
- TaskTracker: 加載或關(guān)閉任務(wù),定時(shí)報(bào)告任務(wù)狀態(tài)。
此架構(gòu)會(huì)有以下問題:
- JobTracker是MapReduce的集中處理點(diǎn),存在單點(diǎn)故障風(fēng)險(xiǎn);
- JobTracker完成了太多的任務(wù),造成了過多的資源消耗,當(dāng)MapReduce job非常多的時(shí)候,會(huì)造成很大的內(nèi)存開銷。這也是業(yè)界普遍總結(jié)出老Hadoop的 MapReduce只能支持4000節(jié)點(diǎn)主機(jī)的上限;
- 在TaskTracker端,以Map/Reduce Task的數(shù)目作為資源的表示過于簡(jiǎn)單,沒有考慮到CPU/Mem的占用情況,如果兩個(gè)大內(nèi)存消耗的Task被調(diào)度到了一塊,很容易出現(xiàn)OOM風(fēng)險(xiǎn);
- 在TaskTracker端,把資源強(qiáng)制劃分為Map Task Slot 和Reduce Task Slot , 如果當(dāng)系統(tǒng)中只有Map Task 或者只有Reduce Task的時(shí)候,會(huì)造成資源的浪費(fèi),也就集群資源利用的問題。
Hadoop 2.x 架構(gòu)
YARN就是將JobTracker的職責(zé)進(jìn)行拆分,將資源管理和任務(wù)調(diào)度監(jiān)控拆分成獨(dú)立的進(jìn)程:一個(gè)全局的資源管理和一個(gè)每個(gè)作業(yè)的管理(ApplicationMaster)ResourceManager和NodeManager提供了計(jì)算資源的分配和管理,而ApplicationMaster則完成應(yīng)用程序的運(yùn)行。
- ResourceManager: 全局資源管理和任務(wù)調(diào)度;
- NodeManager: 單個(gè)節(jié)點(diǎn)的資源管理和監(jiān)控;
- ApplicationMaster: 單個(gè)作業(yè)的資源管理和任務(wù)監(jiān)控;
- Container: 資源申請(qǐng)的單位和任務(wù)運(yùn)行的容器。
兩種版本架構(gòu)對(duì)比
YARN架構(gòu)下形成了一個(gè)通用的資源管理平臺(tái)和一個(gè)通用的應(yīng)用計(jì)算平臺(tái),避免了舊架構(gòu)的單點(diǎn)問題和資源利用率問題,同時(shí)也讓運(yùn)行的應(yīng)用不再局限于MapReduce形式。
1.2.2 基本流程
- Job submission 提交Job:從ResourceManager中獲取一個(gè)Application ID檢查作業(yè)輸出配置,計(jì)算輸入分片copy job資源(job jar、配置文件、分片信息)到HDFS,以便后面任務(wù)的執(zhí)行;
- Job initialization 初始化job:ResourceManager將作業(yè)遞交給Scheduler(有很多調(diào)度算法,一般是根據(jù)優(yōu)先級(jí))Scheduler為作業(yè)分配一個(gè)Container,ResourceManager就加載一個(gè)Application master process并交給NodeManager;管理ApplicationMaster主要是創(chuàng)建一系列的監(jiān)控進(jìn)程來跟蹤作業(yè)的進(jìn)度,同時(shí)獲取輸入分片,為每一個(gè)分片創(chuàng)建一個(gè)Map task和相應(yīng)的reduce task,Application Master還決定如何運(yùn)行作業(yè),如果作業(yè)很?。膳渲茫?,則直接在同一個(gè)JVM下運(yùn)行;
- Task assignment 任務(wù)分配:ApplicationMaster向Resource Manager申請(qǐng)資源(一個(gè)個(gè)的Container,指定任務(wù)分配的資源要求)一般是根據(jù)data locality來分配資源;
- Task execution 任務(wù)執(zhí)行:ApplicationMaster根據(jù)ResourceManager的分配情況,在對(duì)應(yīng)的NodeManager中啟動(dòng)Container從HDFS中讀取任務(wù)所需資源(job jar,配置文件等),然后執(zhí)行該任務(wù)
- Progress and status update 進(jìn)度與狀態(tài)更新:定時(shí)將任務(wù)的進(jìn)度和狀態(tài)報(bào)告給ApplicationMaster Client定時(shí)向ApplicationMaster獲取整個(gè)任務(wù)的進(jìn)度和狀態(tài)
- Job completion 任務(wù)完成:Client定時(shí)檢查整個(gè)作業(yè)是否完成,作業(yè)完成后會(huì)自動(dòng)清空臨時(shí)文件、目錄等。
1.2.3 進(jìn)程組件
YARN將JobTracker拆分為四個(gè)組件 + 一個(gè)故障組件。
1.2.3.1 ResourceManager 資源管理
負(fù)責(zé)全局的資源管理和任務(wù)調(diào)度,把整個(gè)集群當(dāng)成計(jì)算資源池,只關(guān)注分配,不負(fù)責(zé)應(yīng)用與容錯(cuò)。
資源管理
- 以前資源是每個(gè)節(jié)點(diǎn)分成一個(gè)個(gè)的Map slot和Reduce slot,現(xiàn)在是一個(gè)個(gè)Container,每個(gè)Container可以根據(jù)需要運(yùn)行ApplicationMaster、Map、Reduce或者任意的程序;
- 以前的資源分配是靜態(tài)的,目前是動(dòng)態(tài)的,資源利用率更高;
- Container是資源申請(qǐng)的單位,一個(gè)資源申請(qǐng)格式:<resource-name, priority, resource-requirement, number-of-containers>,resource-name:主機(jī)名、機(jī)架名或*(代表任意機(jī)器), resource-requirement:目前只支持CPU和內(nèi)存;
- 用戶提交作業(yè)到ResourceManager,然后在某個(gè)NodeManager上分配一個(gè)Container來運(yùn)行ApplicationMaster,ApplicationMaster再根據(jù)自身程序需要向ResourceManager申請(qǐng)資源;
- YARN有一套Container的生命周期管理機(jī)制,而ApplicationMaster和其Container之間的管理是應(yīng)用程序自己定義的。
任務(wù)調(diào)度
- 只關(guān)注資源的使用情況,根據(jù)需求合理分配資源;
- Scheluer可以根據(jù)申請(qǐng)的需要,在特定的機(jī)器上申請(qǐng)?zhí)囟ǖ馁Y源(ApplicationMaster負(fù)責(zé)申請(qǐng)資源時(shí)的數(shù)據(jù)本地化的考慮,ResourceManager將盡量滿足其申請(qǐng)需求,在指定的機(jī)器上分配Container,從而減少數(shù)據(jù)移動(dòng))。
內(nèi)部結(jié)構(gòu)
- Client Service: 應(yīng)用提交、終止、輸出信息(應(yīng)用、隊(duì)列、集群等的狀態(tài)信息);
- Adaminstration Service: 隊(duì)列、節(jié)點(diǎn)、Client權(quán)限管理;
- ApplicationMasterService: 注冊(cè)、終止ApplicationMaster, 獲取ApplicationMaster的資源申請(qǐng)或取消的請(qǐng)求,并將其異步地傳給Scheduler, 單線程處理;
- ApplicationMaster Liveliness Monitor: 接收ApplicationMaster的心跳消息,如果某個(gè)ApplicationMaster在一定時(shí)間內(nèi)沒有發(fā)送心跳,則被任務(wù)失效,其資源將會(huì)被回收,然后ResourceManager會(huì)重新分配一個(gè)ApplicationMaster運(yùn)行該應(yīng)用(默認(rèn)嘗試2次);
- Resource Tracker Service: 注冊(cè)節(jié)點(diǎn), 接收各注冊(cè)節(jié)點(diǎn)的心跳消息;
- NodeManagers Liveliness Monitor: 監(jiān)控每個(gè)節(jié)點(diǎn)的心跳消息,如果長(zhǎng)時(shí)間沒有收到心跳消息,則認(rèn)為該節(jié)點(diǎn)無效, 同時(shí)所有在該節(jié)點(diǎn)上的Container都標(biāo)記成無效,也不會(huì)調(diào)度任務(wù)到該節(jié)點(diǎn)運(yùn)行;
- ApplicationManager: 管理應(yīng)用程序,記錄和管理已完成的應(yīng)用;
- ApplicationMaster Launcher: 一個(gè)應(yīng)用提交后,負(fù)責(zé)與NodeManager交互,分配Container并加載ApplicationMaster,也負(fù)責(zé)終止或銷毀;
- YarnScheduler: 資源調(diào)度分配, 有FIFO(with Priority),F(xiàn)air,Capacity方式;
- ContainerAllocationExpirer: 管理已分配但沒有啟用的Container,超過一定時(shí)間則將其回收。
1.2.3.2 NodeManager 節(jié)點(diǎn)管理
Node節(jié)點(diǎn)下的Container管理。
- 啟動(dòng)時(shí)向ResourceManager注冊(cè)并定時(shí)發(fā)送心跳消息,等待ResourceManager的指令;
- 監(jiān)控Container的運(yùn)行,維護(hù)Container的生命周期,監(jiān)控Container的資源使用情況;
- 啟動(dòng)或停止Container,管理任務(wù)運(yùn)行時(shí)的依賴包(根據(jù)ApplicationMaster的需要,啟動(dòng)Container之前將需要的程序及其依賴包、配置文件等拷貝到本地)
內(nèi)部結(jié)構(gòu)
-
NodeStatusUpdater: 啟動(dòng)向ResourceManager注冊(cè),報(bào)告該節(jié)點(diǎn)的可用資源情況,通信的端口和后續(xù)狀態(tài)的維護(hù);
-
ContainerManager: 接收RPC請(qǐng)求(啟動(dòng)、停止),資源本地化(下載應(yīng)用需要的資源到本地,根據(jù)需要共享這些資源)
PUBLIC: /filecache
PRIVATE: /usercache//filecache
APPLICATION: /usercache//appcache//(在程序完成后會(huì)被刪除)
-
ContainersLauncher: 加載或終止Container;
-
ContainerMonitor: 監(jiān)控Container的運(yùn)行和資源使用情況;
-
ContainerExecutor: 和底層操作系統(tǒng)交互,加載要運(yùn)行的程序。
1.2.3.3 ApplicationMaster 應(yīng)用管理
單個(gè)作業(yè)的資源管理和任務(wù)監(jiān)控。
功能描述
- 計(jì)算應(yīng)用的資源需求,資源可以是靜態(tài)或動(dòng)態(tài)計(jì)算的,靜態(tài)的一般是Client申請(qǐng)時(shí)就指定了,動(dòng)態(tài)則需要ApplicationMaster根據(jù)應(yīng)用的運(yùn)行狀態(tài)來決定;
- 根據(jù)數(shù)據(jù)來申請(qǐng)對(duì)應(yīng)位置的資源(Data Locality);
- 向ResourceManager申請(qǐng)資源,與NodeManager交互進(jìn)行程序的運(yùn)行和監(jiān)控,監(jiān)控申請(qǐng)的資源的使用情況,監(jiān)控作業(yè)進(jìn)度;
- 跟蹤任務(wù)狀態(tài)和進(jìn)度,定時(shí)向ResourceManager發(fā)送心跳消息,報(bào)告資源的使用情況和應(yīng)用的進(jìn)度信息;
- 負(fù)責(zé)本作業(yè)內(nèi)的任務(wù)的容錯(cuò)。
ApplicationMaster可以是用任何語(yǔ)言編寫的程序,它和ResourceManager和NodeManager之間是通過ProtocolBuf交互,以前是一個(gè)全局的JobTracker負(fù)責(zé)的,現(xiàn)在每個(gè)作業(yè)都一個(gè),可伸縮性更強(qiáng),至少不會(huì)因?yàn)樽鳂I(yè)太多,造成JobTracker瓶頸。同時(shí)將作業(yè)的邏輯放到一個(gè)獨(dú)立的ApplicationMaster中,使得靈活性更加高,每個(gè)作業(yè)都可以有自己的處理方式,不用綁定到MapReduce的處理模式上。
一般的MapReduce是根據(jù)Block數(shù)量來定Map和Reduce的計(jì)算數(shù)量,然后一般的Map或Reduce就占用一個(gè)Container;數(shù)據(jù)本地化是通過HDFS的Block分片信息獲取的。
1.2.3.4 Container 容器
- 基本的資源單位(CPU、內(nèi)存等);
- Container可以加載任意程序,而且不限于Java;
- 一個(gè)Node可以包含多個(gè)Container,也可以是一個(gè)大的Container;
- ApplicationMaster可以根據(jù)需要,動(dòng)態(tài)申請(qǐng)和釋放Container。
1.2.3.5 Failover 故障處理
Job任務(wù)失敗
-
運(yùn)行時(shí)異?;蛘逬VM退出都會(huì)報(bào)告給ApplicationMaster;
-
通過心跳來檢查掛住的任務(wù)(timeout),會(huì)檢查多次(可配置)才判斷該任務(wù)是否失效;
-
一個(gè)作業(yè)的任務(wù)失敗率超過配置,則認(rèn)為該作業(yè)失?。?/p>
-
失敗的任務(wù)或作業(yè)都會(huì)有ApplicationMaster重新運(yùn)行。
ApplicationMaster失敗
- ApplicationMaster定時(shí)發(fā)送心跳信號(hào)到ResourceManager,通常一旦ApplicationMaster失敗,則認(rèn)為失敗,但也可以通過配置多次后才失?。?/li>
- 一旦ApplicationMaster失敗,ResourceManager會(huì)啟動(dòng)一個(gè)新的ApplicationMaster;
- 新的ApplicationMaster負(fù)責(zé)恢復(fù)之前錯(cuò)誤的ApplicationMaster的狀態(tài)(yarn.app.mapreduce.am.job.recovery.enable=true),這一步是通過將應(yīng)用運(yùn)行狀態(tài)保存到共享的存儲(chǔ)上來實(shí)現(xiàn)的,ResourceManager不會(huì)負(fù)責(zé)任務(wù)狀態(tài)的保存和恢復(fù);
- Client也會(huì)定時(shí)向ApplicationMaster查詢進(jìn)度和狀態(tài),一旦發(fā)現(xiàn)其失敗,則向ResouceManager詢問新的ApplicationMaster。
NodeManager失敗
- NodeManager定時(shí)發(fā)送心跳到ResourceManager,如果超過一段時(shí)間沒有收到心跳消息,ResourceManager就會(huì)將其移除;
- 任何運(yùn)行在該NodeManager上的任務(wù)和ApplicationMaster都會(huì)在其他NodeManager上進(jìn)行恢復(fù);
- 如果某個(gè)NodeManager失敗的次數(shù)太多,ApplicationMaster會(huì)將其加入黑名單(ResourceManager沒有),任務(wù)調(diào)度時(shí)不在其上運(yùn)行任務(wù)。
ResourceManager失敗
- 通過checkpoint機(jī)制,定時(shí)將其狀態(tài)保存到磁盤,然后失敗的時(shí)候,重新運(yùn)行;
- 通過zookeeper同步狀態(tài)和實(shí)現(xiàn)透明的HA。
1.3 MapReduce
MapReduce的思想就是“分而治之”,Map負(fù)責(zé) 分,Reduce負(fù)責(zé) 治。
一種分布式的計(jì)算方式指定一個(gè)Map函數(shù),用來把一組鍵值對(duì)映射成一組新的鍵值對(duì),指定并發(fā)的Reduce(歸約)函數(shù),用來保證所有映射的鍵值對(duì)中的每一個(gè)共享相同的鍵組。
map: (K1, V1) → list(K2, V2) combine: (K2, list(V2)) → list(K2, V2) reduce: (K2, list(V2)) → list(K3, V3)
MapReduce主要是先讀取文件數(shù)據(jù),然后進(jìn)行Map處理,接著Reduce處理,最后把處理結(jié)果寫到文件中,因此Map輸出格式和Reduce輸入格式一定是相同的。
1.3.1 Map
Mapper負(fù)責(zé)“分”,即把復(fù)雜的任務(wù)分解為若干個(gè)“簡(jiǎn)單的任務(wù)”來處理?!昂?jiǎn)單的任務(wù)”包含三層含義:
- 數(shù)據(jù)或計(jì)算的規(guī)模相對(duì)原任務(wù)要大大縮小;
- 就近計(jì)算,即任務(wù)會(huì)分配到存放著所需數(shù)據(jù)的節(jié)點(diǎn)上進(jìn)行計(jì)算;
- 并行計(jì)算,彼此間幾乎沒有依賴關(guān)系。
1.3.2 Reduce
Reducer負(fù)責(zé)對(duì)map階段的結(jié)果進(jìn)行匯總。至于需要多少個(gè)Reducer,用戶可以根據(jù)具體問題,通過在mapred-site.xml配置文件里設(shè)置參數(shù)mapred.reduce.tasks的值,默認(rèn)為1。
1.3.3 讀取數(shù)據(jù)
通過InputFormat決定讀取的數(shù)據(jù)的類型,然后拆分成一個(gè)個(gè)InputSplit,每個(gè)InputSplit對(duì)應(yīng)一個(gè)Map處理,RecordReader讀取InputSplit的內(nèi)容給Map。
1.3.3.1 InputFormat 輸入格式化
決定讀取數(shù)據(jù)的格式,可以是文件或數(shù)據(jù)庫(kù)等。
- 驗(yàn)證作業(yè)輸入的正確性,如格式等;
- 將輸入文件切割成邏輯分片(InputSplit),一個(gè)InputSplit將會(huì)被分配給一個(gè)獨(dú)立的Map任務(wù);
- 提供RecordReader實(shí)現(xiàn),讀取InputSplit中的"K-V對(duì)"供Mapper使用。
1.3.3.2 InputSplit 輸入分割
代表一個(gè)個(gè)邏輯分片,并沒有真正存儲(chǔ)數(shù)據(jù),只是提供了一個(gè)如何將數(shù)據(jù)分片的方法,Split內(nèi)有Location信息,利于數(shù)據(jù)局部化,一個(gè)InputSplit給一個(gè)單獨(dú)的Map處理。
1.3.3.3 RecordReader 記錄讀者
將InputSplit拆分成一個(gè)個(gè)<key,value>對(duì)給Map處理,也是實(shí)際的文件讀取分隔對(duì)象</key,value>。
1.3.3.4 Mapper 映射器
主要是讀取InputSplit的每一個(gè)Key,Value對(duì)并進(jìn)行處理
1.3.3.5 Shuffle 清洗器
對(duì)Map的結(jié)果進(jìn)行排序并傳輸?shù)絉educe進(jìn)行處理 Map的結(jié)果并不是直接存放到硬盤,而是利用緩存做一些預(yù)排序處理 Map會(huì)調(diào)用Combiner,壓縮,按key進(jìn)行分區(qū)、排序等,盡量減少結(jié)果的大小 每個(gè)Map完成后都會(huì)通知Task,然后Reduce就可以進(jìn)行處理。
2、配置文件常用參數(shù)
[root@master hadoop]# ll
total 116
drwxr-xr-x 2 1024 1024 4096 Jul 29 2022 bin
drwxr-xr-x 3 1024 1024 4096 Jul 29 2022 etc
drwxr-xr-x 2 1024 1024 4096 Jul 29 2022 include
drwxr-xr-x 3 1024 1024 4096 Jul 29 2022 lib
drwxr-xr-x 4 1024 1024 4096 Jul 29 2022 libexec
-rw-rw-r-- 1 1024 1024 24707 Jul 29 2022 LICENSE-binary
drwxr-xr-x 2 1024 1024 4096 Jul 29 2022 licenses-binary
-rw-rw-r-- 1 1024 1024 15217 Jul 17 2022 LICENSE.txt
-rw-rw-r-- 1 1024 1024 29473 Jul 17 2022 NOTICE-binary
-rw-rw-r-- 1 1024 1024 1541 Apr 22 2022 NOTICE.txt
-rw-rw-r-- 1 1024 1024 175 Apr 22 2022 README.txt
drwxr-xr-x 3 1024 1024 4096 Jul 29 2022 sbin
drwxr-xr-x 4 1024 1024 4096 Jul 29 2022 share
[root@master hadoop]# ll etc/hadoop/
total 180
-rw-r--r-- 1 1024 1024 9213 Jul 29 2022 capacity-scheduler.xml
-rw-r--r-- 1 1024 1024 1335 Jul 29 2022 configuration.xsl
-rw-r--r-- 1 1024 1024 2567 Jul 29 2022 container-executor.cfg
-rw-r--r-- 1 1024 1024 970 Jul 11 14:08 core-site.xml # 核心站點(diǎn)配置
-rw-r--r-- 1 1024 1024 3999 Jul 29 2022 hadoop-env.cmd
-rw-r--r-- 1 1024 1024 16721 Jul 11 14:15 hadoop-env.sh # Hadoop環(huán)境變量
-rw-r--r-- 1 1024 1024 3321 Jul 29 2022 hadoop-metrics2.properties
-rw-r--r-- 1 1024 1024 11765 Jul 29 2022 hadoop-policy.xml
-rw-r--r-- 1 1024 1024 3414 Jul 29 2022 hadoop-user-functions.sh.example
-rw-r--r-- 1 1024 1024 683 Jul 29 2022 hdfs-rbf-site.xml
-rw-r--r-- 1 1024 1024 1040 Jul 11 14:02 hdfs-site.xml # HDFS配置
-rw-r--r-- 1 1024 1024 1484 Jul 29 2022 httpfs-env.sh
-rw-r--r-- 1 1024 1024 1657 Jul 29 2022 httpfs-log4j.properties
-rw-r--r-- 1 1024 1024 620 Jul 29 2022 httpfs-site.xml
-rw-r--r-- 1 1024 1024 3518 Jul 29 2022 kms-acls.xml
-rw-r--r-- 1 1024 1024 1351 Jul 29 2022 kms-env.sh
-rw-r--r-- 1 1024 1024 1860 Jul 29 2022 kms-log4j.properties
-rw-r--r-- 1 1024 1024 682 Jul 29 2022 kms-site.xml
-rw-r--r-- 1 1024 1024 13700 Jul 29 2022 log4j.properties
-rw-r--r-- 1 1024 1024 951 Jul 29 2022 mapred-env.cmd
-rw-r--r-- 1 1024 1024 1764 Jul 29 2022 mapred-env.sh # MapReduce環(huán)境變量
-rw-r--r-- 1 1024 1024 4113 Jul 29 2022 mapred-queues.xml.template
-rw-r--r-- 1 1024 1024 758 Jul 29 2022 mapred-site.xml # MapReduce配置
drwxr-xr-x 2 1024 1024 4096 Jul 29 2022 shellprofile.d
-rw-r--r-- 1 1024 1024 2316 Jul 29 2022 ssl-client.xml.example
-rw-r--r-- 1 1024 1024 2697 Jul 29 2022 ssl-server.xml.example
-rw-r--r-- 1 1024 1024 2681 Jul 29 2022 user_ec_policies.xml.template
-rw-r--r-- 1 1024 1024 10 Jul 29 2022 workers
-rw-r--r-- 1 1024 1024 2250 Jul 29 2022 yarn-env.cmd
-rw-r--r-- 1 1024 1024 6329 Jul 29 2022 yarn-env.sh # YARN環(huán)境變量
-rw-r--r-- 1 1024 1024 2591 Jul 29 2022 yarnservice-log4j.properties
-rw-r--r-- 1 1024 1024 690 Jul 29 2022 yarn-site.xml # YARN配置
2.1 core-site.xml
- hadoop.tmp.dir:數(shù)據(jù)臨時(shí)存放目錄,默認(rèn)/tmp/hadoop-${user.name};
- fs.defaultFS:定義HDFS文件系統(tǒng)的主機(jī)信息與端口號(hào),hdfs://[ip|hostname]:port,hadoop1.x默認(rèn)端口9000,hadoop2.x默認(rèn)端口8020;
- io.file.buffer.size:集群讀寫操作時(shí)緩沖區(qū)大小,默認(rèn)4K;
2.2 hdfs-site.xml
- dfs.namenode.name.dir:DFS 名稱節(jié)點(diǎn)在文件系統(tǒng)內(nèi)存儲(chǔ)名稱表 fsimage 的路徑,多個(gè)目錄使用逗號(hào)間隔,名稱表會(huì)復(fù)制存儲(chǔ)到所有目錄中,默認(rèn)為file://${hadoop.tmp.dir}/dfs/name;
- dfs.datanode.data.dir:DFS 數(shù)據(jù)節(jié)點(diǎn)在文件系統(tǒng)內(nèi)存儲(chǔ)數(shù)據(jù)的路徑,多個(gè)目錄使用逗號(hào)間隔,數(shù)據(jù)將存儲(chǔ)在所有目錄中,通常存儲(chǔ)在不同設(shè)備上,默認(rèn)為file://${hadoop.tmp.dir}/dfs/data;
- dfs.replication:DFS 數(shù)據(jù)庫(kù)的副本數(shù)量,默認(rèn)為3;
- dfs.blocksize:文件系統(tǒng)中塊大小,以字節(jié)為單位,可以使用k/m/g/t/p/e指定大小,默認(rèn)為128M;
- dfs.namenode.http-address:WebHDFS UI監(jiān)聽地址與端口,默認(rèn)為0.0.0.0:50070;
- dfs.webhdfs.enabled:是否啟用WebHDFS UI,默認(rèn)為false,開啟為true;
- fs.checkpoint.period:多長(zhǎng)時(shí)間記錄一次hdfs的鏡像,默認(rèn)1小時(shí);
- fs.checkpoint.size:一次記錄多大的size的鏡像,默認(rèn)64M。
2.3 mapred-site.xml
若是在etc/hadoop/目錄下沒有mapred-site.xml文件,倒是有一個(gè)mapred-site.xml.template樣板,可以復(fù)制一份進(jìn)行修改配置。
- mapreduce.framework.name:指定執(zhí)行MapReduce作業(yè)的運(yùn)行時(shí)框架,屬性值可以是local,classic或yarn;
- mapreduce.jobhistory.address:指定查看運(yùn)行完mapreduce程序的服務(wù)器的IP協(xié)議的主機(jī)名和端口號(hào),默爾為0.0.0.0:10020;
- mapreduce.jobhistory.webapp.address:指定使用WebUI查看mapreduce程序的主機(jī)名和端口號(hào),默認(rèn)為0.0.0.0:19888;
2.4 yarn-site.xml
- yarn.nodemanager.aux-services:指定在進(jìn)行mapreduce作業(yè)時(shí),yarn使用mapreduce_shuffle混洗技術(shù);
- yarn.nodemanager.aux-services.mapreduce_shuffle.class:指定混洗技術(shù)對(duì)應(yīng)的字節(jié)碼文件,value = org.apache.hadoop.mapred.ShuffleHandler;
- yarn.resourcemanager.hostname:指定resourcemanager的主機(jī)名,默認(rèn)為0.0.0.0;
- yarn.resourcemanager.address:指定在RM中的應(yīng)用程序管理器接口的地址,默認(rèn)為${yarn.resourcemanager.hostname}:8032;
- yarn.resourcemanager.scheduler.address:指定RM調(diào)度程序接口的地址,默認(rèn)為${yarn.resourcemanager.hostname}:8030;
- yarn.resourcemanager.resource-tracker.address:指定RM下的resource-tracker的地址,默認(rèn)為${yarn.resourcemanager.hostname}:8031;
- yarn.resourcemanager.admin.address:指定RM管理界面的地址,默認(rèn)為${yarn.resourcemanager.hostname}:8033;
- yarn.resourcemanager.webapp.address:指定RM的web訪問的地址,默認(rèn)為${yarn.resourcemanager.hostname}:8088;
3、環(huán)境安裝
3.1 安裝包下載
官網(wǎng)安裝包下載鏈接:https://hadoop.apache.org/releases.html
,下載二進(jìn)制文件即可。
3.2 單機(jī)部署
Hadoop單機(jī)部署的情況下沒有太大必要部署YARN服務(wù),只是單純部署HDFS作為測(cè)試環(huán)境完成實(shí)驗(yàn)即可。
[root@master tar]# tar -xf hadoop-3.3.4.tar.gz -C /middleware/
[root@master tar]# cd /middleware/
[root@master middleware]# ln -s hadoop-3.3.4/ hadoop
[root@master middleware]# cd hadoop
[root@master hadoop]# ll
total 116
drwxr-xr-x 2 1024 1024 4096 Jul 29 2022 bin
drwxr-xr-x 3 1024 1024 4096 Jul 29 2022 etc
drwxr-xr-x 2 1024 1024 4096 Jul 29 2022 include
drwxr-xr-x 3 1024 1024 4096 Jul 29 2022 lib
drwxr-xr-x 4 1024 1024 4096 Jul 29 2022 libexec
-rw-rw-r-- 1 1024 1024 24707 Jul 29 2022 LICENSE-binary
drwxr-xr-x 2 1024 1024 4096 Jul 29 2022 licenses-binary
-rw-rw-r-- 1 1024 1024 15217 Jul 17 2022 LICENSE.txt
-rw-rw-r-- 1 1024 1024 29473 Jul 17 2022 NOTICE-binary
-rw-rw-r-- 1 1024 1024 1541 Apr 22 2022 NOTICE.txt
-rw-rw-r-- 1 1024 1024 175 Apr 22 2022 README.txt
drwxr-xr-x 3 1024 1024 4096 Jul 29 2022 sbin
drwxr-xr-x 4 1024 1024 4096 Jul 29 2022 share
[root@master hadoop]# vim etc/hadoop/hadoop-env.sh
export JAVA_HOME=/middleware/jdk
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
[root@master hadoop]# source etc/hadoop/hadoop-env.sh
[root@master hadoop]# ./bin/hadoop version
Hadoop 3.3.4
Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb
Compiled by stevel on 2022-07-29T12:32Z
Compiled with protoc 3.7.1
From source with checksum fb9dd8918a7b8a5b430d61af858f6ec
This command was run using /middleware/hadoop-3.3.4/share/hadoop/common/hadoop-common-3.3.4.jar
[root@master hadoop]# vim etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/middleware/hadoop/</value>
</property>
</configuration>
[root@master hadoop]# vim etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>0.0.0.0:50070</value>
</property>
</configuration>
[root@master hadoop]# bin/hdfs namenode -format
~
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/9.134.244.180
************************************************************/
[root@master hadoop]# tree dfs/
dfs/
└── name
└── current
├── fsimage_0000000000000000000
├── fsimage_0000000000000000000.md5
├── seen_txid
└── VERSION
2 directories, 4 files
[root@master hadoop]# ./sbin/start-dfs.sh
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Starting namenodes on [localhost]
Last login: Tue Jul 11 13:55:17 CST 2023 from 10.95.19.138 on pts/0
localhost: ssh: connect to host localhost port 22: Connection refused
Starting datanodes
Last login: Tue Jul 11 14:10:44 CST 2023 on pts/0
localhost: ssh: connect to host localhost port 22: Connection refused
Starting secondary namenodes [master]
Last login: Tue Jul 11 14:10:44 CST 2023 on pts/0
master: ssh: connect to host master port 22: Connection refused
[root@master hadoop]# vim etc/hadoop/hadoop-env.sh
export HADOOP_SSH_OPTS="-p 36000"
[root@master hadoop]# ./sbin/start-dfs.sh
3.3 集群部署(推薦)
環(huán)境準(zhǔn)備:JDK安裝與升級(jí) + 集群免密登錄。
# 制作密鑰文件(持續(xù)回車保持默認(rèn)配置)
[root@master hadoop]# ssh-keygen -t rsa -b 4096 # t為加密算法類型,b為秘鑰長(zhǎng)度
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): # 秘鑰文件存儲(chǔ)位置
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FbNOpySF2pNAo2vR9L53bm91fSgJf/MYnHBwTenf35o root@localhost.localhost
The key's randomart image is:
+---[RSA 4096]----+
| .+ .+ oo|
| +.o.. +. ...|
| o .+o.= .o. |
| o..+*.o. .. |
| o S.oo = o+|
| . . + B B|
| . . .o *=|
| . o. o.+|
| ..oE. |
+----[SHA256]-----+
# 集群節(jié)點(diǎn)互相發(fā)放密鑰文件,首次發(fā)放需要進(jìn)行登錄密碼驗(yàn)證,三臺(tái)機(jī)器共計(jì)發(fā)放秘鑰文件六次(本機(jī)不需要發(fā)送到本機(jī))
[root@master hadoop]# ssh-copy-id master
[root@master hadoop]# ssh-copy-id node1
[root@master hadoop]# ssh-copy-id node2
# 配置hosts,將IP替換為當(dāng)前環(huán)境下地址即可
[root@master hadoop]# vim /etc/hosts
# [hadoop_cluster]
$ip1 master
$ip2 node1
$ip3 node2
3.3.1 HDFS
3.3.1.1 部署
# 解壓過程省略
[root@master hadoop]# vim etc/hadoop/hadoop-env.sh
export JAVA_HOME=/middleware/jdk
export HADOOP_SSH_OPTS="-p 36000"
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
[root@master hadoop]# vim etc/hadoop/core-site.xml
<configuration>
<!--指定HDFS的數(shù)量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--secondary namenode 所在主機(jī)的IP和端口-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node1:50090</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
[root@master hadoop]# vim etc/hadoop/hdfs-site.xml
<configuration>
<!--指定HDFS的數(shù)量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--secondary namenode 所在主機(jī)的IP和端口-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node1:50090</value>
</property>
</configuration>
[root@master hadoop]# vim etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
[root@master hadoop]# vim etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8034</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
[root@master hadoop]# vim workers
master
node1
node2
# 格式化HDFS
[root@master hadoop]# ./bin/hdfs namenode -format
~
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/9.134.244.180
************************************************************/
# 啟動(dòng)服務(wù)
[root@master hadoop]# ./sbin/start-dfs.sh
Starting namenodes on [master]
Last login: Fri Sep 8 12:30:14 CST 2023 from 10.91.28.109 on pts/2
Starting datanodes
Last login: Fri Sep 8 15:24:19 CST 2023 on pts/1
node2: WARNING: /middleware/hadoop-3.3.4/logs does not exist. Creating.
node1: WARNING: /middleware/hadoop-3.3.4/logs does not exist. Creating.
Starting secondary namenodes [node1]
Last login: Fri Sep 8 15:24:21 CST 2023 on pts/1
# 進(jìn)程驗(yàn)證
[root@master hadoop]# jps
806826 Jps
801889 DataNode
801667 NameNode
[root@node1 middleware]# jps
1109584 Jps
1095393 DataNode
1095563 SecondaryNameNode
[root@node2 /middleware]# jps
29733 Jps
12063 DataNode
3.3.1.2 驗(yàn)證
HDFS Web端驗(yàn)證:http://9.134.244.180:50090,端口配置參考本文2.1章節(jié)core-site.xml中dfs.namenode.http-address參數(shù)詳解。
HDFS參數(shù)詳解:
-ls # 查看目錄
-mkdir # 創(chuàng)建目錄
-rmdir # 刪除空目錄
-rm # 刪除文件或文件夾
-r # 強(qiáng)制刪除非空目錄
-moveFromLocal # 從本地剪切到HDFS
-copyFromLocal # 從本地復(fù)制到HDFS
-copyToLocal # 從HDFS復(fù)制到本地
-appendToFile # 追加文件到末尾
-cat # 查看文件內(nèi)容
-cp # 在HDFS上復(fù)制文件
-mv # 在HDFS上移動(dòng)文件
-get # = copyToLocal
-put # = copyFromLocal
-getmerge # 合并下載多個(gè)文件
-tail # 從末尾查看
-chgrp/-chmod/-chwon # 修改文件所屬權(quán)限
-du # 統(tǒng)計(jì)文件夾的大小
-setrep # 設(shè)置HDFS中文件副本數(shù)(取決于DN數(shù)量)
# 上傳或下載測(cè)試
[root@master hadoop]# echo "this is test!" > ./aaa.txt
[root@master hadoop]# ./bin/hdfs dfs -put ./aaa.txt /
[root@master hadoop]# ./bin/hdfs dfs -ls /
Found 1 items
-rw-r--r-- 3 root supergroup 14 2023-09-11 14:29 /aaa.txt
3.3.1.3 數(shù)據(jù)存儲(chǔ)
HDFS的數(shù)據(jù)存儲(chǔ)路徑為core-site.xml內(nèi)dfs.datanode.data.dir參數(shù)的值。
[root@master hadoop]# tree dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
├── blk_1073741825
├── blk_1073741825_1001.meta
0 directories, 2 files
[root@master hadoop]# cd dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
[root@master subdir0]# cat blk_1073741825
this is test!
[root@node1 hadoop]# cd dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
[root@node1 subdir0]# cat blk_1073741825
this is test!
[root@node2 hadoop]# cd dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
[root@node2 subdir0]# cat blk_1073741825
this is test!
# 三臺(tái)機(jī)器的存儲(chǔ)數(shù)據(jù)完全一致,原因:core-site.xml內(nèi)dfs.replication的副本數(shù)量默認(rèn)值為3
3.3.2 YARN
3.3.2.1 部署
# 配置MapReduce、YARN并分發(fā)到node1與node2
[root@master hadoop]# vimetc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
[root@master hadoop]# vim etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.nodemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
</configuration>
[root@master hadoop]# ./sbin/start-yarn.sh
Starting resourcemanager
Last login: Mon Sep 11 14:35:42 CST 2023 on pts/2
Starting nodemanagers
Last login: Mon Sep 11 15:19:31 CST 2023 on pts/1
# 進(jìn)程驗(yàn)證
[root@master hadoop]# jps
809885 Jps
809508 NodeManager
809302 ResourceManager
801889 DataNode
801667 NameNode
[root@node1 hadoop]# jps
1095393 DataNode
1117415 Jps
1095563 SecondaryNameNode
1116957 NodeManager
[root@node2 /middleware]# jps
6407 NodeManager
6909 Jps
12063 DataNode
3.3.2.2 驗(yàn)證
YARN Web端驗(yàn)證:http://9.134.244.180:8088,端口配置參考本文2.4章節(jié)yarn-site.xml中yarn.resourcemanager.webapp.address參數(shù)詳解。
# 創(chuàng)建測(cè)試環(huán)境,上傳一個(gè)文本文檔到HDFS中
[root@master hadoop]# ./bin/hdfs dfs -mkdir -p /input
[root@master hadoop]# vim word.txt
I’m LiHua , a Chinese student taking summer course in your university . I’m writing to ask for help . I came here last month and found my courses interesting .But I have some difficulty with note-taking and I have no idea of how to use the library . I was told the learning center provides help for students and I’m anxious to get help from you. I have no class on Tuesdays mornings and Friday afternoons . Please let me know which day is ok with you. You may email or phone me . Here are my email address and phone number :lihua@1236.com ; 1234567.
[root@master hadoop]# ./bin/hdfs dfs -put ./word.txt /input
# 使用YARN進(jìn)行文件單詞統(tǒng)計(jì)操作,輸入文件(存儲(chǔ)在HDFS服務(wù)):/input/word.txt,輸出文件:/output/count.txt
[root@master hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input/word.txt /output/count.txt
2023-09-11 15:52:39,678 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at master/9.134.244.180:8032
2023-09-11 15:52:39,932 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1694418178447_0001
2023-09-11 15:52:42,335 INFO input.FileInputFormat: Total input files to process : 1
2023-09-11 15:52:42,762 INFO mapreduce.JobSubmitter: number of splits:1
2023-09-11 15:52:45,028 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1694418178447_0001
2023-09-11 15:52:45,029 INFO mapreduce.JobSubmitter: Executing with tokens: []
2023-09-11 15:52:45,141 INFO conf.Configuration: resource-types.xml not found
2023-09-11 15:52:45,141 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2023-09-11 15:52:45,326 INFO impl.YarnClientImpl: Submitted application application_1694418178447_0001
2023-09-11 15:52:45,359 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1694418178447_0001/
2023-09-11 15:52:45,360 INFO mapreduce.Job: Running job: job_1694418178447_0001
2023-09-11 15:52:50,413 INFO mapreduce.Job: Job job_1694418178447_0001 running in uber mode : false
2023-09-11 15:52:50,414 INFO mapreduce.Job: map 0% reduce 0%
2023-09-11 15:52:50,426 INFO mapreduce.Job: Job job_1694418178447_0001 failed with state FAILED due to: Application application_1694418178447_0001 failed 2 times due to AM Container for appattempt_1694418178447_0001_000002 exited with exitCode: 1
Failing this attempt.Diagnostics: [2023-09-11 15:52:49.413]Exception from container-launch.
Container id: container_1694418178447_0001_02_000001
Exit code: 1
[2023-09-11 15:52:49.446]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
Please check whether your <HADOOP_HOME>/etc/hadoop/mapred-site.xml contains the below configuration:
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
[2023-09-11 15:52:49.447]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
Please check whether your <HADOOP_HOME>/etc/hadoop/mapred-site.xml contains the below configuration:
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
For more detailed output, check the application tracking page: http://master:8088/cluster/app/application_1694418178447_0001 Then click on links to logs of each attempt.
. Failing the application.
2023-09-11 15:52:50,440 INFO mapreduce.Job: Counters: 0
# 失敗原因:mapreduce配置缺失
[root@master hadoop]# ./bin/hadoop classpath # 將下面輸出的':'修改為','
/middleware/hadoop-3.3.4/etc/hadoop:/middleware/hadoop-3.3.4/share/hadoop/common/lib/*:/middleware/hadoop-3.3.4/share/hadoop/common/*:/middleware/hadoop-3.3.4/share/hadoop/hdfs:/middleware/hadoop-3.3.4/share/hadoop/hdfs/lib/*:/middleware/hadoop-3.3.4/share/hadoop/hdfs/*:/middleware/hadoop-3.3.4/share/hadoop/mapreduce/*:/middleware/hadoop-3.3.4/share/hadoop/yarn:/middleware/hadoop-3.3.4/share/hadoop/yarn/lib/*:/middleware/hadoop-3.3.4/share/hadoop/yarn/*
# 追加配置到MapReduce,并且分發(fā)到node1與node2
[root@master hadoop]# vim etc/hadoop/mapred-site.xml
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>/middleware/hadoop-3.3.4/etc/hadoop,
/middleware/hadoop-3.3.4/share/hadoop/common/lib/*,
/middleware/hadoop-3.3.4/share/hadoop/common/*,
/middleware/hadoop-3.3.4/share/hadoop/hdfs,
/middleware/hadoop-3.3.4/share/hadoop/hdfs/lib/*,
/middleware/hadoop-3.3.4/share/hadoop/hdfs/*,
/middleware/hadoop-3.3.4/share/hadoop/mapreduce/*,
/middleware/hadoop-3.3.4/share/hadoop/yarn,
/middleware/hadoop-3.3.4/share/hadoop/yarn/lib/*,
/middleware/hadoop-3.3.4/share/hadoop/yarn/*</value>
</property>
# 服務(wù)重啟
[root@master hadoop]# ./sbin/stop-yarn.sh && ./sbin/start-yarn.sh
Stopping nodemanagers
Last login: Mon Sep 11 15:42:57 CST 2023 on pts/1
master: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
node1: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
Stopping resourcemanager
Last login: Mon Sep 11 16:04:48 CST 2023 on pts/1
Starting resourcemanager
Last login: Mon Sep 11 16:04:56 CST 2023 on pts/1
Starting nodemanagers
Last login: Mon Sep 11 16:04:58 CST 2023 on pts/1
# 重新執(zhí)行
[root@master hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input/word.txt /output/count.txt
2023-09-11 16:06:15,116 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at master/9.134.244.180:8032
2023-09-11 16:06:15,361 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1694419501011_0001
2023-09-11 16:06:15,826 INFO input.FileInputFormat: Total input files to process : 1
2023-09-11 16:06:16,259 INFO mapreduce.JobSubmitter: number of splits:1
2023-09-11 16:06:16,591 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1694419501011_0001
2023-09-11 16:06:16,591 INFO mapreduce.JobSubmitter: Executing with tokens: []
2023-09-11 16:06:16,706 INFO conf.Configuration: resource-types.xml not found
2023-09-11 16:06:16,707 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2023-09-11 16:06:16,904 INFO impl.YarnClientImpl: Submitted application application_1694419501011_0001
2023-09-11 16:06:16,945 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1694419501011_0001/
2023-09-11 16:06:16,945 INFO mapreduce.Job: Running job: job_1694419501011_0001
2023-09-11 16:06:25,035 INFO mapreduce.Job: Job job_1694419501011_0001 running in uber mode : false
2023-09-11 16:06:25,035 INFO mapreduce.Job: map 0% reduce 0%
2023-09-11 16:06:30,080 INFO mapreduce.Job: map 100% reduce 0%
2023-09-11 16:06:35,100 INFO mapreduce.Job: map 100% reduce 100%
2023-09-11 16:06:36,110 INFO mapreduce.Job: Job job_1694419501011_0001 completed successfully
2023-09-11 16:06:36,191 INFO mapreduce.Job: Counters: 54
File System Counters
FILE: Number of bytes read=915
FILE: Number of bytes written=555667
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=654
HDFS: Number of bytes written=601
HDFS: Number of read operations=8
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
HDFS: Number of bytes read erasure-coded=0
Job Counters
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=2216
Total time spent by all reduces in occupied slots (ms)=2858
Total time spent by all map tasks (ms)=2216
Total time spent by all reduce tasks (ms)=2858
Total vcore-milliseconds taken by all map tasks=2216
Total vcore-milliseconds taken by all reduce tasks=2858
Total megabyte-milliseconds taken by all map tasks=2269184
Total megabyte-milliseconds taken by all reduce tasks=2926592
Map-Reduce Framework
Map input records=1
Map output records=106
Map output bytes=980
Map output materialized bytes=915
Input split bytes=98
Combine input records=106
Combine output records=77
Reduce input groups=77
Reduce shuffle bytes=915
Reduce input records=77
Reduce output records=77
Spilled Records=154
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=99
CPU time spent (ms)=1150
Physical memory (bytes) snapshot=595423232
Virtual memory (bytes) snapshot=5482131456
Total committed heap usage (bytes)=546832384
Peak Map Physical memory (bytes)=325435392
Peak Map Virtual memory (bytes)=2638544896
Peak Reduce Physical memory (bytes)=269987840
Peak Reduce Virtual memory (bytes)=2843586560
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=556
File Output Format Counters
Bytes Written=601
# 執(zhí)行完成
[root@master hadoop]# ./bin/hdfs dfs -ls /output/count.txt
Found 2 items
-rw-r--r-- 3 root supergroup 0 2023-09-11 16:06 /output/count.txt/_SUCCESS # 執(zhí)行結(jié)果標(biāo)識(shí)
-rw-r--r-- 3 root supergroup 601 2023-09-11 16:06 /output/count.txt/part-r-00000 # 執(zhí)行結(jié)果
[root@master hadoop]# ./bin/hdfs dfs -cat /output/count.txt/part-r-00000
, 1
. 5
.But 1
1234567. 1
:lihua@1236.com 1
~
# 結(jié)果太多,此處省略
新任務(wù)job_1694419501011_0001執(zhí)行成功,網(wǎng)頁(yè)展示如下:
點(diǎn)擊任務(wù)可查看詳細(xì)信息:Attempt:應(yīng)用Application的嘗試任務(wù);Logs:嘗試任務(wù)日志;Node:執(zhí)行嘗試任務(wù)節(jié)點(diǎn)。
Attempt嘗試任務(wù)詳情:
- Num Node Local Containers (satisfied by)表示在同一節(jié)點(diǎn)上啟動(dòng)任務(wù)的容器數(shù)量。即,任務(wù)需要的資源可以滿足在同一節(jié)點(diǎn)上啟動(dòng),而不需要通過網(wǎng)絡(luò)從其他節(jié)點(diǎn)上獲取資源的容器數(shù)量。
- Num Rack Local Containers (satisfied by)表示在同一機(jī)架上啟動(dòng)任務(wù)的容器數(shù)量。即,任務(wù)需要的資源可以從同一機(jī)架上的其他節(jié)點(diǎn)上獲取,而不需要通過網(wǎng)絡(luò)從不同機(jī)架上獲取資源的容器數(shù)量。
- Num Off Switch Containers (satisfied by)表示需要跨機(jī)架獲取資源的容器數(shù)量。即,任務(wù)需要的資源無法從同一機(jī)架上的其他節(jié)點(diǎn)上獲取,而需要通過網(wǎng)絡(luò)從不同機(jī)架上獲取資源的容器數(shù)量。
這些指標(biāo)對(duì)于優(yōu)化Hadoop集群的性能和資源利用率非常重要。例如,如果Num Node Local Containers的數(shù)量太少,可能表示某些節(jié)點(diǎn)的資源利用率不足;如果Num Off Switch Containers的數(shù)量太多,可能表示集群的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)需要優(yōu)化。
3.3.2.3 資源控制
YARN資源控制流程如下:
- MR程序提交到客戶端所在的節(jié)點(diǎn);
- YarnRunner向ResourceManager申請(qǐng)一個(gè)Application;
- RM將該應(yīng)用程序的資源路徑返回給YarnRunner;
- 該程序?qū)⑦\(yùn)行所需資源提交到HDFS上;
- 程序資源提交完畢后,申請(qǐng)運(yùn)行mrAppMaste;
- RM將用戶的請(qǐng)求初始化成一個(gè)Task;
- 其中一個(gè)NodeManager領(lǐng)取到Task任務(wù);
- 該NodeManager創(chuàng)建容器Container,并產(chǎn)生MRAppmaster;
- Container從HDFS上拷貝資源到本地;
- MRAppmaster向RM 申請(qǐng)運(yùn)行MapTask資源;
- RM將運(yùn)行MapTask任務(wù)分配給另外兩個(gè)NodeManager,另兩個(gè)NodeManager分別領(lǐng)取任務(wù)并創(chuàng)建容器;
- MR向兩個(gè)接收到任務(wù)的NodeManager發(fā)送程序啟動(dòng)腳本,這兩個(gè)NodeManager分別啟動(dòng)MapTask,MapTask對(duì)數(shù)據(jù)分區(qū)排序;
- MrAppMaster等待所有MapTask運(yùn)行完畢后,向RM申請(qǐng)容器,運(yùn)行ReduceTask;
- ReduceTask向MapTask獲取相應(yīng)分區(qū)的數(shù)據(jù);
- 程序運(yùn)行完畢后,MR會(huì)向RM申請(qǐng)注銷自己;
YARN執(zhí)行任務(wù)案例:
[root@master hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input/word.txt /output/count.txt
2023-09-12 11:03:02,112 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at master/9.134.244.180:8032 # 客戶端申請(qǐng)RM連接
2023-09-12 11:03:02,385 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0001 # RM返回客戶端HDFS的job id存儲(chǔ)路徑
# 插入當(dāng)時(shí)查看記錄
[root@master bin]# ./hdfs dfs -ls /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002
Found 6 items
-rw-r--r-- 10 root supergroup 280990 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job.jar
-rw-r--r-- 10 root supergroup 105 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job.split
-rw-r--r-- 3 root supergroup 34 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job.splitmetainfo
-rw-r--r-- 3 root supergroup 236995 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job.xml
-rw-r--r-- 3 root supergroup 0 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job_1694487467398_0002_1.jhist
-rw-r--r-- 3 root supergroup 273861 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job_1694487467398_0002_1_conf.xml
2023-09-12 11:03:03,491 INFO input.FileInputFormat: Total input files to process : 1 # 需要處理的文件總數(shù)
2023-09-12 11:03:03,993 INFO mapreduce.JobSubmitter: number of splits:1
2023-09-12 11:03:04,356 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1694487467398_0001 # 任務(wù)令牌
2023-09-12 11:03:04,356 INFO mapreduce.JobSubmitter: Executing with tokens: []
2023-09-12 11:03:04,477 INFO conf.Configuration: resource-types.xml not found
2023-09-12 11:03:04,477 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2023-09-12 11:03:04,667 INFO impl.YarnClientImpl: Submitted application application_1694487467398_0001 # 提交的job任務(wù)
2023-09-12 11:03:04,703 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1694487467398_0001/
# 跟蹤查看job任務(wù)執(zhí)行的URL
2023-09-12 11:03:04,704 INFO mapreduce.Job: Running job: job_1694487467398_0001 # 運(yùn)行中的job任務(wù)
2023-09-12 11:03:12,785 INFO mapreduce.Job: Job job_1694487467398_0001 running in uber mode : false
2023-09-12 11:03:12,785 INFO mapreduce.Job: map 0% reduce 0% # MapReduce進(jìn)度
2023-09-12 11:03:16,824 INFO mapreduce.Job: map 100% reduce 0% # 當(dāng)Map執(zhí)行完成開始Reduce
2023-09-12 11:03:21,846 INFO mapreduce.Job: map 100% reduce 100% # Map+Reduce均完成
2023-09-12 11:03:22,855 INFO mapreduce.Job: Job job_1694487467398_0001 completed successfully # job任務(wù)完成標(biāo)識(shí)
2023-09-12 11:03:22,934 INFO mapreduce.Job: Counters: 54
File System Counters # 文件系統(tǒng)計(jì)數(shù)統(tǒng)計(jì)
FILE: Number of bytes read=915
FILE: Number of bytes written=555663
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=654
HDFS: Number of bytes written=601
HDFS: Number of read operations=8
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
HDFS: Number of bytes read erasure-coded=0
Job Counters # job任務(wù)計(jì)數(shù)統(tǒng)計(jì)
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=2280
Total time spent by all reduces in occupied slots (ms)=1981
Total time spent by all map tasks (ms)=2280
Total time spent by all reduce tasks (ms)=1981
Total vcore-milliseconds taken by all map tasks=2280
Total vcore-milliseconds taken by all reduce tasks=1981
Total megabyte-milliseconds taken by all map tasks=2334720
Total megabyte-milliseconds taken by all reduce tasks=2028544
Map-Reduce Framework # MapReduce框架信息
Map input records=1
Map output records=106
Map output bytes=980
Map output materialized bytes=915
Input split bytes=98
Combine input records=106
Combine output records=77
Reduce input groups=77
Reduce shuffle bytes=915
Reduce input records=77
Reduce output records=77
Spilled Records=154
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=72
CPU time spent (ms)=880
Physical memory (bytes) snapshot=553959424
Virtual memory (bytes) snapshot=5285777408
Total committed heap usage (bytes)=591921152
Peak Map Physical memory (bytes)=327335936
Peak Map Virtual memory (bytes)=2640453632
Peak Reduce Physical memory (bytes)=226623488
Peak Reduce Virtual memory (bytes)=2645323776
Shuffle Errors # Shuffle錯(cuò)誤統(tǒng)計(jì)
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters # 文件輸入格式計(jì)數(shù)器
Bytes Read=556
File Output Format Counters # 文件輸出格式計(jì)數(shù)器
Bytes Written=601
3.3.3 集群控制腳本
#!/bin/bash
read -p "please input 'hdfs/yarn/all/help':" a1
cd /middleware/hadoop/sbin # hadoop安裝路徑
case ${a1:-help} in
hdfs )
read -p "please input 'start/stop/restart':" b2
case ${b2:-help} in
start )
bash start-dfs.sh
;;
stop )
bash stop-dfs.sh
;;
restart )
bash stop-dfs.sh && bash start-dfs.sh
;;
* )
echo "ERROR,please input 'start/stop/restart'!"
;;
esac
;;
yarn )
read -p "please input 'start/stop/restart':" c3
case ${c3:-help} in
start )
bash start-yarn.sh
;;
stop )
bash stop-yarn.sh
;;
restart )
bash stop-yarn.sh && bash start-yarn.sh
;;
* )
echo "ERROR,please input 'start/stop/restart'!"
;;
esac
;;
all )
read -p "please input 'start/stop/restart':" d4
case ${d4:-help} in
start )
bash start-all.sh
;;
stop )
bash stop-all.sh
;;
restart )
bash stop-all.sh && bash start-all.sh
;;
* )
echo "ERROR,please input 'start/stop/restart'!"
;;
esac
;;
* )
echo "ERROR,please input 'hdfs/yarn/all/help'!"
;;
esac
cd - > /dev/null 2>&1
4、常見操作
4.1 NN異?;謴?fù)
模擬NN節(jié)點(diǎn)異常,將SNN fsimage數(shù)據(jù)導(dǎo)入NN進(jìn)行恢復(fù)的場(chǎng)景。
[root@master hadoop]# kill -9 19514 # NameNode進(jìn)程
1.2
[root@node1 hadoop]# ll dfs/
total 8
drwx------ 3 root root 4096 Sep 11 14:35 data
drwxr-xr-x 3 root root 4096 Sep 11 14:35 namesecondary
# 備份NN數(shù)據(jù)
[root@master hadoop]# mkdir /tmp/nn_backup/
[root@master hadoop]# mv dfs/name/* /tmp/nn_backup/
# 將SNN的數(shù)據(jù)拷貝到NN
[root@node1 hadoop]# scp -r -P 36000 dfs/namesecondary/* master:/middleware/hadoop/dfs/name/
# 導(dǎo)入元數(shù)據(jù)
[root@master hadoop]# ./bin/hadoop namenode –importCheckpoint
# 啟動(dòng)HDFS
[root@master hadoop]# ./sbin/start-dfs.sh
# 導(dǎo)入fsimage文件后,可能需要等待一段時(shí)間才能完成所有塊的復(fù)制和狀態(tài)更新。在此期間,HDFS可能無法對(duì)外提供完全正常的服務(wù)
4.2 安全模式
HDFS集群正常開啟時(shí)處于短暫的安全模式,不能執(zhí)行重要操作(寫操作),待集群?jiǎn)?dòng)完成后,自動(dòng)退出安全模式。
# 查看
[root@master hadoop-1]# ./bin/hdfs dfsadmin -safemode get
Safe mode is OFF
# 開啟
[root@master hadoop-1]# ./bin/hdfs dfsadmin -safemode enter
Safe mode is ON
# 關(guān)閉
[root@master hadoop-1]# ./bin/hdfs dfsadmin -safemode leave
Safe mode is OFF
# 等待
[root@master hadoop-1]# ./bin/hdfs dfsadmin -safemode wait
Safe mode is OFF
4.3 數(shù)據(jù)平衡
新加入的節(jié)點(diǎn),沒有數(shù)據(jù)塊的存儲(chǔ),或HDFS長(zhǎng)期使用過程發(fā)現(xiàn)其數(shù)據(jù)分布不均衡,部分節(jié)點(diǎn)遠(yuǎn)超其他節(jié)點(diǎn)時(shí),使得集群整體來看負(fù)載還不均衡。因此需要對(duì)HDFS數(shù)據(jù)存儲(chǔ)設(shè)置負(fù)載均衡。
# 默認(rèn)的數(shù)據(jù)傳輸帶寬比較低,可以設(shè)置為64M
[root@master hadoop]# ./bin/hdfs dfsadmin -setBalancerBandwidth 67108864
# 默認(rèn)balancer的threshold為10%(各個(gè)節(jié)點(diǎn)與集群總的存儲(chǔ)使用率相差不超過10%)
[root@master hadoop]# ./sbin/start-balancer.sh -threshold 5
4.4 集群擴(kuò)/縮容
4.4.1 擴(kuò)容
# 配置免密登錄,參考本文3.3章節(jié)環(huán)境準(zhǔn)備操作
[root@master hadoop]# ssh-keygen -t rsa -b 4096
# 下發(fā)密鑰到其他節(jié)點(diǎn),并拷貝其他節(jié)點(diǎn)密鑰到本地,共計(jì)6次(對(duì)外3次,對(duì)內(nèi)3次)
[root@master hadoop]# ssh-copy-id master
# 附加hosts
[root@node3 hadoop]# vim /etc/hosts
~
$ip4 node3
# 附加workers
[root@node3 hadoop]# vim workers
~
node3
# 啟動(dòng)node3 DdataNode與NodeManager
[root@node3 hadoop]# hadoop-daemon.sh start datanode
[root@node3 hadoop]# yarn-daemon.sh start nodemanager
# 可以使用工具查看YARN NM機(jī)器列表;HDFS DN列表可通過瀏覽器查看ip:50090中DataNodes頁(yè)面
[root@master hadoop]# ./bin/yarn node -list
2023-09-12 14:28:47,291 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at master/9.134.244.180:8032
Total Nodes:4
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
master:41295 RUNNING master:8042 0
node2:38853 RUNNING node2:8042 0
node1:41665 RUNNING node1:8042 0
node3:41573 RUNNING node3:8042 0
# 開啟node3為DN后數(shù)據(jù)塊不會(huì)立刻存儲(chǔ)到node3上,可以使用數(shù)據(jù)平衡操作重新平衡數(shù)據(jù)分配
[root@node3 hadoop]# ./bin/hdfs dfsadmin -setBalancerBandwidth 104857600
[root@node3 hadoop]# ./bin/hdfs balancer -threshold 1 # 集群數(shù)據(jù)較少,因此閾值設(shè)置為1,平衡操作參考本文4.3章節(jié),等待集群自均衡完成即可
4.4.2 縮容
DataNode縮容不像擴(kuò)容那樣啟動(dòng)一個(gè)節(jié)點(diǎn)即可, 縮容需要把當(dāng)前節(jié)點(diǎn)數(shù)據(jù)移出去,Hadoop已經(jīng)提供了下線功能,前提是在NameNode機(jī)器的hdfs-site.xml配置文件中需要提前配置dfs.hosts.exclude屬性,該屬性指向的文件就是所謂的黑名單列表,會(huì)被NameNode排除在集群之外。如果文件內(nèi)容為空,則意味著不禁止任何機(jī)器。所以在安裝Hadoop的時(shí)候就需要指定好改配置,如果最開始沒有配置該參數(shù),則需要添加后重啟NameNode 。
# 在NameNode所在服務(wù)器的配置目錄etc/hadoop下創(chuàng)建dfs.hosts.exclude文件,并添加需要退役的主機(jī)名稱。
[root@master hadoop]# vim hdfs-site.xml
~
<property>
<name>dfs.hosts.exclude</name>
<value>/middleware/hadoop/etc/hadoop/excludes</value>
</property>
# 重啟NN使其配置生效
[root@master hadoop]# vim /middleware/hadoop/etc/hadoop/excludes
node3
# 如果副本數(shù)是3,在線的節(jié)點(diǎn)小于等于3,是不能下線成功的,需要修改副本數(shù)后才能下線。
# 刷新NameNode、刷新ResourceManager進(jìn)程
[root@master hadoop]# ./bin/hdfs dfsadmin -refreshNodes
[root@master hadoop]# ./bin/yarn rmadmin –refreshNodes
# 等待退役節(jié)點(diǎn)狀態(tài)為decommissioned(所有塊已經(jīng)復(fù)制完成),停止該節(jié)點(diǎn)及節(jié)點(diǎn)資源管理器
# 停止node3進(jìn)程
[root@master hadoop]# ./sbin/hadoop-daemon.sh stop datanode
[root@master hadoop]# ./sbin/yarn-daemon.sh stop nodemanager
4.5 回收站
在HDFS中刪除的文件不會(huì)直接徹底清掉,會(huì)先丟棄到回收站中(HDFS回收站路徑:/user/root/.Trash/),過一段時(shí)間之后,自動(dòng)清空垃圾桶當(dāng)中的文件。
在core-site.xml配置中fs.trash.interval=0代表禁用回收站,大于0時(shí)表示啟用回收站,以分鐘為單位的垃圾回收時(shí)間;默認(rèn)值fs.trash.checkpoint.interval=0,如果是0,值等同于fs.trash.interval,以分鐘為單位的垃圾回收檢查間隔。要求fs.trash.checkpoint.interval<=fs.trash.interval。
[root@master hadoop]# vim core-site.xml
<!-- 開啟hdfs的垃圾桶機(jī)制,刪除掉的數(shù)據(jù)可以從垃圾桶中回收,單位分鐘 -->
<property>
<name>fs.trash.interval</name>
<value>10</value>
</property>
[root@master hadoop]# ./sbin/stop-dfs.sh && ./sbin/start-dfs.sh
# 測(cè)試刪除
[root@master hadoop]# ./bin/hdfs dfs -put ./aaa.txt /delete.txt
[root@master hadoop]# ./bin/hdfs dfs -rm /delete.txt
2023-09-11 19:37:43,757 INFO fs.TrashPolicyDefault: Moved: 'hdfs://master:9000/delete.txt' to trash at: hdfs://master:9000/user/root/.Trash/Current/delete.txt
[root@master hadoop]# ./bin/hdfs dfs -ls /user/root/.Trash/Current/
Found 1 items
-rw-r--r-- 3 root supergroup 14 2023-09-11 19:37 /user/root/.Trash/Current/delete.txt
# 恢復(fù)數(shù)據(jù)
[root@master hadoop]# ./bin/hadoop fs -mv /user/root/.Trash/Current/delete.txt /
[root@master hadoop]# ./bin/hdfs dfs -ls /delete.txt
-rw-r--r-- 3 root supergroup 14 2023-09-11 19:37 /delete.txt
# 清空回收站
[root@master bin]# ./hadoop fs -expunge
2023-09-12 11:02:07,077 INFO fs.TrashPolicyDefault: TrashPolicyDefault#deleteCheckpoint for trashRoot: hdfs://master:9000/user/root/.Trash
2023-09-12 11:02:07,077 INFO fs.TrashPolicyDefault: TrashPolicyDefault#deleteCheckpoint for trashRoot: hdfs://master:9000/user/root/.Trash
2023-09-12 11:02:07,087 INFO fs.TrashPolicyDefault: TrashPolicyDefault#createCheckpoint for trashRoot: hdfs://master:9000/user/root/.Trash
2023-09-12 11:02:07,094 INFO fs.TrashPolicyDefault: Created trash checkpoint: /user/root/.Trash/230912110207
4.6 Snapshot 快照
Snapshot是HDFS整個(gè)文件系統(tǒng),或者某個(gè)目錄在某個(gè)時(shí)刻的鏡像。**快照不是數(shù)據(jù)的簡(jiǎn)單拷貝,快照只做差異的記錄!**HDFS 快照的核心功能包括:數(shù)據(jù)恢復(fù)、數(shù)據(jù)備份、數(shù)據(jù)測(cè)試。
- 差異拷貝:在 HDFS 中,如果在其中一個(gè)目錄比如/A下創(chuàng)建一個(gè)快照,則快照文件中將會(huì)存在與/A目錄下完全一致的子目錄文件結(jié)構(gòu)以及相應(yīng)的屬性信息,通過命令也能看到快照里面具體的文件內(nèi)容。但是這并不意味著快照已經(jīng)對(duì)此數(shù)據(jù)進(jìn)行完全的拷貝 。這里遵循一個(gè)原則:對(duì)于大多不變的數(shù)據(jù),你所看到的數(shù)據(jù)其實(shí)是當(dāng)前物理路徑所指的內(nèi)容,而發(fā)生變更的inode數(shù)據(jù)才會(huì)被快照額外拷貝;
- HDFS快照不會(huì)復(fù)制Datanode中的塊,只記錄了塊列表和文件大?。?/li>
- HDFS快照不會(huì)對(duì)常規(guī)HDFS操作產(chǎn)生不利影響,修改記錄按逆時(shí)針順序進(jìn)行,因此可以直接訪問當(dāng)前數(shù)據(jù),通過從當(dāng)前數(shù)據(jù)中減去修改來計(jì)算快照數(shù)據(jù);
4.6.1 操作命令
HDFS 中可以針對(duì)整個(gè)文件系統(tǒng)或者文件系統(tǒng)中某個(gè)目錄創(chuàng)建快照,但是創(chuàng)建快照的前提是相應(yīng)的目錄開啟快照的功能。
# 啟用快照功能
[root@master hadoop]# ./hdfs dfsadmin -allowSnapshot $path
# 禁用快照功能
[root@master hadoop]# ./hdfs dfsadmin -disallowSnapshot $path
# 對(duì)目錄創(chuàng)建快照
[root@master hadoop]# ./hdfs dfs -createSnapshot $path
# 指定名稱創(chuàng)建快照
[root@master hadoop]# ./hdfs dfs -createSnapshot $path $name
# 重命名快照
[root@master hadoop]# ./hdfs dfs -renameSnapshot $path $name1 $name2
# 列出當(dāng)前用戶所有可快照目錄
[root@master hadoop]# ./hdfs lsSnapshottableDir
# 比較兩個(gè)快照目錄的不同之處
[root@master hadoop]# ./hdfs snapshotDiff $path1 $path2
# # 刪除快照
[root@master hadoop]# ./hdfs dfs -deleteSnapshot $path $name
4.6.2 快照使用
4.6.2.1開啟快照
[root@master hadoop]# ./bin/hdfs dfsadmin -allowSnapshot /input
Allowing snapshot on /input succeeded
4.6.2.2 對(duì)指定目錄創(chuàng)建快照
[root@master hadoop]# ./bin/hdfs dfs -createSnapshot /input
Created snapshot /input/.snapshot/s20230912-144829.624
[root@master hadoop]# ./bin/hdfs dfs -createSnapshot /input mysnap1
Created snapshot /input/.snapshot/mysnap1
4.6.2.3 重命名快照
[root@master hadoop]# ./bin/hdfs dfs -renameSnapshot /input mysnap1 mysnap2
Renamed snapshot mysnap1 to mysnap2 under hdfs://master:9000/input
4.6.2.4 列出當(dāng)前用戶所有可以快照的目錄
[root@master hadoop]# ./bin/hdfs lsSnapshottableDir
drwxr-xr-x 0 root supergroup 0 2023-09-12 14:49 2 65536 /input
4.6.2.5 比較兩個(gè)快照不同之處
[root@master hadoop]# echo 222 > 2.txt
[root@master hadoop]# ./bin/hadoop fs -appendToFile 2.txt /input/1.txt
[root@master hadoop]# ./bin/hadoop fs -cat /input/1.txt
222
[root@master hadoop]# ./bin/hdfs dfs -createSnapshot /input mysnap3
Created snapshot /input/.snapshot/mysnap3
[root@master hadoop]# ./bin/hadoop fs -put 2.txt /input
[root@master hadoop]# ./bin/hdfs dfs -createSnapshot /input mysnap4
Created snapshot /input/.snapshot/mysnap4
[root@master hadoop]# ./bin/hdfs snapshotDiff /input mysnap2 mysnap4
Difference between snapshot mysnap2 and snapshot mysnap4 under directory /input:
M .
+ ./1.txt
+ ./2.txt
# 表頭備注:
# + The file/directory has been created.
# - The file/directory has been deleted.
# M The file/directory has been modified.
# R The file/directory has been renamed.
4.6.2.6 刪除快照
[root@master hadoop]# ./bin/hdfs dfs -deleteSnapshot /input mysnap4
Deleted snapshot mysnap4 under hdfs://master:9000/input
4.6.2.7 刪除有快照的目錄
# 擁有快照的目錄不允許被刪除(強(qiáng)制-r仍不可刪除),某種程度上也保護(hù)了文件安全
[root@master hadoop]# ./bin/hadoop fs -rm -r /input
rm: Failed to move to trash: hdfs://master:9000/input: The directory /input cannot be deleted since /input is snapshottable and already has snapshots
5、錯(cuò)誤記錄
5.1 Java版本不兼容
java版本過高,與當(dāng)前Hadoop部分代碼不兼容導(dǎo)致功能異常,報(bào)錯(cuò)如下:
降低Java版本,本環(huán)境使用TencentJDK 17(為何不用Oracle JDK的原因:虛擬機(jī)為測(cè)試機(jī)器,版權(quán)問題無法使用),降低為TencentJDK 8。
[root@node2 ~]# tar -xf /root/TencentKona8.0.15.b2_jdk_linux-x86_64_8u382.tar.gz -C /middleware/
[root@node2 ~]# cd /middleware/
# 由于之前JDK部署為軟鏈接,因此降低版本只需要更新軟鏈接即可
export JAVA_HOME=/middleware/jdk
export PATH=${JAVA_HOME}/bin:$PATH
export CLASSPATH=.:${JAVA_HOME}/lib
[root@node2 /middleware]# unlink jdk
[root@node2 /middleware]# ln -s TencentKona-8.0.15-382/ jdk
[root@node2 /middleware]# source /etc/profile
[root@node2 /middleware]# java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (Tencent Kona 8.0.15) (build 1.8.0_382-b2)
OpenJDK 64-Bit Server VM (Tencent Kona 8.0.15) (build 25.382-b2, mixed mode, sharing)
# 重啟服務(wù)
[root@master hadoop]# ./sbin/stop-dfs.sh && ./sbin/start-dfs.sh
重新使用瀏覽器登錄或刷新頁(yè)面即可查看到數(shù)據(jù)展示正常。
5.2 無法正常查看文件內(nèi)容
上傳一個(gè)文件后,使用Head eth file或Tail the file時(shí)無法正常查看文件內(nèi)容,報(bào)錯(cuò)如下:
這是因?yàn)闄C(jī)器內(nèi)部發(fā)送請(qǐng)求為http://node2:9864/webhdfs/v1/aaa.txt
請(qǐng)求時(shí),當(dāng)前物理機(jī)器無法識(shí)別node2的ip地址導(dǎo)致異常,需要更改本地Hosts,添加master、node1、node2三個(gè)機(jī)器的ip地址。
-
MAC:/etc/hosts
-
Windows:C:\Windows\System32\drivers\etc\hosts文章來源:http://www.zghlxwxcb.cn/news/detail-733461.html
修改完成后刷新頁(yè)面重新訪問即可恢復(fù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-733461.html
到了這里,關(guān)于Middleware ? Hadoop功能與使用詳解(HDFS+YARN)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!