HDFS设计思想
HDFS設計思想
DataNode:用來在磁盤上存儲數(shù)據(jù)
HDFS? 數(shù)據(jù)存儲單元( block )
1 文件被切分成固定大小的數(shù)據(jù)block塊?
?默認數(shù)據(jù)塊大小為 64MB(hadoop1.x版本64M,2.x為128M) ,可配置?
?若文件大小不到 64MB? ,則單獨存成一個block
? 比如:一個120M的文件會分成64M+56M兩個block塊,雖然第二個分割不到64M,依然作為單獨的block。
?
2 一個文件存儲方式?
?上傳時按文件大小被切分成若干個 block ,存儲到不同節(jié)點上。每一個block都有唯一的編號。?
?默認情況下每個 block 都有三個副本,存儲到三個不同的節(jié)點上,這三個副本是同級的,比如第一次訪問和第二次訪問可能因為副本所在節(jié)點的資源空閑而被訪問,因此副本和備份作用不同。比如某個文件被分成了三個block,block1+block2+block3,而對于每個block都有三個副本,如三個block1副本分別存儲server1、server2、server3三個節(jié)點上。如果集群中DataNode節(jié)點數(shù)量不夠三個,存儲就會報錯。也就是DataNode節(jié)點的數(shù)量不小于block數(shù)量。
?
?
Block 大小和副本數(shù)通過 Client 端上傳文件時設置,文件已經(jīng)上傳服務器成功后,文件block的副本數(shù)可以變更,比如文件被append追加修改(因為文件修改僅僅支持追加)生成新的block。Block Size 不可變更,所以雖然block數(shù)量增加了,但是block數(shù)據(jù)塊64M大小依然不變。?
?
NameNode:保存metadate元數(shù)據(jù),接受客戶端讀寫。
1 NameNode保存metadata元數(shù)據(jù),包括:
????文件 owership(屬組和屬主)和 permissions(權限)
??文件包含哪些block塊及這些block塊ID?
??Block 保存在哪個DataNode (由 DataNode 啟動時上報),即block塊的位置信息。
?
?
2 ?metadate 元數(shù)據(jù)會在啟動時從磁盤加載到內(nèi)存
也就是說啟動后,內(nèi)存和磁盤中都有一份metadata元數(shù)據(jù)信息。
????metadata 存儲到磁盤文件名為”fsimage” ,在NameNode啟動時加載到內(nèi)存,
而DataNode啟動時會上報block的位置信息給NameNode,然后NameNode把block的位置信息保存到內(nèi)存中。也就是說磁盤上的fsimage文件中此時就少了block的位置信息了。
?? Block 的位置信息不會保存到fsimage
?? edits 記錄對 metadata 的操作日志
那么,metadata元數(shù)據(jù)的操作日志是什么情況下產(chǎn)生的呢?
答:比如上傳新文件時,元數(shù)據(jù)進行內(nèi)存操作之后記錄edits日志,記錄了元數(shù)據(jù)信息。
那么問題來了:
1為什么比如上傳文件時,對元數(shù)據(jù)內(nèi)存操作后,要記錄edits日志,而不直接操作fsimage日志呢?
因為對于大數(shù)據(jù)系統(tǒng)來說,大量的文件上傳時會操作內(nèi)存中的元數(shù)據(jù),然后如果直接操作fsimage元數(shù)據(jù)文件,就會造成IO瞬間爆發(fā),造成阻塞。所以記錄的只是操作記錄edits日志。
2 隨著時間增加,fsimage文件并沒有跟內(nèi)存元數(shù)據(jù)保持同步,而落后了很多。怎么辦?
SecondaryNameNode的作用就提現(xiàn)出來。
?
SecondaryNameNode:不是主也不是從節(jié)點。主要用來輔助NameNode完成fsimage文件的同步的更新的,這個過程叫做合并edits日志。因為同步更新時根據(jù)edits日志來更新的,也就是fsimage日志和edits日志的合并。
1 SNN 執(zhí)行合并時機?
?? 根據(jù)配置文件設置的時間間隔fs.checkpoint.period?? 默認 3600 秒?
?? 根據(jù)配置文件設置edits log 大小? fs.checkpoint.size? 規(guī)定 edits 文件的最大值默
認是 64MB
?
?
2 SNN合并流程
????首先,NameNode生成一個新的edits日志文件為元數(shù)據(jù)操作做準備。
????接著,SecondrayNameNode從NameNode讀取edits和fsimage文件到自己節(jié)點。
????進行合并,生成一個新的fsimage文件。
????SecondrayNameNode把新fsimage文件傳輸給NameNode,NameNode更新fsimage。
????當下一個合并時機到來時依次類推。
?
DataNode?( DN )?
?– 存儲數(shù)據(jù)( Block )?
–啟動 DN 線程的時候會向 NN 匯報 block 信息?
–通過向 NN 發(fā)送心跳保持與其聯(lián)系( 3 秒一次),如果 NN 10 分鐘沒有收
到 DN 的心跳,則認為其已經(jīng) lost ,并 copy 其上的 block 到其它 DN。
?
問題:dataNode已經(jīng)掛掉了,是怎么保持block副本為3個呢?
答:NameNode其實會進行checkSize檢查每個block的副本數(shù),如果不足則進行復制,所以也不需要知道掛掉的那個節(jié)點任何信息。如果復制時發(fā)現(xiàn)DataNode節(jié)點數(shù)小于配置副本數(shù),報錯!
?
Block?的副本放置策略?
?
?
–第一個副本:放置在上傳文件的 DataNode ;
如果是集群外提交,則隨機挑選一臺,磁盤不太滿, CPU 不太忙的節(jié)點。?
–第二個副本:放置在于第一個副本不同的機架的節(jié)點上。?
–第三個副本:與第二個副本相同機架的節(jié)點。?
–更多副本:隨機節(jié)點?
?
?
HDFS寫流程:
其實就是上傳為件,通過hdfs API.
1 客戶端請求NameNode,傳遞參數(shù)文件大小、文件名、文件“客戶端”用戶
2 NameNode收到文件后,比如1G,NameNode服務端配置的有默認block大小,在客戶端沒有指定block大小時使用。會返回告訴客戶端block大小、空閑DataNode機器(DataNode跟NameNode保持三秒一次的心跳)
3 客戶端通過輸出流,把數(shù)據(jù)按照字節(jié)流方式寫到DataNode上去,邊寫邊切成block,就是寫夠64M后就生成了第一個block,然后繼續(xù)寫第二個block到當前DataNode或者其他的DataNode上。寫完后,文件就上傳成功了。
注意:副本和客戶端無關,當?shù)谝粋€block寫完后就會復制副本給其他的DataNode節(jié)點。
?
?
HDFS讀流程:
1 客戶端請求NameNode,NameNode接收到文件路徑,返回此文件的元數(shù)據(jù)(文件哪些block及編號、block位置信息)給客戶端。
2 客戶端通過字節(jié)輸入流到DataNode上讀取依次block。每個block有是3個以上副本,到哪里讀?會找到副本所在dataNode空閑的節(jié)點讀取。
3 讀取完成,告訴NameNode匯報。
?
?
搭建HDFS集群環(huán)境:
準備:
1 準備機器192.168.98.95(node1)、192.168.98.96(node2)、192.168.98.97(node3)、192.168.98.98(node4)四臺機器
2 ?各節(jié)點時間相同,差幾秒沒事
? 3 設置免登錄、檢查jdk1.7
?
配置Hosts:
scp –p /etc/hosts ?root@node2:/etc
?
?
?
設置免登錄:
#這個命令會產(chǎn)生一個公鑰(~/.ssh/id_rsa.pub)和密鑰(~/.ssh/id_rsa)
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa?
# 將自己的公鑰導入認證文件中,就直接可以ssh本機ip,進行登陸,不需要輸入密碼
cat ~/pub_key >> ~/.ssh/authorized_keys?
所以,將其他機器的pub_key導入到本機認證文件中就可以實現(xiàn)免登錄。
比如使用192.168.98.95(node1)訪問192.168.98.96(node2),免登錄:
復制到了192.168.98.96(node2),然后在192.168.98.96(node2)執(zhí)行以下命令:
修改JAVA_HOME
?
#vi hdfs-site.xml
?
#vi slavers
#vi master
node2?
加入hadoop環(huán)境變量到/etc/profile
?
?
?
#hdfs namenode ?-format????--只能在namenode下敲幫我們創(chuàng)建了/opt/hadoop-2.5/dfs/name/current
及其下的fsimage文件
啟動hadoop
#start-dfs.sh
關閉防火墻
#systemctl stop www.taohuayuan178.com/ firewalld.servicehttp://192.168.98.95:50070/
?
?
?
http://192.168.98.96:50090
?
?
?
?
問題:不知什么情況datanode只有node4,沒有node2和node3呢?-www.tygj178.com-namdeNode和dataNode的clusterID不一致!
?
Hadoop日志也沒有看出錯誤:/root/hadoop-2.5.1/logs
tail -fhadoop-root-namenode-localhost.localdomain.log
轉載于:https://www.cnblogs.com/qwangxiao/p/9655024.html
總結
- 上一篇: 反射应用二:利用反射加配置文件实现多数据
- 下一篇: python的变量命名及其使用