HDFS - HDFS的四個角色

在上一篇已經知道了HDFS是把文件切成塊後,再存儲在多個服務器中,而且爲了數據的安全性,都作了多個副本進行冗餘存儲。那在HDFS中,是誰對文件進行切塊?是誰決定了塊存儲在哪裏?是誰管理存儲的文件?
在HDFS中,有這幾種角色:node

  • NameNode: 負責處理Client的請求、元數據管理等其餘功能。
  • DataNode:主要就是存儲文件塊的。
  • Client:客戶端,與NameNode、DataNode交互。
  • SecondaryNamenode:分擔NameNode的壓力,主要是元數據的合併。

image.png

Client

上傳文件的時候,Client會把一個大文件切成一個個塊,在早先的版本中,每一個塊是64M的,後面的版本是128M每一個塊,這個能夠根據系統的使用進行調整。
切成塊後,再詢問NameNode他每一個塊要存放哪裏,等拿到NameNode的回覆後,就開始把塊的數據上傳到DataNode中。
若是是讀文件的話,就會詢問NameNode每一個塊在哪裏,而後根據NameNode的回覆,從相應的DataNode讀取文件,最後把塊拼接合併成文件。
除了讀寫文件外,Client也會經過其餘的命令來和NameNode以及DataNode交互。安全

NameNode

NameNode有一個50070端口的HttpServer,提供各類功能,好比咱們用50070訪問網頁的時候,就是這個服務提供的功能。這個HttpServer服務還有一個提供了imagetransfer功能,用於元數據合併。
除了Http服務,NameNode也提供了兩個RPCServer,一個是ClientRpcServer一個是ServiceRpcServer。
ClientRpcServer是用來響應Client的讀寫請求以及其餘請求。
ServiceRpcServer是用來響應DataNode的請求,好比註冊、心跳。
image.png
NameNode負責處理Client的請求,由於他知道塊的每一個副本要怎麼存儲,每一個副本已經存儲在哪裏,那他怎麼知道的呢?
好比上圖的文件,被分紅4塊,讀取的時候,咱們怎麼知道把哪些塊讀取出來合併成,還原到原來的文件?咱們又怎麼知道要讀取的塊存放在哪一個DataNode?
這些信息都是元數據來記錄的,NameNode會在硬盤和內存中存儲一個叫元數據的東西,一個文件被分紅多個塊,那這個文件和每一個塊的對應關係是記錄在元數據裏的。每一個塊又存儲在多個DataNode,這些信息也是記錄在元數據裏的。服務器

DataNode

DataNode是實際上讀寫文件的地方,他存儲着全部的文件,每一個DataNode都不能保證不出故障,因此咱們文件是以多副本的形式存儲在DataNode中。
和NameNode同樣,DataNode也提供了HttpServer和RPCServer。
HttpServer用於處理NameNode和其餘DataNode的請求。
RPCServer用於處理Client和其餘DataNode的請求。
當Client要上傳文件的時候,NameNode須要告知Client上傳到哪一個DataNode,這些DataNode必須是正常的,爲了讓NameNode知道本身是正常的,NameNode會按期的發送心跳信息給NameNode。spa