分布式文件系統架構
- FS (File System)
- 文件系統是基於硬盤上的一個文件管理的工具
- 我們用戶操作文件系統可以和硬盤解耦
- DFS (Distributed File System)
- 分布式文件系統
- 將數據存放到多台電腦上存儲
- 分布式文件系統有很多
- HDFS(Hadoop Distributed File System)是Map Reduce計算的基礎
文件切分思想
- 文件存放在一個磁盤上效率低
- 讀取效率低
- 如果文件特別大會超出單台機器的存儲范圍
- 字節數組
- 文件在磁盤真實存儲文件的抽象概念
- 數組可以進行拆分和組裝,源文件不會受到影響
- 切分數據
- 對字節數組進行切分
- 拼接數據
- 按照數組的偏移量將數據連接到一起,將字節數組連接到一起
- 偏移量
- 當前數據在數組中的相對位置,可以理解為下標
- 數組都有對應的索引(下標),可以快速地定位數據
- 數據存儲的原理
- 不管文件的大小,所有的文件都是由字節數構成
- 如果要切分文件,就是將i個字節數組分成多份
- 只要將切分后的數據拼接到一起,數據就可以繼續使用
- 拼接的時候需要參照的是每個數據的偏移量
Block拆分標准
-
拆分的數據塊需要等大
- 數據計算的時候簡化問題的復雜度
- 進行分布式算法設計的時候,數據不統一,算法很難設計
- 數據讀取的時間相對一致
- 通過偏移量可以知道數據塊的位置
- 相同文件,分成的數據塊大小應該相等
- 數據計算的時候簡化問題的復雜度
-
數據塊Block
- 數據被切分后的一個整體成為數據塊
- 在Hadoop1.0中默認大小為64M,在Hadoop2.0及其以后默認大小為128 M
- 在同一個文件中,每個數據塊大小要一致,除了最后一個節點之外
- 不同文件中,塊的大小可以不一致
- 文件大小不同可以設置不同的塊的數量
- 真實情況下,會根據文件大小和集群節點的數量綜合考慮塊的大小
- 數據塊的個數=ceil(文件大小/每個塊的大小)
-
注意事項
- HDFS中一旦文件被存儲,數據便不被允許被修改
- 修改會影響偏移量
- 修改會導致數據傾斜
- 修改數據會導致蝴蝶效應
- 可以被追加數據,但是不推薦
- 追加設置需要手動打開
- 一般HDFS存儲的都是歷史數據。所以將來Hadoop的Mapreduce都會被用來進行離線數據處理
- 一旦文件被上傳之后,塊的大小就不允許被修改,之后的可以適當縮小
- 塊大小范圍:128M-512M
- 如果數據文件的切割點128M正好是一個單詞的中間部分,切分數據如何保證數據的完整性?
- 根據每個字符的偏移量,可以來為不同塊的字符找到其原來的文件中的位置
- 參考文件拆分思想中的數據存儲原理
- HDFS中一旦文件被存儲,數據便不被允許被修改
Block數據安全
- 肯定是要對數據進行備份
- 備份的數據不能存放在一個節點上
- 存儲的副本數據要盡可能的近,這樣獲取數據的速度會很快從而減少讀取的代價
- 備份的數量小於等於節點數量
- 備份的數據節點越多的話,可能導致資源浪費嚴重
- 備份少的話,發生集體崩潰的可能性會增大
- 備份數量是通過數據的使用頻率和數據的重要性來決定的
- 默認每個數據塊會有3個副本,相同副本是不會存放在同一個節點上
- 副本的數量可以變更
- 如果數據近期被使用的可能性很大,那么可以多設置一些數據備份
- 后期數據很少被分析,可以減少副本數量
Block管理效率
- 需要專門給節點進行分工
- DataNode:存儲數據,存儲的數據塊(data block)
- NameNode:記錄數據。用來管理/分配所有訪問對應DataNode的進程,監控對應DataNode的狀態以及對應NameNode都做了什么,NameNode對DataNode進行記錄
- SecondaryNameNode:數據日志
HDFS的特點
優點
-
高容錯性
-
保存多個副本,並且提供容錯機制
-
副本丟失或宕機后自動恢復。默認保存三個副本
-
-
可以運行在廉價的機器上
- 通過副本提高可靠性
- 提供容錯機制和恢復機制
-
適合批處理
- 移動計算而非數據
- 數據位置暴露給計算框架,這樣所有節點都可以進行數據訪問
-
適合大數據的處理
- TB級數據處理,甚至是PB級數據的處理
- 百萬規模以上的文件數量
- 10K+節點規模
-
流式數據訪問
- 一次寫入,多次讀取,高吞吐量,所以可以同時處理大量數據
-
批處理和流處理
-
批處理:安按照一個定量不停的處理
-
流處理:源源不斷,上流不停處理不停
-
缺點(不適合小量數據處理)
-
不擅長低延遲數據訪問
- 比如毫秒級
-
不擅長小文件分區
- 占用NameNode大量內存,NameNode是管理datanode並記錄block存儲到了哪個datanode。所有每存儲一個文件會生成一個1k或者幾k的數據文件,如果小文件多的話,小文件累積最終也會達到一個比較大的規模
- 磁盤尋道時間超過讀取時間
- 不擅長並發寫入,文件隨機修改
- 一個文件只能有一個寫入者
- 僅支持append向尾部添加(有組件可以實現刪除等功能)