HDFS:架構圖
1.block:檔案存儲到hdfs上時被切分成若幹個資料塊,每個block資料塊的大小預設128M(hdfs-1.x預設:64M)
如果檔案不到128M,則可以單獨存成一個block。每一個塊都有3個副本(一共三個)存儲在datanode
上。3個副本的存儲政策:第一個存儲在目前機架上的節點選擇磁盤不滿、cpu不忙的節點,第二個存儲
在不同機架上,第三個存儲在同第二個機架的不同節點。
**2.datanode:**存放資料塊的資訊,當datanode啟動時向namenode彙報塊資訊,保持和namenode的心跳機制
當namenode超過10分鐘沒有收到datanode的彙報資訊時,則會認為改datanode丢失,此時
namenode會尋找一個新的datanode并從擁有改block塊的其他副本上拷貝block塊至新的
datanode上。
**3.namenode:**namenode等待接受用戶端的寫入寫出,同時接受datanode的彙報資訊,與datanode保持着心
條機制。namenode上儲存着目錄樹,其中包括檔案資訊,檔案分割成具體block塊的資訊,
以及每一個block塊歸屬datanode的資訊。這些資訊不會被持久化,需要每次啟動時datanode的彙報
namenode使用記憶體作為存儲媒體。優點:計算速度快 缺點:記憶體中的資料掉電易失、記憶體的大小限制
namenode的存儲量,如果記憶體被占滿将無法存儲資料。當namenode啟動的時候會在fsimage的基礎上
執行一遍日志檔案,然後建立一個新的空的fsimage。namenode的每一個操作都會記錄在日志檔案裡,
長時間造成日志檔案過大,導緻namenode啟動時間過長,此時出現了secondarynode。同時nameno
de啟動時會進入安全模式,當namenode和datanode進行完心跳機制後,namenode上存儲玩所有的
datanode的中繼資料資訊,并進行檢測完成後,namenode解除安全模式可進行正常的讀寫操作。
secondarynamenode日志合并圖:
4.secondarynamenode
sn會定時将fsimage和edites檔案合并(觸發點:預設日志檔案64M,或者1個小時,這個參數可以調)
當觸發條件時,sn會将fsimage從namenode上拷貝一份到sn上,将日志檔案拷貝到sn上,進行合并,
生成fsimage.ckpt 将其拷貝給namenode,namenode會将fsimage覆寫原fsimage。
hdfs的讀寫流程:
- hdfs的讀流程
1.用戶端會發一個rpc請求到namenode上,namenode會傳回要讀取檔案的block塊資訊,和block塊所在 datanode的資訊。
2.用戶端得到這個資訊後會建立一個fsdatainputstream對象
3.用戶端會選擇距離用戶端最近的datanode來讀取block,如果用戶端本身就是datanode那麼将從本地讀取
每次讀取完一個block塊時都會進行checksum驗證,如果讀取datanode出錯時,用戶端便會通知namenode
然後再從下一個擁有改block塊的datanode讀取。
4.當讀取完後會關閉與datanode的連結,并尋找下一個要讀取的block塊的最佳datanode
5.當讀取完清單的block後,檔案還沒有結束,會向namenode再次發送資訊,擷取下一批block資訊。
2.hdfs的寫操作
1…用戶端會發一個rpc請求到namenode上,namenode會檢查要建立的檔案是否存在,建立是否有權限進行建立如果成功則會建立一個檔案,如果失敗則會抛出一個異常,并且建立一條記錄
2.用戶端得到這個資訊後會建立一個fsdataoutputstream對象
3.要寫入的檔案會被切分成多個packets,并且内部使用dataqueue資料隊列的形式,同時用戶端會向namenode申請新的blocks擷取這些适合存儲的datanode清單
4.此時用戶端會和datanode建立pipeline,将一個個packets寫入datanode中一個packets64b大小,當寫入一個packets第一個datanode會向第二個datanode寫入以此類推,同時用戶端還繼續給第一個datanode發送packets
當一個packets成功存儲後會犯一個ack packets 通過pipeline傳給用戶端,此時用戶端(内部維護着一個ack queue)便會删除其内的用戶端通過ack queue删除相對應的ack packet
個ack packets 通過pipeline傳給用戶端,此時用戶端(内部維護着一個ack queue)便會删除其内的用戶端通過ack queue删除相對應的ack packet
5.如果傳輸過程中,某個datanode出現故障,那麼目前的pipeline會被關閉,出現故障的datanode從目前的pineline中移除,剩餘的block會繼續給剩下的datanode繼續以pipeline形式進行傳輸,同時namenode會配置設定一個新的datanode,進行拷貝已經傳輸完成的datanode上的資料