淺析hadoop(一)之HDFS

淺析Hadoop(一)之HDFS


再次看hadoop權威指南,又有了一些不一樣的收穫,所以心血來潮,就想將我理解和整理的東西寫出來,還有很多不足,歡迎大家指正。


1. hdfs的特點

  • 一次寫入,多次讀取
  • 硬件要求低
  • 高延時性,高吞吐量,犧牲低延時,獲得高吞吐
  • 不適合大量的小文件存儲
  • Hdfs的文件只能有一個writer,寫操作只能追加,而不能修改。
2. hdfs的數據塊大小


構建與磁盤上的文件系統的數據塊一般爲磁盤塊的整數倍,磁盤塊大小默認512字節,hdfs也有數據塊的概念,大小爲128M,而在hdfs上,小於128M的文件存儲爲一個數據塊,並不會佔滿整個塊的空間。數據塊設置到這麼大的原因是爲了最小化尋址開銷,這是相對於傳輸速率來說的,假設尋址時間爲10ms,磁盤傳輸速率爲100MB/s,爲了使尋址時間只佔傳輸時間的1%,我們會將塊的大小設置爲100MB。隨着磁盤驅動器傳輸速率的增大,塊的大小也會設置的更大


3. 分佈式文件系統帶來的好處

  • 一個文件的大小可以大於網絡中任意一個磁盤的容量,文件的塊並不需要存儲在同一磁盤上,因此他們可以利用集羣上的任意一個磁盤進行存儲
  • 使用塊作爲基本存儲單元,而不是文件的好處就是大大簡化了系統的設計,因爲塊的大小是固定的。
  • 塊還非常適合數據備份從而提供數據容錯能力和提高可用性,hdfs會將塊複製到少數幾個獨立的節點上,默認副本爲三個,這樣確保在節點故障時數據不會丟失。
4. namenode和datanode在hdfs上的作用


HDFS集羣有兩類節點以管理——工作者模式運行,即一個namenode和多個datanode節點

  • namenode管理文件系統的命名空間,他維護着文件系統樹和整棵樹內所有的文件和目錄,這些文件形式永久保存在本地磁盤上,由dfs.namenode.name.dir配置,這些文件以命名空間鏡像文件(fsimage)和編輯日誌文件(edits)進行保存,namenode同時還記錄每個文件中各個塊所在的數據節點信息,但是這些信息並不會持久化到本地,而是保存在內存中,並在每次namenode啓動的時候由datanode發送給namenode。
  • datanode是文件系統的工作節點,他們根據需要存儲並檢索數據塊(受client或者namenode調度),並且定期向namenode發送他們所存儲的塊列表。
5. namenode的容錯機制


運行一個輔助namenode,也就是secondarynamenode,這個輔助的namenode的作用是定期將namenode所存儲的edits文件合併稱爲fsimage文件,以防止編輯日誌過大,一般這個輔助namenode會單獨工作在一個節點上,因爲他會佔用大量的CPU與namenode相同容量的內存來執行合併操作。他會保存合併後的fsimage文件的副本,並在namenode發生故障之後用於恢復數據。


6. fsimage和edits到底是什麼東西?

  • Edits:文件系統客戶端在對hdfs執行寫操作時,這些操作首先會被記錄到edits文件中,也就是編輯日誌文件,namenode在內存中維護文件系統的元數據;當編輯日誌文件被修改時,相關元數據信息也會同步更新。內存中的元數據可支持客戶端的讀請求。
  • Fsimage:fsimage文件是文件系統元數據的一個永久性檢查點,其中包含文件系統中的所有目錄和文件inode的序列化信息。每個inode是一個文件或目錄的元數據的內部描述方式。對於文件來說,包含的信息有複本級別,修改時間,訪問時間,訪問許可,塊大小,組成一個文件的塊等信息;對於目錄來說,包含的信息有修改時間,訪問許可和配額元數據等信息。數據塊存儲在datanode中,但是fsimage文件並不會描述datanode,namenode將這種數據塊和datanode的具體映射關係放在內存中。當namenode每次啓動的時候,會向datanode索取當前的數據塊列表以建立映射關係,namenode還會定期徵詢datanode以確保它擁有最新的塊映射。
7. 安全模式期間都做了什麼事情?


Namenode啓動的時候,首先會將fsimage文件和edits文件載入內存當中,並執行edits文件中的各項操作,一旦內存中成功建立了文件系統的元數據的映像,則會創建一個新的fsimage文件和一個空的edits文件,此時namenode運行在安全模式下,文件系統處於只讀的狀態。在安全模式下,namenode向datanode 索取最新的塊列表,將他們之間的映射關係保存在內存當中。如果滿足“最小複本條件”namenode會在30秒後退出安全模式。


8. 描述hdfs的讀寫機制


寫入機制:
1) client通過DistributedFileSystem對象調用create方法,該對象對namenode創建一個RPC調用,在文件的命名空間中新建一個文件,此時的文件並沒有對應的數據塊,namenode檢查用戶權限和是否已經存在該文件名,檢查通過後DistributedFileSystem向client返回一個FSDataOurputStream,client通過該對象向文件中寫入數據。
2) client寫入數據時,FSOutputStream 將數據分成一個個的數據包,並寫入內部隊列,DataSreamer處理該隊列,DataStreamer負責的是根據datanode列表要求namenode分配合適的新塊用於存儲數據複本。默認是3個副本,所以會有三個datanode組成一個管線,DataStreamer將數據包傳輸給管線中的第一個節點,第一個節點存儲成功後將其傳輸給第二個節點,第二個節點存儲成功後傳輸給第三個節點。
3) DataOutputStream維護着一個內部數據包隊列來等待datanode的收到確認回執,收到管線中所有節點的確認信息,該數據包纔會從確認隊列中刪除。
4) 客戶端寫完數據後,調用close方法,該操作會將剩餘的所有數據包寫入管線,並在聯繫到namenode且發送文件寫入完成信號之前,等待確認。


讀取機制:
1) Client通過調用DistributedFileSystem對象的open方法,該對象通過RPC調用namenode確定起始塊的位置,namenode返回所有存儲該文件塊的複本地址並按照與client的距離來排序,client會從距離自己最近的datanode上讀取數據塊。
2) Client對輸入流(FSDataInputStream)調用read方法來連續的讀取數據,讀取到塊的末尾時,DFSInputSteam關閉與該datanode的連接,轉去尋找下一個塊的最佳datanode,直到讀取結束。對FSDataInputStream調用close方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章