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