## 簡介
Hadoop Distributed File System,分布式文件系統
## 架構

* **Block數據塊**
1. 基本存儲單位,一般大小為64M(配置大的塊主要是因為:1)減少搜尋時間,一般硬盤傳輸速率比尋道時間要快,大的塊可以減少尋道時間;2)減少管理塊的數據開銷,每個塊都需要在NameNode上有對應的記錄;3)對數據塊進行讀寫,減少建立網絡的連接成本)
2. 一個大文件會被拆分成一個個的塊,然后存儲于不同的機器。如果一個文件少于Block大小,那么實際占用的空間為其文件的大小
3. 基本的讀寫單位,類似于磁盤的頁,每次都是讀寫一個塊
4. 每個塊都會被復制到多臺機器,默認復制3份
* **NameNode**
1. 存儲文件的metadata,運行時所有數據都保存到內存,整個HDFS可存儲的文件數受限于NameNode的內存大小
2. 一個Block在NameNode中對應一條記錄(一般一個block占用150字節),如果是大量的小文件,會消耗大量內存。同時map task的數量是由splits來決定的,所以用MapReduce處理大量的小文件時,就會產生過多的map task,線程管理開銷將會增加作業時間。處理大量小文件的速度遠遠小于處理同等大小的大文件的速度。因此Hadoop建議存儲大文件
3. 數據會定時保存到本地磁盤,但不保存block的位置信息,而是由DataNode注冊時上報和運行時維護(NameNode中與DataNode相關的信息并不保存到NameNode的文件系統中,而是NameNode每次重啟后,動態重建)
4. NameNode失效則整個HDFS都失效了,所以要保證NameNode的可用性
* **Secondary NameNode**
1. 定時與NameNode進行同步(定期合并文件系統鏡像和編輯日志,然后把合并后的傳給NameNode,替換其鏡像,并清空編輯日志,類似于CheckPoint機制),但NameNode失效后仍需要手工將其設置成主機
* **DataNode**
1. 保存具體的block數據
2. 負責數據的讀寫操作和復制操作
3. DataNode啟動時會向NameNode報告當前存儲的數據塊信息,后續也會定時報告修改信息
4. DataNode之間會進行通信,復制數據塊,保證數據的冗余性