Hadoop分布式文件系統HDFS介紹
概念
HDFS是Hadoop Distribute File System 的簡稱,也就是Hadoop分布式文件系統。
設計理念
1、硬件錯誤是常態
錯誤檢測并快速自動恢復是HDFS的最核心設計目標
2、存儲超大文件
HDFS適合大量存儲,總存儲量可以達到的PB、EB級
HDFS適合大文件,單個文件一般在百MB級以上
文件數目適中
3、流式數據訪問,最高效的訪問模式是 一次寫入、多次讀取
HDFS適合用于處理批量,而不適合隨機定位訪問
HDFS存儲的數據集作為hadoop的分析對象。在數據集生成后,長時間在此數據集上進行各種分析。每次分析都將設計該數據集的大部分數據甚至全部數據,因此讀取整個數據集的時間延遲比讀取第一條記錄的時間延遲更重要。
4、簡單的一致模型
HDFS的應用程序需要對文件實行一次性寫、多次讀的訪問模式
不能修改已寫入的數據
5、程序采用“數據就近”原則分配節點執行
移動計算比移動數據的代價要低
6、運行在普通廉價的服務器上
HDFS設計理念之一就是讓它能運行在普通的硬件之上,即便硬件出現故障,也可以通過容錯策略來保證數據的高可用。
局限性
1、不適合低延遲數據訪問
高吞吐量可能要求以高延遲作為代價
Hbase可以彌補不足
2、無法高效存儲大量小文件
文件數量大小的限制由NameNode來決定
3、不支持多用戶寫入及任意修改文件
HDFS的基本存儲單位塊(Block)
傳統的塊存儲介質中,塊是讀寫的最小數據單位(扇區),傳統文件系統基于存儲塊進行操作
HDFS也使用的塊的概念,默認大小為64M
- 可針對每個文件配置,由客戶端指定(hdfs-site.xml中配置dfs.block.size, 默認為64M)
- 每個塊有一個自己的全局ID </ul>
- 每個塊是獨立的存儲單位
- 以塊為單位在集群服務器上分配存儲 </ul>
- 一個文件的大小可以大于網絡中任意一個磁盤的容量 </ul>
- 簡化了存儲子系統的設計,簡化了存儲管理,消除了對元數據的顧慮 </ul>
- 塊適合用于數據備份,提供了容錯能力和可用性 </ul>
- 管理文件系統的命名空間
- 記錄每個文件數據塊在各個Datanode上的位置和副本信息
- 協調客戶端對文件的訪問
- 記錄命名空間內的改動或空間本身屬性的改動
- Namenode使用事務日志記錄HDFS元數據的變化。使用映像文件存儲文件系統的命名空間,包括文件映射,文件屬性等
- 通過檢查點(Checkpoint)更新影像文件,Secondary Namanode輔助完成處理 </ul>
- 負責所在物理節點的存儲管理
- 一次寫入,多次讀取(不修改)
- 文件由數據塊組成,典型的塊大小是64MB
- 數據塊盡量散布道各個節點 </ul>
- 可以在hdfs-site.xml中設置復制因子指定副本數量
- 所有數據塊都有副本
- Datanode啟動時,遍歷本地文件系統,產生一份hdfs數據塊和本地文件的對應關系列表(blockreport)匯報給namenode
</ul>
- 集群一般放在不同機架上,機架間帶寬要比機架內帶寬要小
- HDFS的“機架感知(Rack-aware)”
- 默認在一個機架內存放兩個副本, 在另外一個機架內再存放一個副本, 這樣可以防止機架失效時丟失數據,也可以提高帶寬利用率 </ul>
- Namenode周期性從datanode接收心跳信號和塊報告
- Namenode根據塊報告驗證元數據
- 沒有按時發送心跳的datanode會被標記為宕機,不會再給它任何I/O請求
- 如果datanode失效造成副本數量下降,并且低于預先設置的閾值,namenode會檢測出這些數據塊,并在合適的時機進行重新復制
- 引發重新復制的原因還包括數據副本本身損壞、磁盤錯誤,復制因子被增大等 </ul>
- Namenode啟動時會先經過一個“安全模式”階段
- 安全模式階段不會產生數據寫
- 在此階段Namenode收集各個datanode的報告,當數據塊達到最小副本數以上時,會被認為是“安全”的
- 在一定比例(可設置)的數據塊被確定為“安全”后,再過若干時間,安全模式結束
- 當檢測到副本數不足的數據塊時,該塊會被復制直到達到最小副本數 </ul>
- HDFS客戶端軟件實現了對HDFS文件內容的校驗和(Checksum)檢查
- 在文件創立時,會計算每個數據塊的校驗和
- 校驗和會作為單獨一個隱藏文件保存在命名空間下
- 客戶端獲取文件時可以檢查數據塊對應的校驗和是否和隱藏文件中的相同,從而發現數據塊是否損壞
- 如果正在讀取的數據塊損壞,則可以繼續讀取其它副本 </ul>
- 刪除文件時,其實是放入回收站/trash
- 回收站里的文件可以快速恢復
- 可以設置一個時間閾值,當回收站里文件的存放時間超過這個閾值,就被徹底刪除,并且釋放占用的數據塊
- 默認回收站是關閉的,可以通過在core-site.xml中添加fs.trash.interval來打開并配置時間閥值,時間單位是分 </ul>
- 映像文件和事務日志是Namenode的核心數據。可以配置為擁有多個副本
- 副本會降低Namenode的處理速度,但增加安全性
- Namenode依然是單點,如果發生故障要手工切換
</ul>
來自:http://my.oschina.net/xiaoqqq/blog/403457
HDFS將一個文件分為一個或數個塊來存儲
如果實際數據沒有達到塊大小,則并不實際占用磁盤空間, 例如如果一個文件是500M,則它會被分為8個塊:64*7+52
使用塊存儲的好處:
HDFS體系架構
主要包括以下部分:
NameNode
DataNode
事務日志
映像文件
SecondaryNameNode
HDFS讀寫文件的流程
客戶端要訪問HDFS中的一個文件,首先從namenode獲得組成這個文件的數據塊位置列表,根據列表知道存儲數據塊的datanode,訪問datanode獲取數據,Namenode并不參與數據實際傳輸。
寫入數據流程: 客戶端首先在NameNode中創建文件, 然后將文件內容寫到DataNode中, 完成后返回客戶端, 客戶端關閉NameNode中創建的文件。
HDFS的可靠性
冗余副本策略
機架策略
心跳機制
安全模式
校驗和
回收站
元數據保護