1. 程式人生 > >[Hadoop]Hadoop章2 HDFS原理及讀寫過程

[Hadoop]Hadoop章2 HDFS原理及讀寫過程

client 第一個 fsimage slave lin 需要 流程 結構 容錯

HDFS(Hadoop Distributed File System )Hadoop分布式文件系統。

HDFS有很多特點

保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復。默認存3份。

運行在廉價的機器上。

適合大數據的處理。多大?多小?HDFS默認會將文件分割成block,64M為1個block。然後將block按鍵值對存儲在HDFS上,並將鍵值對的映射存到內存中。如果小文件太多,那內存的負擔會很重。

技術分享圖片

如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。

NameNode:是Master節點,是大領導。管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;

SecondaryNameNode:是一個小弟,分擔大哥namenode的工作量;是NameNode的冷備份;合並fsimage和fsedits然後再發給namenode。

DataNode:Slave節點,奴隸,幹活的。負責存儲client發來的數據塊block;執行數據塊的讀寫操作。

熱備份:b是a的熱備份,如果a壞掉。那麽b馬上運行代替a的工作。

冷備份:b是a的冷備份,如果a壞掉。那麽b不能馬上代替a工作。但是b上存儲a的一些信息,減少a壞掉之後的損失。

fsimage:元數據鏡像文件(文件系統的目錄樹。)

edits:元數據的操作日誌(針對文件系統做的修改操作記錄)

namenode內存中存儲的是=fsimage+edits。

SecondaryNameNode負責定時默認1小時,從namenode上,獲取fsimage和edits來進行合並,然後再發送給namenode。減少namenode的工作量。

工作原理

寫操作:

有一個文件FileA,100M大小。Client將FileA寫入到HDFS上。

HDFS按默認配置。

HDFS分布在三個機架上Rack1,Rack2,Rack3。

a. Client將FileA按64M分塊。分成兩塊,block1和Block2;

b. Client向nameNode發送寫數據請求

c. NameNode節點,記錄block信息。並返回可用的DataNode

Block1: host2,host1,host3

Block2: host7,host8,host4

原理:

NameNode具有RackAware機架感知功能,這個可以配置。

若client為DataNode節點,那存儲block時,規則為:副本1,同client的節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。

若client不為DataNode節點,那存儲block時,規則為:副本1,隨機選擇一個節點上;副本2,不同副本1,機架上;副本3,同副本2相同的另一個節點上;其他副本隨機挑選。

d. client向DataNode發送block1;發送過程是以流式寫入。

流式寫入過程,

1>將64M的block1按64k的package劃分;

2>然後將第一個package發送給host2;

3>host2接收完後,將第一個package發送給host1,同時client想host2發送第二個package;

4>host1接收完第一個package後,發送給host3,同時接收host2發來的第二個package。

5>以此類推,直到將block1發送完畢。

6>host2,host1,host3向NameNode,host2向Client發送通知,說“消息發送完了”。

7>client收到host2發來的消息後,向namenode發送消息,說我寫完了。這樣就真完成了

8>發送完block1後,再向host7,host8,host4發送block2,

9>發送完block2後,host7,host8,host4向NameNode,host7向Client發送通知

10>client向NameNode發送消息,說我寫完了,這樣就完畢了。

分析,通過寫過程,我們可以了解到:

寫1T文件,我們需要3T的存儲,3T的網絡流量。

在執行讀或寫的過程中,NameNode和DataNode通過HeartBeat進行保存通信,確定DataNode活著。如果發現DataNode死掉了,就將死掉的DataNode上的數據,放到其他節點去。讀取時,要讀其他節點去。

掛掉一個節點,沒關系,還有其他節點可以備份;甚至,掛掉某一個機架,也沒關系;其他機架上,也有備份。

讀操作:

讀操作就簡單一些了,client要從datanode上,讀取FileA。而FileA由block1和block2組成。

那麽,讀操作流程為:

a. client向namenode發送讀請求。

b. namenode查看Metadata信息,返回fileA的block的位置。

block1:host2,host1,host3

block2:host7,host8,host4

c. block的位置是有先後順序的,先讀block1,再讀block2。而且block1去host2上讀取;然後block2,去host7上讀取;

如果client位於機架內某個DataNode上,遵循的規律是:優選讀取本機架上的數據

HDFS中常用到的命令

1、hadoop fs

1 2 3 4 5 6 7 8 9 10 11 12 13 hadoop fs -ls / hadoop fs -lsr hadoop fs -mkdir /user/hadoop hadoop fs -put a.txt /user/hadoop/ hadoop fs -get /user/hadoop/a.txt / hadoop fs -cp src dst hadoop fs -mv src dst hadoop fs -cat /user/hadoop/a.txt hadoop fs -rm /user/hadoop/a.txt hadoop fs -rmr /user/hadoop/a.txt hadoop fs -text /user/hadoop/a.txt hadoop fs -copyFromLocal localsrc dst 與hadoop fs -put功能類似。 hadoop fs -moveFromLocal localsrc dst 將本地文件上傳到hdfs,同時刪除本地文件。

2、hadoop fsadmin

1 2 3 hadoop dfsadmin -report hadoop dfsadmin -safemode enter | leave | get | wait hadoop dfsadmin -setBalancerBandwidth 1000

3、hadoop fsck

4、start-balancer.sh

[Hadoop]Hadoop章2 HDFS原理及讀寫過程