『壹』 hdfs有哪些進程並說明其作用
Hadoop分布式文件系統(HDFS)被設計成適合運行在通用硬體(commodity hardware)上的分布式文件系統。它和現有的分布式文件系統有很多共同點。但同時,它和其他的分布式文件系統的區別也是很明顯的。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS放寬了一部分POSIX約束,來實現流式讀取文件系統數據的目的。HDFS在最開始是作為Apache Nutch搜索引擎項目的基礎架構而開發的。HDFS是Apache Hadoop Core項目的一部分。 Hadoop分布式文件系統架構 1 NameNode(名稱節點) HDFS命名空間採用層次化(樹狀——譯者注)的結構存放文件和目錄。 2 映像和日誌 Inode和定義metadata的系統文件塊列表統稱為Image(映像).NameNode將整個命名空間映像保存在RAM中。而映像的持久化記錄則保存在NameNode的本地文件系統中,該持久化記錄被稱為Checkpoint(檢查點)。NameNode還會記錄HDFS中寫入的操作,並將其存入一個記錄文件,存放在本地文件系統中,這個記錄文件被叫做Journal(日誌)。 3 數據節點 DataNode上的每一個塊(block)副本都由兩個本地文件系統上的文件共同表示。其中一個文件包含了塊(block)本身所需包含的數據,另一個文件則記錄了該塊的元數據,包括塊所含數據大小和文件生成時間戳。數據文件的大小等於該塊(block)的真實大小,而不是像傳統的文件系統一樣,需要用額外的存儲空間湊成完整的塊。因此,如果一個塊里只需要一半的空間存儲數據,那麼就只需要在本地系統上分配半塊的存儲空間即可。 4 HDFS客戶端 用戶應用程序通過HDFS客戶端連接到HDFS文件系統,通過庫文件可導出HDFS文件系統的介面。像很多傳統的文件系統一樣,HDFS支持文件的讀、寫和刪除操作,還支持對目錄的創建和刪除操作。與傳統的文件系統不同的是,HDFS提供一個API用以暴露文件塊的位置。這個功能允許應用程序。 5 檢查點節點 HDFS中的NameNode節點,除了其主要職責是相應客戶端請求以外,還能夠有選擇地扮演一到兩個其他的角色,例如做檢查點節點或者備份節點。該角色是在節點啟動的時候特有的。 6 備份節點 HDFS的備份節點是最近在加入系統的一項特色功能。就像CheckpintNode一樣,備份節點能夠定期創建檢查點,但是不同的是,備份節點一直保存在內存中,隨著文件系統命名空間的映像更新和不斷更新,並與NameNode的狀態隨時保持同步。 7 系統更新和文件系統快照 在軟體更新的過程中,由於軟體的bug或者人為操作的失誤,文件系統損壞的幾率會隨之提升。在HDFS中創建系統快照的目的,就在於把系統升級過程中可能對數據造成的隱患降到最低。快照機制讓系統管理員將當前系統狀態持久化到文件系統中,這樣以來,如果系統升級後出現了數據丟失或者損壞,便有機會進行回滾操作,將HDFS的命名空間和存儲狀態恢復到系統快照進行的時刻。
『貳』 大數據之HDFS
在現代的企業環境中,單機容量往往無法存儲大量數據,需要跨機器存儲。統一管理分布在集群上的文件系統稱為 分布式文件系統 。
HDFS (Hadoop Distributed File System)是 Hadoop 的核心組件之一, 非常適於存儲大型數據 (比如 TB 和 PB), HDFS 使用多台計算機存儲文件,並且提供統一的訪問介面,像是訪問一個普通文件系統一樣使用分布式文件系統。
HDFS是分布式計算中數據存儲管理的基礎,是基於流數據模式訪問和處理超大文件的需求而開發的,可以運行於廉價的商用伺服器上。它所具有的 高容錯、高可靠性、高可擴展性、高獲得性、高吞吐率 等特徵為海量數據提供了不怕故障的存儲,為超大數據集的應用處理帶來了很多便利。
HDFS 具有以下 優點 :
當然 HDFS 也有它的 劣勢 ,並不適合以下場合:
HDFS 採用Master/Slave的架構來存儲數據,這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。
Namenode是整個文件系統的管理節點,負責接收用戶的操作請求。它維護著整個文件系統的目錄樹,文件的元數據信息以及文件到塊的對應關系和塊到節點的對應關系。
Namenode保存了兩個核心的數據結構:
在NameNode啟動的時候,先將fsimage中的文件系統元數據信息載入到內存,然後根據edits中的記錄將內存中的元數據同步到最新狀態;所以,這兩個文件一旦損壞或丟失,將導致整個HDFS文件系統不可用。
為了避免edits文件過大, SecondaryNameNode會按照時間閾值或者大小閾值,周期性的將fsimage和edits合並 ,然後將最新的fsimage推送給NameNode。
並非 NameNode 的熱備。當NameNode 掛掉的時候,它並不能馬上替換 NameNode 並提供服務。其主要任務是輔助 NameNode,定期合並 fsimage和fsedits。
Datanode是實際存儲數據塊的地方,負責執行數據塊的讀/寫操作。
一個數據塊在DataNode以文件存儲在磁碟上,包括兩個文件,一個是數據本身,一個是元數據,包括數據塊的長度,塊數據的校驗和,以及時間戳。
文件劃分成塊,默認大小128M,以快為單位,每個塊有多個副本(默認3個)存儲不同的機器上。
Hadoop2.X默認128M, 小於一個塊的文件,並不會占據整個塊的空間 。Block數據塊大小設置較大的原因:
文件上傳 HDFS 的時候,Client 將文件切分成 一個一個的Block,然後進行存儲。
Client 還提供一些命令來管理 HDFS,比如啟動或者關閉HDFS。
Namenode始終在內存中保存metedata,用於處理「讀請求」,到有「寫請求」到來時,namenode會首 先寫editlog到磁碟,即向edits文件中寫日誌,成功返回後,才會修改內存 ,並且向客戶端返回,Hadoop會維護一個fsimage文件,也就是namenode中metedata的鏡像,但是fsimage不會隨時與namenode內存中的metedata保持一致,而是每隔一段時間通過合並edits文件來更新內容。
HDFS HA(High Availability)是為了解決單點故障問題。
HA集群設置兩個名稱節點,「活躍( Active )」和「待命( Standby )」,兩種名稱節點的狀態同步,可以藉助於一個共享存儲系統來實現,一旦活躍名稱節點出現故障,就可以立即切換到待命名稱節點。
為了保證讀寫數據一致性,HDFS集群設計為只能有一個狀態為Active的NameNode,但這種設計存在單點故障問題,官方提供了兩種解決方案:
通過增加一個Secondary NameNode節點,處於Standby的狀態,與Active的NameNode同時運行。當Active的節點出現故障時,切換到Secondary節點。
為了保證Secondary節點能夠隨時頂替上去,Standby節點需要定時同步Active節點的事務日誌來更新本地的文件系統目錄樹信息,同時DataNode需要配置所有NameNode的位置,並向所有狀態的NameNode發送塊列表信息和心跳。
同步事務日誌來更新目錄樹由JournalNode的守護進程來完成,簡稱為QJM,一個NameNode對應一個QJM進程,當Active節點執行任何命名空間文件目錄樹修改時,它會將修改記錄持久化到大多數QJM中,Standby節點從QJM中監聽並讀取編輯事務日誌內容,並將編輯日誌應用到自己的命名空間。發生故障轉移時,Standby節點將確保在將自身提升為Active狀態之前,從QJM讀取所有編輯內容。
注意,QJM只是實現了數據的備份,當Active節點發送故障時,需要手工提升Standby節點為Active節點。如果要實現NameNode故障自動轉移,則需要配套ZKFC組件來實現,ZKFC也是獨立運行的一個守護進程,基於zookeeper來實現選舉和自動故障轉移。
雖然HDFS HA解決了「單點故障」問題,但是在系統擴展性、整體性能和隔離性方面仍然存在問題:
HDFS HA本質上還是單名稱節點。HDFS聯邦可以解決以上三個方面問題。
在HDFS聯邦中,設計了多個相互獨立的NN,使得HDFS的命名服務能夠水平擴展,這些NN分別進行各自命名空間和塊的管理,不需要彼此協調。每個DN要向集群中所有的NN注冊,並周期性的發送心跳信息和塊信息,報告自己的狀態。
HDFS聯邦擁有多個獨立的命名空間,其中,每一個命名空間管理屬於自己的一組塊,這些屬於同一個命名空間的塊組成一個「塊池」。每個DN會為多個塊池提供塊的存儲,塊池中的各個塊實際上是存儲在不同DN中的。
『叄』 hdfs工作流程
1. hdfs基本工作流程
1. hdfs初始化目錄結構
hdfs namenode -format 只是初始化了namenode的工作目錄
而datanode的工作目錄是在datanode啟動後自己初始化的
namenode在format初始化的時候會形成兩個標識:
blockPoolId:
clusterId:
新的datanode加入時,會獲取這兩個標識作為自己工作目錄中的標識
一旦namenode重新format後,namenode的身份標識已變,而datanode如果依然
持有原來的id,就不會被namenode識別
2. hdfs的工作機制
hdfs集群分為兩大角色:NameNode,DataNode (Secondary NameNode)
NameNode負責管理整個文件的元數據(命名空間信息,塊信息) 相當於Master
DataNode負責管理用戶的文件數據塊 相當於Salve
文件會按照固定的大小(block=128M)切成若干塊後分布式存儲在若干個datanode節點上
每一個文件塊有多個副本(默認是三個),存在不同的datanode上
DataNode會定期向NameNode匯報自身所保存的文件block信息,而namenode則會負責保持文件副本數量
hdfs的內部工作機制會對客戶的保持透明,客戶端請求方法hdfs都是通過向namenode申請來進行訪問
SecondaryNameNode有兩個作用,一是鏡像備份,二是日誌與鏡像的定期合並
3. hdfs寫入數據流程
1.客戶端要向hdfs寫入數據,首先要跟namenode通信以確認可以寫文件並獲得接收文件block的datanode,然後,客戶端按照順序將文件block逐個傳給相應datanode,並由接收到block的datanode負責向其他datanode復制block副本
4. 寫入數據步驟詳細解析
客戶端向namenode通信,請求上傳文件,namenode檢查目標文件是否已經存在,父目錄是否存在
namenode返回給客戶端,告知是否可以上傳
客戶端請求第一個block該傳輸到那些datanode伺服器上
namenode返回3個datanode伺服器abc
客戶端請求3台datanode的一台a上傳數據(本質上是一個rpc調用,建立pipeline),A收到請求後會繼續調用b,然後b調用c,將整個pipeline建立完成,逐級返回客戶端。
客戶端開始忘a上傳第一個block(先從磁碟讀取數據放入本地內存緩存),以packet為單位,a收到一個packet將會傳給b,b傳給c,a每傳一個packet會放入一個應答隊列等待應答
宕一個block傳輸完之後,客戶端再次請求namenode上傳第二個block的伺服器
『肆』 大數據技術Hadoop筆試題
大數據技術Hadoop筆試題
導讀:Hadoop有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬體上。以下是由我J.L為您整理推薦的面試筆試題目和經驗,歡迎參考閱讀。
單項選擇題
1. 下面哪個程序負責 HDFS 數據存儲。
a)NameNode
b)Jobtracker
c)Datanode
d)secondaryNameNode
e)tasktracker
2. HDfS 中的 block 默認保存幾份?
a)3 份
b)2 份
c)1 份
d)不確定
3. 下列哪個程序通常與 NameNode 在一個節點啟動?
a)SecondaryNameNode
b)DataNode
c)TaskTracker
d)Jobtracker
4. Hadoop 作者
a)Martin Fowler
b)Kent Beck
c)Doug cutting
5. HDFS 默認 Block Size
a)32MB
b)64MB
c)128MB
6. 下列哪項通常是集群的最主要瓶頸
a)CPU
b)網路
c)磁碟
d)內存
7. 關於 SecondaryNameNode 哪項是正確的?
a)它是 NameNode 的熱備
b)它對內存沒有要求
c)它的目的是幫助 NameNode 合並編輯日誌,減少 NameNode 啟動時間
d)SecondaryNameNode 應與 NameNode 部署到一個節點
多選題
8. 下列哪項可以作為集群的管理工具
a)Puppet
b)Pdsh
c)Cloudera Manager
d)d)Zookeeper
9. 配置機架感知的下面哪項正確
a)如果一個機架出問題,不會影響數據讀寫
b)寫入數據的時候會寫到不同機架的 DataNode 中
c)MapRece 會根據機架獲取離自己比較近的網路數據
10. Client 端上傳文件的時候下列哪項正確
a)數據經過 NameNode 傳遞給 DataNode
b)Client 端將文件切分為 Block,依次上傳
c)Client 只上傳數據到一台 DataNode,然後由 NameNode 負責 Block 復制工作
11. 下列哪個是 Hadoop 運行的模式
a)單機版
b)偽分布式
c)分布式
12. Cloudera 提供哪幾種安裝 CDH 的方法
a)Cloudera manager
b)Tar ball
c)Yum d)Rpm
判斷題
13. Ganglia 不僅可以進行監控,也可以進行告警。( )
14. Block Size 是不可以修改的。( )
15. Nagios 不可以監控 Hadoop 集群,因為它不提供 Hadoop 支持。( )
16. 如果 NameNode 意外終止,SecondaryNameNode 會接替它使集群繼續工作。( )
17. Cloudera CDH 是需要付費使用的。( )
18. Hadoop 是 Java 開發的,所以 MapRece 只支持 Java 語言編寫。( )
19. Hadoop 支持數據的隨機讀寫。( )
20. NameNode 負責管理 metadata,client 端每次讀寫請求,它都會從磁碟中讀取或則會寫入 metadata 信息並反饋 client 端。( )
21. NameNode 本地磁碟保存了 Block 的位置信息。( )
22. DataNode 通過長連接與 NameNode 保持通信。( )
23. Hadoop 自身具有嚴格的許可權管理和安全措施保障集群正常運行。( )
24. Slave 節點要存儲數據,所以它的磁碟越大越好。( )
25. hadoop dfsadmin –report 命令用於檢測 HDFS 損壞塊。( )
26. Hadoop 默認調度器策略為 FIFO( )
27. 集群內每個節點都應該配 RAID,這樣避免單磁碟損壞,影響整個節點運行。( )
28. 因為 HDFS 有多個副本,所以 NameNode 是不存在單點問題的。( )
29. 每個 map 槽就是一個線程。( )
30. Maprece 的 input split 就是一個 block。( )
31. NameNode 的 Web UI 埠是 50030,它通過 jetty 啟動的 Web 服務。( )
32. Hadoop 環境變數中的 HADOOP_HEAPSIZE 用於設置所有 Hadoop 守護線程的內存。它默認是 200 GB。( )
33. DataNode 首次加入 cluster 的時候,如果 log 中報告不兼容文件版本,那需要 NameNode執行“Hadoop namenode -format”操作格式化磁碟。( )
別走開,答案在後面哦!
1. 下面哪個程序負責 HDFS 數據存儲。答案C datanode
a)NameNode
b)Jobtracker
c)Datanode
d)secondaryNameNode
e)tasktracker
2. HDfS 中的 block 默認保存幾份? 答案A默認3分
a)3 份
b)2 份
c)1 份
d)不確定
3. 下列哪個程序通常與 NameNode 在一個節點啟動?答案D
a)SecondaryNameNode
b)DataNode
c)TaskTracker
d)Jobtracker
此題分析:
hadoop的集群是基於master/slave模式,namenode和jobtracker屬於master,datanode和 tasktracker屬於slave,master只有一個,而slave有多個SecondaryNameNode內存需求和NameNode在一個數量級上,所以通常secondary NameNode(運行在單獨的物理機器上)和NameNode運行在不同的機器上。
JobTracker和TaskTracker
JobTracker 對應於 NameNode
TaskTracker 對應於 DataNode
DataNode 和NameNode 是針對數據存放來而言的
JobTracker和TaskTracker是對於MapRece執行而言的
maprece中幾個主要概念,maprece整體上可以分為這么幾條執行線索:obclient,JobTracker與TaskTracker。
1、JobClient會在用戶端通過JobClient類將應用已經配置參數打包成jar文件存儲到hdfs,並把路徑提交到Jobtracker, 然後由JobTracker創建每一個Task(即MapTask和ReceTask)並將它們分發到各個TaskTracker服務中去執行。
2、JobTracker是一個master服務,軟體啟動之後JobTracker接收Job,負責調度Job的每一個子任務task運行於 TaskTracker上,並監控它們,如果發現有失敗的task就重新運行它。一般情況應該把JobTracker部署在單獨的機器上。
3、TaskTracker是運行在多個節點上的slaver服務。TaskTracker主動與JobTracker通信,接收作業,並負責直接執行每一個任務。TaskTracker都需要運行在HDFS的DataNode上。
4. Hadoop 作者 答案C Doug cutting
a)Martin Fowler
b)Kent Beck
c)Doug cutting
5. HDFS 默認 Block Size 答案:B
a)32MB
b)64MB
c)128MB
(因為版本更換較快,這里答案只供參考)
6. 下列哪項通常是集群的最主要瓶頸:答案:C磁碟
a)CPU
b)網路
c)磁碟IO
d)內存
該題解析:
首先集群的目的是為了節省成本,用廉價的pc機,取代小型機及大型機。小型機和大型機有什麼特點?
1.cpu處理能力強
2.內存夠大
所以集群的瓶頸不可能是a和d
3.網路是一種稀缺資源,但是並不是瓶頸。
4.由於大數據面臨海量數據,讀寫數據都需要io,然後還要冗餘數據,hadoop一般備3份數據,所以IO就會打折扣。
7. 關於 SecondaryNameNode 哪項是正確的?答案C
a)它是 NameNode 的熱備
b)它對內存沒有要求
c)它的目的是幫助 NameNode 合並編輯日誌,減少 NameNode 啟動時間
d)SecondaryNameNode 應與 NameNode 部署到一個節點。
多選題:
8. 下列哪項可以作為集群的管理?答案:ABD
a)Puppet
b)Pdsh
c)Cloudera Manager
d)Zookeeper
9. 配置機架感知的下面哪項正確:答案ABC
a)如果一個機架出問題,不會影響數據讀寫
b)寫入數據的時候會寫到不同機架的 DataNode 中
c)MapRece 會根據機架獲取離自己比較近的網路數據
10. Client 端上傳文件的時候下列哪項正確?答案B
a)數據經過 NameNode 傳遞給 DataNode
b)Client 端將文件切分為 Block,依次上傳
c)Client 只上傳數據到一台 DataNode,然後由 NameNode 負責 Block 復制工作
該題分析:
Client向NameNode發起文件寫入的請求。
NameNode根據文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。
Client將文件劃分為多個Block,根據DataNode的地址信息,按順序寫入到每一個DataNode塊中。
11. 下列哪個是 Hadoop 運行的模式:答案ABC
a)單機版
b)偽分布式
c)分布式
12. Cloudera 提供哪幾種安裝 CDH 的方法?答案:ABCD
a)Cloudera manager
b)Tarball
c)Yum
d)Rpm
判斷題:
13. Ganglia 不僅可以進行監控,也可以進行告警。( 正確)
分析:此題的目的是考Ganglia的'了解。嚴格意義上來講是正確。ganglia作為一款最常用的Linux環境中的監控軟體,它擅長的的是從節點中按照用戶的需求以較低的代價採集數據。但是ganglia在預警以及發生事件後通知用戶上並不擅長。最新的ganglia已經有了部分這方面的功能。但是更擅長做警告的還有Nagios。Nagios,就是一款精於預警、通知的軟體。通過將Ganglia和Nagios組合起來,把Ganglia採集的數據作為Nagios的數據源,然後利用Nagios來發送預警通知,可以完美的實現一整套監控管理的系統。
14. Block Size 是不可以修改的。(錯誤 )
分析:它是可以被修改的Hadoop的基礎配置文件是hadoop-default.xml,默認建立一個Job的時候會建立Job的Config,Config首先讀入hadoop-default.xml的配置,然後再讀入hadoop- site.xml的配置(這個文件初始的時候配置為空),hadoop-site.xml中主要配置需要覆蓋的hadoop-default.xml的系統級配置。
15. Nagios 不可以監控 Hadoop 集群,因為它不提供 Hadoop 支持。(錯誤 )
分析:Nagios是集群監控工具,而且是雲計算三大利器之一
16. 如果 NameNode 意外終止,SecondaryNameNode 會接替它使集群繼續工作。(錯誤 )
分析:SecondaryNameNode是幫助恢復,而不是替代,如何恢復,可以查看
17. Cloudera CDH 是需要付費使用的。(錯誤 )
分析:第一套付費產品是Cloudera Enterpris,Cloudera Enterprise在美國加州舉行的 Hadoop 大會 (Hadoop Summit) 上公開,以若干私有管理、監控、運作工具加強 Hadoop 的功能。收費採取合約訂購方式,價格隨用的 Hadoop 叢集大小變動。
18. Hadoop 是 Java 開發的,所以 MapRece 只支持 Java 語言編寫。(錯誤 )
分析:rhadoop是用R語言開發的,MapRece是一個框架,可以理解是一種思想,可以使用其他語言開發。
19. Hadoop 支持數據的隨機讀寫。(錯 )
分析:lucene是支持隨機讀寫的,而hdfs只支持隨機讀。但是HBase可以來補救。HBase提供隨機讀寫,來解決Hadoop不能處理的問題。HBase自底層設計開始即聚焦於各種可伸縮性問題:表可以很“高”,有數十億個數據行;也可以很“寬”,有數百萬個列;水平分區並在上千個普通商用機節點上自動復制。表的模式是物理存儲的直接反映,使系統有可能提高高效的數據結構的序列化、存儲和檢索。
20. NameNode 負責管理 metadata,client 端每次讀寫請求,它都會從磁碟中讀取或則會寫入 metadata 信息並反饋 client 端。(錯誤)
此題分析:
NameNode 不需要從磁碟讀取 metadata,所有數據都在內存中,硬碟上的只是序列化的結果,只有每次 namenode 啟動的時候才會讀取。
1)文件寫入
Client向NameNode發起文件寫入的請求。
NameNode根據文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。
Client將文件劃分為多個Block,根據DataNode的地址信息,按順序寫入到每一個DataNode塊中。
2)文件讀取
Client向NameNode發起文件讀取的請求。
21. NameNode 本地磁碟保存了 Block 的位置信息。( 個人認為正確,歡迎提出其它意見)
分析:DataNode是文件存儲的基本單元,它將Block存儲在本地文件系統中,保存了Block的Meta-data,同時周期性地將所有存在的Block信息發送給NameNode。NameNode返迴文件存儲的DataNode的信息。
Client讀取文件信息。
22. DataNode 通過長連接與 NameNode 保持通信。( )
這個有分歧:具體正在找這方面的有利資料。下面提供資料可參考。
首先明確一下概念:
(1).長連接
Client方與Server方先建立通訊連接,連接建立後不斷開,然後再進行報文發送和接收。這種方式下由於通訊連接一直存在,此種方式常用於點對點通訊。
(2).短連接
Client方與Server每進行一次報文收發交易時才進行通訊連接,交易完畢後立即斷開連接。此種方式常用於一點對多點通訊,比如多個Client連接一個Server.
23. Hadoop 自身具有嚴格的許可權管理和安全措施保障集群正常運行。(錯誤 )
hadoop只能阻止好人犯錯,但是不能阻止壞人干壞事
24. Slave 節點要存儲數據,所以它的磁碟越大越好。( 錯誤)
分析:一旦Slave節點宕機,數據恢復是一個難題
25. hadoop dfsadmin –report 命令用於檢測 HDFS 損壞塊。(錯誤 )
26. Hadoop 默認調度器策略為 FIFO(正確 )
27. 集群內每個節點都應該配 RAID,這樣避免單磁碟損壞,影響整個節點運行。(錯誤 )
分析:首先明白什麼是RAID,可以參考網路磁碟陣列。這句話錯誤的地方在於太絕對,具體情況具體分析。題目不是重點,知識才是最重要的。因為hadoop本身就具有冗餘能力,所以如果不是很嚴格不需要都配備RAID。具體參考第二題。
28. 因為 HDFS 有多個副本,所以 NameNode 是不存在單點問題的。(錯誤 )
29. 每個 map 槽就是一個線程。(錯誤 )
分析:首先我們知道什麼是map 槽,map 槽->map slotmap slot 只是一個邏輯值 ( org.apache.hadoop.mapred.TaskTracker.TaskLauncher.numFreeSlots ),而不是對應著一個線程或者進程
30. Maprece 的 input split 就是一個 block。(錯誤 )
31. NameNode 的 Web UI 埠是 50030,它通過 jetty 啟動的 Web 服務。(錯誤 )
32. Hadoop 環境變數中的 HADOOP_HEAPSIZE 用於設置所有 Hadoop 守護線程的內存。它默認是 200 GB。( 錯誤)
hadoop為各個守護進程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)統一分配的內存在hadoop-env.sh中設置,參數為HADOOP_HEAPSIZE,默認為1000M。
33. DataNode 首次加入 cluster 的時候,如果 log 中報告不兼容文件版本,那需要 NameNode執行“Hadoop namenode -format”操作格式化磁碟。(錯誤 )
分析:
首先明白介紹,什麼ClusterID
ClusterID
添加了一個新的標識符ClusterID用於標識集群中所有的節點。當格式化一個Namenode,需要提供這個標識符或者自動生成。這個ID可以被用來格式化加入集群的其他Namenode。
二次整理
有的同學問題的重點不是上面分析內容:內容如下:
這個報錯是說明 DataNode 所裝的Hadoop版本和其它節點不一致,應該檢查DataNode的Hadoop版本
;『伍』 HDFS 系統架構
HDFS Architecture
Hadoop Distributed File System (HDFS) 是設計可以運行於普通商業硬體上的分布式文件系統。它跟現有的分布式文件系統有很多相通的地方,但是區別也是顯著的。HDFS具有高度容錯性能,被設計運行於低成本硬體上。HDFS可以向應用提供高吞吐帶寬,適合於大數據應用。HDFS 放寬了一些 POSIX 的要求,以開啟對文件系統數據的流式訪問。HDFS 最初是作為Apache Nutch web 搜索引擎項目的基礎設施開發的。HDFS 現在是 Apache Hadoop 核心項目的一部分。
HDFS是主從架構。一個HDFS集群包含一個NameNode,一個管理文件系統命名空間和控制客戶端訪問文件的master server。以及,若乾的 DataNodes,通常集群的每個node一個,管理運行DataNode的節點上的存儲。HDFS 發布一個文件系統命名空間,並允許用戶數據已文件的形式存儲在上面。內部,一個文件被分成一個或多個塊,存儲在一組DataNodes上。NameNode 執行文件系統命名空間操作,比如:打開、關閉、重命名文件或目錄。它還確定塊到DataNodes的映射。DataNodes 負責向文件系統客戶端提供讀寫服務。DataNodes 根據 NameNode 的指令執行塊的創建、刪除以及復制。
NameNode 和 DataNode 是設計運行於普通商業機器的軟體。這些機器通常運行 GNU/Linux 操作系統。HDFS 是Java 語言編寫的;任何支持Java的機器都可以運行NameNode or DataNode 軟體。使用高移植性Java語言,意味著HDFS可以部署在很大范圍的機器上。一個典型的部署就是一台特定的機器只運行NameNode 軟體,而集群內的其他機器運行DataNode 軟體的一個實例。這種架構不排除一台機器上運行多個DataNodes ,但是在實際部署中很少見。
單 NameNode 節點的存在大大簡化了架構。NameNode 是所有HDFS 元數據的仲裁和倉庫。系統設計上,用戶數據永遠不經過NameNode。
HDFS 支持傳統的文件分級組織。用戶或應用可以創建目錄,並在目錄內存儲文件。 文件系統命名空間的層次結構跟其他文件系統類似;可以創建、刪除、移動、重命名文件。HDFS 支持 user quotas 和 access permissions 。 HDFS 不支持軟、硬鏈接。但是,HDFS 架構不排除實現這些功能。
雖然HDFS遵守 文件系統命名約定 ,一些路徑和名稱 (比如/.reserved 和.snapshot ) 保留了。比如功能 transparent encryption 和 snapshot 就使用的保留路徑。
NameNode 維護文件系統命名空間。任何文件系統命名空間或屬性的變化,都會被NameNode記錄。 應用可以指定HDFS應維護的文件副本數量。文件副本的數量被稱為該文件的復制因子 replication factor 。該信息存儲於NameNode。
HDFS 被設計用於在一個大規模集群上跨機器可靠地存儲巨大的文件。它以一序列的塊的方式存儲文件。每個文件都可以配置塊尺寸和復制因子。
一個文件除了最後一個塊外,其他的塊一樣大。在 append 和 hsync 添加了可變長度塊的支持後,用戶可以啟動一個新的塊,而不用填充最後一個塊到配置的塊大小。
應用可以指定一個文件的副本數量。復制因子可以在創建的時候指定,也可以以後更改。HDFS的文件只寫一次(除了 appends 和 truncates) ,並在任何時候只允許一個 writer 。
NameNode 指定塊復制的所有決策。它周期性的從集群的每個DataNodes 接受 Heartbeat 和 Blockreport。Heartbeat 的接受代表 DataNode 工作正常。Blockreport 包含了DataNode上所有塊的清單。
副本的位置對HDFS的可靠性和性能至關重要。副本位置的優化是HDFS和其他大多數分布式文件系統的區別。這是一個需要大量調優和經驗的特性。Rack-aware 復制策略的目的就是提高數據可靠性,可用性和網路帶寬利用率。當前副本位置策略的實現是這個方向的第一步。實施該策略的短期目標是在生產環境驗證它,了解其更多的行為,為測試和研究更復雜的策略打下基礎。
大型HDFS實例運行在跨多個Rack的集群伺服器上。不同rack的兩個node通信需要通過交換機。大多數情況下,同一rack內的帶寬大於rack之間的帶寬。
NameNode 通過在 Hadoop Rack Awareness 內的進程描述 判斷DataNode 屬於哪個rack id。一個簡單但是並非最佳的策略是將副本分布於不同的racks。這可以防止整個機架發生故障時丟失數據,並允許在讀取數據時使用多個機架的帶寬。該策略在群集中均勻地分布副本,使得組件故障時很容易平衡負載。 但是,該策略會增加寫入成本,因為寫入操作需要將塊傳輸到多個機架。
一般,復制因子設置為3, HDFS 的分布策略是:如果writer在datanode上則將一個副本放到本地機器, 如果writer不在datanode上則將一個副本放到writer所在機櫃的隨機datanode 上;另一個副本位於不同機架的node上;最後一個副本位於同一遠程機架的不同node上。 該策略減少了機架間的寫流量,提升了寫性能。機架故障的概率遠小於節點故障的概率;此策略不會影響數據可靠性和可用性承諾。但是,在讀取數據時,它確實減少了聚合帶寬,因為塊存儲於兩個機櫃而不是三個機櫃內。使用此策略,副本不會均勻的分布於機架上。1/3 副本 位於同一節點, 2/3 副本位於同一機架, 另1/3副本位於其他機架。該策略提升了寫性能而不影響數據可靠性和讀性能。
如果復制因子大於3,那麼第4個及以後的副本則隨機放置,只要滿足每個機架的副本在(replicas - 1) / racks + 2)之下。
因為 NameNode 不允許 DataNodes 擁有同一個塊的多個副本,所以副本的最大數就是DataNodes的數量。
在把對 存儲類型和存儲策略 的支持添加到 HDFS 後,除了上面介紹的rack awareness外, NameNode 會考慮其他副本排布的策略。NameNode 先基於rack awareness 選擇節點,然後檢查候選節點有文件關聯的策略需要的存儲空間。 如果候選節點沒有該存儲類型, NameNode 會查找其他節點。如果在第一條路徑中找不到足夠的節點來放置副本,NameNode會在第二條路徑中查找具有回滾存儲類型的節點。 、
當前,這里描述的默認副本排布策略正在使用中。
為了最小化全局帶寬消耗和讀取延遲, HDFS 會嘗試從最靠近reader的副本響應讀取請求。如果在reader節點的同一機架上上存在副本,則該副本有限響應讀請求。如果HDFS集群跨多個數據中心,則本地數據中心優先。
啟動時,NameNode 會進入一個稱為 Safemode 的特殊狀態。當NameNode處於Safemode狀態時,不會復制數據塊。NameNode從DataNodes接收Heartbeat和Blockreport消息。Blockreport包含DataNode託管的數據塊列表。每個塊都指定了最小副本數。當數據塊的最小副本數已與NameNode簽入時,該塊被認為是安全復制的。在NameNode簽入安全復制數據塊的已配置百分比(加上額外的30秒)後,NameNode退出Safemode狀態。然後,它判斷列表內的數據塊清單是否少於副本指定的數量。NameNode 然後復制這些塊給其他 DataNodes。
HDFS 命名空間由 NameNode 存儲。NameNode 使用事務日誌 EditLog 來持久化的保存系統元數據的每次變更。比如,在HDFS創建一個新文件,NameNode會在 EditLog 插入一條記錄來指示該變更。類似的,變更文件的復制因子也會在 EditLog 插入一條新記錄。NameNode 以文件的形式,將 EditLog 保存在本地OS文件系統上。整個文件系統命名空間,包括塊到文件的映射、文件系統屬性,都存儲於名字為 FsImage 的文件內。 FsImage 也以文件的形式,存儲在NameNode的本地文件系統上。
NameNode 將包含整個文件系統和塊映射的image保存在內存中。當NameNode啟動時,或檢查點被預先定義的閾值觸發時,它會從磁碟讀取 FsImage 和 EditLog ,把 EditLog 內的事物應用到內存中的FsImage,再將新版本刷新回磁碟的新 FsImage 。然後會截斷舊的 EditLog ,因為它的事物已經應用到了持久化的 FsImage 上。 這個過程稱為檢查點 checkpoint 。檢查點的目的是通過對文件系統元數據進行快照並保存到FsImage,來確保HDFS擁有文件系統元數據的一致性視圖。盡管讀取 FsImage 是高效的,但是對 FsImage 直接增量修改是不高效的。不是對每次編輯修改 FsImage ,而是將每次編輯保存到 Editlog 。在檢查點期間,將 Editlog 的變更應用到 FsImage 。一個檢查點可以在固定周期(dfs.namenode.checkpoint.period)(以秒為單位)觸發,也可以文件系統事物數量達到某個值(dfs.namenode.checkpoint.txns)的時候觸發。
DataNode 在本地文件系統上以文件的形式存儲 HDFS data 。DataNode 不知道 HDFS 文件。它將HDFS data 的每個塊以獨立的文件存儲於本地文件系統上。DataNode 不在同一目錄創建所有的文件。而是,使用heuristic來確定每個目錄的最佳文件數量,並適當的創建子目錄。在一個目錄創建所有的本地文件是不好的,因為本地文件系統可能不支持單目錄的海量文件數量。當DataNode啟動的時候,它掃描本地文件系統,生成與本地文件系統一一對應的HDFS數據塊列表,然後報告給NameNode。這個報告稱為 Blockreport。
所有的HDFS通信協議都在TCP/IP協議棧上。客戶端與NameNode指定的埠建立連接。與NameNode以ClientProtocol 通信。DataNodes與NameNode以DataNode Protocol進行通信。遠程過程調用(RPC)封裝了Client Protocol 和 DataNode Protocol。設計上,NameNode從不啟動任何RPCs。相反,它只應答DataNodes or clients發出的RPC請求。
HDFS的主要目標是可靠的存儲數據,即使是在故障的情況下。常見故障類型有三種: NameNode failures , DataNode failures 和 network partitions 。
每個DataNode都周期性的向NameNode發送心跳信息。 一個 network partition 可能導致DataNodes子集丟失與NameNode的連接。NameNode會基於心跳信息的缺失來偵測這種情況。NameNode將沒有心跳信息的DataNodes標記為 dead ,並不再轉發任何IO請求給它們。任何注冊到dead DataNode的數據對HDFS將不再可用。DataNode death會導致某些塊的復制因子低於它們指定的值。NameNode不斷跟蹤需要復制的塊,並在必要時啟動復制。很多因素會導致重新復制:DataNode不可用,副本損壞,DataNode上硬碟故障,復制因子增加。
標記 DataNodes dead 的超時時間保守地設置了較長時間 (默認超過10分鍾) 以避免DataNodes狀態抖動引起的復制風暴。對於性能敏感的應用,用戶可以設置較短的周期來標記DataNodes為過期,讀寫時避免過期節點。
HDFS 架構支持數據再平衡schemes。如果一個DataNode的空餘磁碟空間低於閾值,sheme就會將數據從一個DataNode 移動到另外一個。在某些文件需求突然增長的情況下,sheme可能會在集群內動態的創建額外的副本,並再平衡其他數據。這些類型的數據再平衡schemes還沒有實現。
有可能從DataNode獲取的數據塊,到達的時候損壞了。這種損壞可能是由於存儲設備故障、網路故障、軟體bug。HDFS客戶端軟體會HDFS的內容進行校驗。當客戶端創建HDFS文件的時候,它計算文件每個塊的校驗值,並以獨立的隱藏文件存儲在同一HDFS命名空間內。當客戶端檢索文件時候,它會校驗從每個DataNode獲取的數據,是否與關聯校驗文件內的校驗值匹配。 如果不匹配,客戶端可以從另外擁有副本塊的DataNode檢索。
FsImage 和 EditLog 是HDFS的核心數據結構。這些文件的損壞將導致HDFS實例異常。 因此,NameNode可以配置為支持多 FsImage 和 EditLog 副本模式。任何對 FsImage or EditLog 的更新都會導致每個 FsImages 和 EditLogs 的同步更新。 FsImage 和 EditLog 的同步更新會導致降低命名空間每秒的事物效率。但是,這種降級是可以接受的,因為HDFS應用是數據密集型,而不是元數據密集型。當NameNode重啟的時候,它會選擇最新的一致的 FsImage 和 EditLog 。
另外一種提供故障恢復能力的辦法是多NameNodes 開啟HA,以 shared storage on NFS or distributed edit log (called Journal)的方式。推薦後者。
Snapshots - 快照,支持在特定時刻存儲數據的副本。快照功能的一個用法,可以回滾一個故障的HDFS實例到已知工作良好的時候。
HDFS被設計與支持超大的文件。與HDFS適配的軟體都是處理大數據的。這些應用都只寫一次,但是它們會讀取一或多次,並且需要滿足流式讀速度。HDFS支持文件的 一次寫入-多次讀取 語義。 HDFS典型的塊大小是128 MB.。因此,HDFS文件被分割為128 MB的塊,可能的話每個塊都位於不同的DataNode上。
當客戶端以復制因子3寫入HDFS文件時,NameNode以 復制目標選擇演算法 replication target choosing algorithm 檢索DataNodes 列表。該列表包含了承載該數據塊副本的DataNodes清單。然後客戶端寫入到第一個DataNode。第一DataNode逐步接受數據的一部分,將每一部分內容寫入到本地倉庫,並將該部分數據傳輸給清單上的第二DataNode。第二DataNode,按順序接受數據塊的每個部分,寫入到倉庫,然後將該部分數據刷新到第三DataNode。最終,第三DataNode將數據寫入到其本地倉庫。
因此,DataNode從管道的前一個DataNode獲取數據,同時轉發到管道的後一個DataNode。因此,數據是以管道的方式從一個DataNode傳輸到下一個的。
應用訪問HDFS有很多方式。原生的,HDFS 提供了 FileSystem Java API 來給應用調用。還提供了 C language wrapper for this Java API 和 REST API 。另外,還支持HTTP瀏覽器查看HDFS實例的文件。 通過使用 NFS gateway ,HDFS還可以掛載到客戶端作為本地文件系統的一部分。
HDFS的用戶數據是以文件和目錄的形式組織的。它提供了一個命令行介面 FS shell 來提供用戶交互。命令的語法類似於其他shell (比如:bash, csh)。如下是一些範例:
FS shell 的目標是向依賴於腳本語言的應用提供與存儲數據的交互。
DFSAdmin 命令用於管理HDFS集群。這些命令僅給HDFS管理員使用。如下範例:
如果啟用了回收站配置,那麼文件被 FS Shell 移除時並不會立即從HDFS刪除。HDFS會將其移動到回收站目錄(每個用戶都有回收站,位於 /user/<username>/.Trash )。只要文件還在回收站內,就可以快速恢復。
最近刪除的文件大多數被移動到 current 回收站目錄 ( /user/<username>/.Trash/Current ),在配置周期內,HDFS給 current目錄內的文件創建檢查點 checkpoints (位於 /user/<username>/.Trash/<date> ) ,並刪除舊的檢查點。參考 expunge command of FS shell 獲取更多關於回收站檢查點的信息。
在回收站過期後,NameNode從HDFS命名空間刪除文件。刪除文件會將文件關聯的塊釋放。注意,在用戶刪除文件和HDFS增加free空間之間,會有一個明顯的延遲。
如下範例展示了FS Shell如何刪除文件。我們在delete目錄下創建兩個文件(test1 & test2)
我們刪除文件 test1。如下命令顯示文件被移動到回收站。
現在我們嘗試以skipTrash參數刪除文件,該參數將不將文件發送到回收站。文件將會從HDFS完全刪除。
我們檢查回收站,只有文件test1。
如上,文件test1進了回收站,文件test2被永久刪除了。
當縮減文件的復制因子時,NameNode選擇可以被刪除的多餘副本。下一個Heartbeat會通報此信息給DataNode。DataNode然後會刪除響應的塊,相應的剩餘空間會顯示在集群內。同樣,在setReplication API調用完成和剩餘空間在集群顯示之間會有一個時間延遲。
Hadoop JavaDoc API .
HDFS source code: http://hadoop.apache.org/version_control.html
『陸』 下面哪個程序負責hdfs數據存儲
存放到HDFS 一般都是要分析的數據。分析完成的數據直接存儲到MYSQL 或者ORACLE 中。這種處理方式是離線處理。如日誌文件存儲到hdfs 分析出網站的流量 UV PV 等等。一般都是用pig hive 和mr 等進行分析的。 存放到HBASE 一般都是數據拿過來直接用...