看完就能独自把集群搭起来!Hadoop HDFS完全分布式环境搭建以及技术详解
作者 |?慢慢變成大佬
責(zé)編 |?Carol
出品 | CSDN云計算(ID:CSDNcloud)
在文章開始之前,作者想要告訴大家:讀懂本篇文章,能讓小白快速入門,并且能夠搭建完全分布式的集群,以及能對Hadoop HDFS產(chǎn)生詳細的認(rèn)知,對以后的學(xué)習(xí)有很大的幫助。
我們先來了解Hadoop的HDFS基本概念,熟知基本概念,在搭環(huán)境時能夠能加得心應(yīng)手。
Hadoop基本介紹
Hadoop是一個框架:Hadoop的本質(zhì)其實就是一系列功能模塊兒組成的框架,每個模塊分別負責(zé)Hadoop的一些功能,如HDFS負責(zé)大數(shù)據(jù)的存儲功能,Yarn,負責(zé)整個集群的資源調(diào)度,Common則負責(zé)Hadoop遠程過程調(diào)用的實現(xiàn)以及提供序列化機制。
Hadoop具有高容錯性,以及高拓展性。
Hadoop適合處理大數(shù)據(jù)數(shù)據(jù)。
1、HDFS的架構(gòu)
這里對HDFS的組成架構(gòu)做說明:
1)NameNode : 是HDFS的主從架構(gòu)中的Master,負責(zé)維護整個文件系統(tǒng)的目錄樹,管理數(shù)據(jù)塊(Block)的元數(shù)據(jù)信息,處理客戶端的讀寫請求,并且管理Block的副本放置策略。
2)DataNode: 是HDFS的主從架構(gòu)中的Slave,存放在HDFS中的文件都被分成塊來存儲,DataNode負責(zé)存儲文件的塊,對于DataNode所在的節(jié)點來說,塊就是一個普通的文件,可以在DataNode存放塊的目錄下查看,如果不改動,默認(rèn)是$(dfs.data.dir)/current),塊的文件名為blk_blkID。DataNode會通過心跳機制和NameNode通信。
在集群初始化時,每個DataNode啟動后都將當(dāng)前存儲的塊的元數(shù)據(jù)信息告訴NameNode,在集群正常工作時,DataNode會不斷的向NameNode通信,向它提供自己本地的信息,同時會接受來自NameNode的讀寫命令,來操作本地的數(shù)據(jù)塊。
這個時候我們會有疑問,NameNode的元數(shù)據(jù)到底存放在哪里??首先不可能是磁盤,因為如果存放在 ?磁盤,那么經(jīng)常操作HDFS,效率會非常低,那么就只能會存放內(nèi)存里,可是,效率雖然快了,但是如果 ?內(nèi)存滿了,或者集群停止服務(wù),那么數(shù)據(jù)的元數(shù)據(jù)就會丟失,對于這個問題,HDFS做了一個專門用來解決 ?這個問題的角色,SecondaryNameNode
3)SecondaryNamenode: 是用于定期合并命名空間鏡像和命名空間鏡像的編輯日志的輔助守護進程,每個HDFS集群都有一個SecondaryNameNode,在生產(chǎn)環(huán)境下,一般SecondaryNameNode也會單獨運行在一臺服務(wù)器上。
FSImage文件(命名空間鏡像) 可以理解為NameNode當(dāng)時的內(nèi)存狀態(tài)或者內(nèi)存中元數(shù)據(jù)序列化后形成的文件,所有信息保存做成的鏡像文件,是可以被加載的。也可以理解為是文件系統(tǒng)元數(shù)據(jù)的一個永久的性檢查點,但并不是每一個寫操作都會更新這個文件,因為FSImage肯定是一個大型的文件,如果頻繁地執(zhí)行對這個文件進行寫操作,會使系統(tǒng)運行極為緩慢。
解決方案是,NameNode只將改動內(nèi)容預(yù)寫日志(WAL),即寫入命名空間鏡像的編輯日志(edit log 記錄客戶端更新元數(shù)據(jù)信息的每一步操作)可通過Edits運算出元數(shù)據(jù)。隨著時間的推移,編輯日志會變得越來越大,那么如果發(fā)生故障,將會花費非常多的時間來進行回滾操作,所以就像傳統(tǒng)的關(guān)系型數(shù)據(jù)庫一樣,需要定期地合并FSImage和編輯日志。
如果由NameNode來做合并的操作,那么NameNode在為集群提供服務(wù)時可能無法提供足夠的資源,那么為了徹底解決這一問題,就加入了SecondaryNameNode這個角色。
工作詳解:
NameNode啟動時,先滾動Edits并生成一個空的edits.inprogress,然后加載Edits和Fsimage到內(nèi)存中,此時NameNode內(nèi)存就持有最新的元數(shù)據(jù)信息。Client開始對NameNode發(fā)送元數(shù)據(jù)的增刪改的請求,這些請求的操作首先會被記錄到edits.inprogress中(查詢元數(shù)據(jù)的操作不會被記錄在Edits中,因為查詢操作不會更改元數(shù)據(jù)信息),如果此時NameNode掛掉,重啟后會從Edits中讀取元數(shù)據(jù)的信息。然后,NameNode會在內(nèi)存中執(zhí)行元數(shù)據(jù)的增刪改的操作。
由于Edits中記錄的操作會越來越多,Edits文件會越來越大,導(dǎo)致NameNode在啟動加載Edits時會很慢,所以需要對Edits和Fsimage進行合并(所謂合并,就是將Edits和Fsimage加載到內(nèi)存中,照著Edits中的操作一步步執(zhí)行,最終形成新的Fsimage)。SecondaryNameNode的作用就是幫助NameNode進行Edits和Fsimage的合并工作。
4)塊: 每個磁盤都有默認(rèn)的數(shù)據(jù)塊大小,這是磁盤進行數(shù)據(jù)讀/寫的最小單位,文件系統(tǒng)也有文件塊的概念,HDFS同樣也有塊(block)的概念,但是HDFS的塊比一般文件系統(tǒng)的塊大得多,默認(rèn)為128MB,并且可以隨著實際需要而變化,配置項為HDFS-site.xml文件中的dfs.block.size項。
與單一文件系統(tǒng)相似,HDFS上的文件也被劃分為塊大小的多個分塊,它是HDFS存儲處理的最小單元。HDFS中的塊如此之大的原因是為了最小化尋址開銷。如果塊設(shè)置的足夠大,從磁盤傳輸數(shù)據(jù)的時間可以明顯大于定位這個塊開始位置所需的時間。這樣,傳輸一個由多個塊組成的文件的時間取決于磁盤傳輸?shù)男省5靡嬗诖疟P傳輸速率的提升,塊的大小可以被設(shè)為300 MB甚至更大。
2、HDFS的容錯機制
1)心跳機制
在NameNode和DataNode之間維持心跳檢測,當(dāng)由于網(wǎng)絡(luò)故障之類的原因,導(dǎo)致DataNode發(fā)出的心跳包沒有被NameNode正常收到的時候,NameNode就不會將任何新的I/O操作派發(fā)給那個DataNode,該DataNode上的數(shù)據(jù)被認(rèn)為是無效的,因此NameNode會檢測是否有文件塊的副本數(shù)目小于設(shè)置值,如果小于就自動開始復(fù)制新的副本并分發(fā)到其他DataNode節(jié)點。
2)檢測文件塊的完整性
HDFS會記錄每個新創(chuàng)建文件的所有塊的校驗和。當(dāng)以后檢索這些文件時或者從某個節(jié)點獲取塊時,會首先確認(rèn)校驗和是否一致,如果不一致,會從其他DataNode節(jié)點上獲取該塊的副本。
3)集群的負載均衡
由于節(jié)點的失效或者增加,可能導(dǎo)致數(shù)據(jù)分布不均勻,當(dāng)某個DataNode節(jié)點的空閑空間大于一個臨界值的時候,HDFS會自動從其他DataNode遷移數(shù)據(jù)過來。
4)NameNode上的FSImage和編輯日志(edits log)
文件NameNode上的FSImage和編輯日志文件是HDFS的核心數(shù)據(jù)結(jié)構(gòu),如果這些文件損壞了,HDFS將失效。因而,NameNode由Secondary NameNode定期備份FSImage和編輯日志文件,NameNode在Hadoop中確實存在單點故障的可能,當(dāng)NameNode出現(xiàn)機器故障,手工干預(yù)是必須的。
5)文件的刪除
刪除操作并不是馬上從NameNode移出命名空間,而是存放在/trash目錄隨時可恢復(fù),直到超過設(shè)置時間才被正式移除。設(shè)置的時間由hdfs-site.xml文件的配置項fs.trash.interval決定,單位為秒。
6)多副本機制
HDFS會將文件切片成塊并存儲至各個DataNode中,文件數(shù)據(jù)塊在HDFS的布局情況由NameNode和hdfs-site.xml中的配置dfs.replication共同決定。dfs.replication表示該文件在HDFS中的副本數(shù),默認(rèn)為3,即有兩份冗余。
3、副本的選擇策略
Hadoop的默認(rèn)布局是在HDFS客戶端節(jié)點上放第一個副本,但是由于HDFS客戶端有可能運行于集群之外,就隨機選擇一個節(jié)點,不過Hadoop會盡量避免選擇那些存儲太滿或者太忙的節(jié)點。
第二個副本放在與第一個不同且隨機另外選擇的機架中的節(jié)點上。第三個副本與第二個副本放在相同的機架,且隨機選擇另外一個節(jié)點。其他副本(如果dfs.replication大于3)放在集群隨機選擇的節(jié)點上,Hadoop也會盡量避免在相同的機架上放太多副本。
4、HDFS寫文件流程
1)客戶端通過Distributed FileSystem模塊向NameNode請求上傳文件,NameNode檢查目標(biāo)文件是否已存在,父目錄是否存在。
2)NameNode返回是否可以上傳。
3)客戶端請求第一個 Block上傳到哪幾個DataNode服務(wù)器上。
4)NameNode返回3個DataNode節(jié)點,分別為dn1、dn2、dn3。
如果有多個節(jié)點,返回實際的副本數(shù)量,并根據(jù)距離及負載情況計算
5)客戶端通過FSDataOutputStream模塊請求dn1上傳數(shù)據(jù),dn1收到請求會繼續(xù)調(diào)用dn2,然后dn2調(diào)用dn3,將這個通信管道建立完成。
6)dn1、dn2、dn3逐級應(yīng)答客戶端。
7)客戶端開始往dn1上傳第一個Block(先從磁盤讀取數(shù)據(jù)放到一個本地內(nèi)存緩存),以Packet為單位,dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應(yīng)答隊列等待應(yīng)答。
8)當(dāng)一個Block傳輸完成之后,客戶端再次請求NameNode上傳第二個Block的服務(wù)器。(重復(fù)執(zhí)行3-7步)。
注意: 如果寫入的時候,復(fù)制管道中的某一個DataNode無法將數(shù)據(jù)寫入磁盤(如DataNode死機)。發(fā)生這種錯誤時,管道會立即關(guān)閉,已發(fā)送的但尚未收到確認(rèn)的數(shù)據(jù)包會被退回到隊列中,以確保管道中錯誤節(jié)點的下游節(jié)點可以得到數(shù)據(jù)包。而在剩下的健康的DataNode中,正在寫入的數(shù)據(jù)塊會被分配新的blk_id。
這樣,當(dāng)發(fā)生故障的數(shù)據(jù)節(jié)點恢復(fù)后,冗余的數(shù)據(jù)塊就會因為不屬于任何文件而被自動丟棄,由剩余DataNode節(jié)點組成的新復(fù)制管道會重新開放,寫入操作得以繼續(xù),寫操作將繼續(xù)直至文件關(guān)閉。
NameNode如果發(fā)現(xiàn)文件的某個數(shù)據(jù)塊正在通過復(fù)制管道進行復(fù)制,就會異步地創(chuàng)建一個新的復(fù)制塊,這樣,即便HDFS的多個DataNode發(fā)生錯誤,HDFS客戶端仍然可以從數(shù)據(jù)塊的副本中恢復(fù)數(shù)據(jù),前提是滿足最少數(shù)目要求的數(shù)據(jù)副本(dfs.replication.min)已經(jīng)被正確寫入(dfs.replication.min配置默認(rèn)為1)。
5、HDFS讀文件流程
1)客戶端通過Distributed FileSystem向NameNode請求下載文件,NameNode通過查詢元數(shù)據(jù),找到文件塊所在的DataNode地址。
2)挑選一臺DataNode(就近原則,然后隨機)服務(wù)器,請求讀取數(shù)據(jù)。
3)DataNode開始傳輸數(shù)據(jù)給客戶端(從磁盤里面讀取數(shù)據(jù)輸入流,以Packet為單位來做校驗)。
4)客戶端以Packet為單位接收,先在本地緩存,然后寫入目標(biāo)文件。
到這里,我們對HDFS的大部分概念已經(jīng)了解了,下面則來進行完全分布式的環(huán)境搭建。
環(huán)境搭建
1. 首先準(zhǔn)備3臺虛擬機,并且要保證虛擬機的時間同步和hosts,ip都配置好,集群能互相通信。
這里可以看到,我的三臺都配好了ip,而且hosts也都寫了,并且集群時間同步也都已經(jīng)做了。
接下來進行第二步。
2.?解壓安裝JDK,并且在/etc/profile 里面配置環(huán)境變量
通過xftp把文件傳到linux本地里面 ,自己新建文件夾,放到里面 ,然后解壓到自己的文件夾內(nèi)。
通過tar命令進行解壓并進行環(huán)境變量的配置,最后記得source配置文件。
然后我們進入Hadoop的目錄看一看:
(1)bin目錄:存放對Hadoop相關(guān)服務(wù)(HDFS,YARN)進行操作的腳本
(2)etc目錄:Hadoop的配置文件目錄,存放Hadoop的配置文件
(3)lib目錄:存放Hadoop的本地庫(對數(shù)據(jù)進行壓縮解壓縮功能)
(4)sbin目錄:存放啟動或停止Hadoop相關(guān)服務(wù)的腳本
(5)share目錄:存放Hadoop的依賴jar包、文檔、和官方案例
3. 接下來,我們進入etc目錄,并且對Hadoop的配置進行修改。
我們總共要修改 core-site.xml . hadoop-env.sh . hdfs-site.xml ,mapred-env.sh, mapred-site.xml , slaves, yarn-env.sh, yarn-site.xml
首先,在上面這些配置文件后綴都是sh的,比如hadoop-env.sh,我們就只需要把JavaHome配置一下。
其他的-env.sh的也是這樣,只需要配置JDK即可,這里就不多闡述 。
接下來,我們vim core-site,并配置這些東西
<!-- 指定HDFS中NameNode的地址 --><property><name>fs.defaultFS</name><value>hdfs://hadoop102:9000</value></property><!-- 指定Hadoop運行時產(chǎn)生文件的存儲目錄 --><property><name>hadoop.tmp.dir</name><value>/opt/module/hadoop-2.7.2/data/tmp</value></property>?
這個就配置完成,接著,我們就配置hdfs-site.xml
<!-- 配置塊的副本數(shù) --><property><name>dfs.replication</name><value>3</value></property><!-- 指定Hadoop輔助名稱節(jié)點主機配置 --><property><name>dfs.namenode.secondary.http-address</name><value>hadoop104:50090</value></property>然后配置yarn-site.xml
<!-- Reducer獲取數(shù)據(jù)的方式 --> <property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value> </property><!-- 指定YARN的ResourceManager的地址 --> <property><name>yarn.resourcemanager.hostname</name><value>hadoop103</value> </property>接著配置mapred-site.xml
<!-- 指定MR運行在Yarn上 --> <property><name>mapreduce.framework.name</name><value>yarn</value> </property>到這里,我們Hadoop的配置就已經(jīng)完成,因為是分布式,所以我們就通過scp -r 的命令把jdk,和Hadoop都拷貝過去,并且各自配置一下環(huán)境變量,并source,到這里我們完全分布式就配置完成。
然后我們可以單點啟動,也可以群起,不過群起需要配置免密,免密配置很簡單,就不再多說,接下來我們直接通過start-all.sh啟動集群,可以通過jps查看一下。
進程全部起來了,接下來我們?nèi)ebUI可以查看HDFS,端口是50070,yarn是8088
至此,我們的完全分布式搭建成功,相信大家也對搭建的過程很了解了,對Hadoop HDFS也都算是非常詳細的介紹了,希望大家看完都能自己搭建一個集群,對以后的大數(shù)據(jù)學(xué)習(xí)打下基礎(chǔ),至于shell操作HDFS,或者JavaAPI操作,都是非常簡單的,在這里簡單說一下, shell操作Hadoop十分簡單,部分命令和linux很像。
```powershell -mkdir 在HDFS上創(chuàng)建目錄 -moveFromLocal:從本地剪切粘貼到HDFS -appendToFile:追加一個文件到已經(jīng)存在的文件末尾 -cat:顯示文件內(nèi)容 -chgrp 、-chmod、-chown:Linux文件系統(tǒng)中的用法一樣,修改文件所屬權(quán)限 -copyFromLocal:從本地文件系統(tǒng)中拷貝文件到HDFS路徑去 -copyToLocal:從HDFS拷貝到本地 -cp :從HDFS的一個路徑拷貝到HDFS的另一個路徑 -mv:在HDFS目錄中移動文件 -get:等同于copyToLocal,就是從HDFS下載文件到本地 -getmerge:合并下載多個文件,比如HDFS的目錄 /user/lmr/test下有多個文件:log.1, log.2,log.3,... -put:等同于copyFromLocal -tail:顯示一個文件的末尾 -rm:刪除文件或文件夾 -rmdir:刪除空目錄 -du統(tǒng)計文件夾的大小信息?
至于Java的API相關(guān)操作,也是很簡單的,這里就不多說。
如果你有任何意見或想法,歡迎在評論區(qū)和我們討論!
在中國企業(yè)與「遠程辦公」正面相遇滿月之際,2月29日,CSDN 聯(lián)合廣大「遠程辦公」工具服務(wù)企業(yè)共同舉辦【抗擊疫情,科技公司在行動】系列之【遠程辦公】專題線上峰會活動:中國「遠程辦公」大考。掃下方二維碼或點擊閱讀原文免費報名直播+抽取獎品+與大牛交流。
想提前了解峰會詳情,可加小助手微信csdnai,回復(fù)遠程辦公,進直播群
推薦閱讀:探索處理數(shù)據(jù)的新方法,8 個重點帶你搞懂云數(shù)據(jù)庫——DBaaS(數(shù)據(jù)庫即服務(wù))到底是什么! 你的企業(yè)混合云了嗎?來看看評估混合云解決方案時要注意的6個原則! 程序員筆試面試最愛考察的算法,到底怎么搞定? 基于區(qū)塊鏈技術(shù)的數(shù)據(jù)共享賦能AI驅(qū)動網(wǎng)絡(luò)釘釘爆火背后,真正的在線教育機構(gòu)過得怎么樣?已有 1 家倒閉 先馬后看!詳解線性回歸、樸素貝葉斯、隨機森林在R和Python中的實現(xiàn)應(yīng)用!(附代碼) 真香,朕在看了!點擊“閱讀原文”,參與報名總結(jié)
以上是生活随笔為你收集整理的看完就能独自把集群搭起来!Hadoop HDFS完全分布式环境搭建以及技术详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重磅 | 边缘计算核心技术辨析
- 下一篇: 这 10 个云计算错误,会让你的业务一蹶