網(wǎng)站建設(shè)詢價文件無錫營銷型網(wǎng)站制作
一、Hadoop HDFS的架構(gòu)
HDFS:Hadoop Distributed File System,分布式文件系統(tǒng)
1,NameNode
- 存儲文件的metadata,運行時所有數(shù)據(jù)都保存到內(nèi)存,整個HDFS可存儲的文件數(shù)受限于NameNode的內(nèi)存大小
- 一個Block在NameNode中對應(yīng)一條記錄(一般一個block占用150字節(jié)),如果是大量的小文件,會消耗大量內(nèi)存。同時map task的數(shù)量是由splits來決定的,所以用MapReduce處理大量的小文件時,就會產(chǎn)生過多的map task,線程管理開銷將會增加作業(yè)時間。處理大量小文件的速度遠遠小于處理同等大小的大文件的速度。因此Hadoop建議存儲大文件
- 數(shù)據(jù)會定時保存到本地磁盤,但不保存block的位置信息,而是由DataNode注冊時上報和運行時維護(NameNode中與DataNode相關(guān)的信息并不保存到NameNode的文件系統(tǒng)中,而是NameNode每次重啟后,動態(tài)重建)
- NameNode失效則整個HDFS都失效了,所以要保證NameNode的可用性
2,Secondary NameNode
定時與NameNode進行同步(定期合并文件系統(tǒng)鏡像和編輯日志,然后把合并后的傳給NameNode,替換其鏡像,并清空編輯日志,類似于CheckPoint機制),但NameNode失效后仍需要手工將其設(shè)置成主機.
3,DataNode
- 保存具體的block數(shù)據(jù)
- 負責(zé)數(shù)據(jù)的讀寫操作和復(fù)制操作
- DataNode啟動時會向NameNode報告當(dāng)前存儲的數(shù)據(jù)塊信息,后續(xù)也會定時報告修改信息
- DataNode之間會進行通信,復(fù)制數(shù)據(jù)塊,保證數(shù)據(jù)的冗余性
4,Block數(shù)據(jù)塊
- 基本存儲單位,一般大小為64M(配置大的塊主要是因為:
1)減少搜尋時間,一般硬盤傳輸速率比尋道時間要快,大的塊可以減少尋道時間;
2)減少管理塊的數(shù)據(jù)開銷,每個塊都需要在NameNode上有對應(yīng)的記錄;
3)對數(shù)據(jù)塊進行讀寫,減少建立網(wǎng)絡(luò)的連接成本) - 一個大文件會被拆分成一個個的塊,然后存儲于不同的機器。如果一個文件少于Block大小,那么實際占用的空間為其文件的大小
- 基本的讀寫單位,類似于磁盤的頁,每次都是讀寫一個塊
- 每個塊都會被復(fù)制到多臺機器,默認復(fù)制3份
- HDFS2.x以后的block默認128M
二、Hadoop 讀文件
1,客戶端向NameNode發(fā)送讀取請求
2,NameNode返回文件的所有block和這些block所在的DataNodes(包括復(fù)制節(jié)點)
3,客戶端直接從DataNode中讀取數(shù)據(jù),如果該DataNode讀取失敗(DataNode失效或校驗碼不對),則從復(fù)制節(jié)點中讀取(如果讀取的數(shù)據(jù)就在本機,則直接讀取,否則通過網(wǎng)絡(luò)讀取)
三、Hadoop 寫文件
1,客戶端將文件寫入本地磁盤的 HDFS Client 文件中
2,當(dāng)臨時文件大小達到一個 block 大小時,HDFS client 通知 NameNode,申請寫入文件
3,NameNode 在 HDFS 的文件系統(tǒng)中創(chuàng)建一個文件,并把該 block id 和要寫入的 DataNode 的列表返回給客戶端
4,客戶端收到這些信息后,將臨時文件寫入 DataNodes
(1) 客戶端將文件內(nèi)容寫入第一個 DataNode(一般以 4kb 為單位進行傳輸)
(2) 第一個 DataNode 接收后,將數(shù)據(jù)寫入本地磁盤,同時也傳輸給第二個 DataNode
(3)依此類推到最后一個 DataNode,數(shù)據(jù)在 DataNode 之間是通過 pipeline 的方式進行復(fù)制的
(4)后面的 DataNode 接收完數(shù)據(jù)后,都會發(fā)送一個確認給前一個 DataNode,最終第一個 DataNode 返回確認給客戶端
(5)當(dāng)客戶端接收到整個 block 的確認后,會向 NameNode 發(fā)送一個最終的確認信息
(6)如果寫入某個 DataNode 失敗,數(shù)據(jù)會繼續(xù)寫入其他的 DataNode。然后 NameNode 會找另外一個好的 DataNode 繼續(xù)復(fù)制,以保證冗余性
(6) 每個 block 都會有一個校驗碼,并存放到獨立的文件中,以便讀的時候來驗證其完整性
5,文件寫完后(客戶端關(guān)閉),NameNode 提交文件(這時文件才可見,如果提交前,NameNode 垮掉,那文件也就丟失了。只保證數(shù)據(jù)的信息寫到 NameNode 上,但并不保證數(shù)據(jù)已經(jīng)被寫到DataNode 中)