Hadoop 是 Apache 下的一個項目, 它並不是一個用於儲存的分布式文件系統而已, 而是設計用來在通用計算設備組成的大型叢集上執行分布式應用的框架. 由 HDFS, MapReduce, HBase, Hive 和 ZooKeeper 等成員的組成, 其中 HDFS 和 MapReduce 是 Hadoop 中兩個最基礎, 最重要的成員, 它們提供了互補性服務並在核心層上提供更高層的服務. Hadoop 項目結構如下:
- Core/Common
- Avro
HDFS 的體系結構:
Hadoop 分布式文件系統 HDFS 可以部署在廉價硬體之上, 能夠高容錯, 可靠性的提供存儲海量數據 (TB 甚至是 PB 級). 它可以和 MapReduce 編成模型很好的結合, 以為能夠為應用程序提供高吞吐量的數據訪問, 並適用於大數據應用程序.
HDFS 的設計目標
1. 檢測及快速恢復硬體故障: 整個 HDFS 系統由成千上百存儲文件的服務器組成, 如此多的服務器意味故障會常發生, 因此故障的檢測與快速恢復是 HDFS 的第一個核心目標
2. Stream 的數據訪問: HDFS 使應用程序能 Stream 的訪問它們的數據集. HDFS 被設計成適合進行批量處理而不是用戶交互式的處理, 重視數據吞吐量而不是數據訪問的反應數度.
3. 簡化一致性模型: 大部分的 HDFS 程序操作文件時需要一次性寫入, 多次讀取. 一個文件一旦經過創建, 寫入與關閉後就不太需要修改, 從而簡化一致性問題並提高數據吞吐量.
4. 移動計算的代價比移動數據的代價低: 一個應用請求的計算, 離它操作的數據越近效能就越好. 這在數據達到海量級別時更是如此. 將計算移動到數據比數據移動到計算處更高效.
5. 超大規模數據集: HDFS 的一般企業文件大小可能在 TB 或是 PB 級.
6. 異構軟硬體平台間的可移植姓: 這個特性便於 HDFS 作為大規模數據應用平台的推廣.
HDFS 結構模型
HDFS 是一個主從 (Master/Slave) 結構模型. 從最終用戶的角度來看, 它就像是傳統的文件系統一樣, 可以透過目錄路徑對文件執行 CRUD (Create/Read/Update/Delete) 操作. 一個 HDFS 叢集是由一個 NameNode 和若干的 DataNode 組成. NameNode 主節點是主服務器, 管理文件系統的命名空間和客戶端對文件的方問操作; DataNode 是叢集中的一般節點, 負責節點數據的存儲. 客戶端通過 NameNode 向 DataNode 節點交互訪問文件系統, 聯系 NameNode 獲取文件, 而文件的 I/O 操作則是直接和 DataNode 進行交互作用. HDFS 允許用戶以文件形式存儲數據, 架構如下:
假設客戶端要訪問一個文件, 首先會從 NameNode 中獲取組成該文件數據塊所在位置列表, 即知道數據塊存儲在那些 DataNode 上; 然後客戶端直接從 DataNode 上讀取文件數據. 在這一過程中 NameNode 不參與文件的傳輸. NameNode 與 DataNode 都可以設計成在廉價的 Linux 主機上面運行, HDFS 採用 Java 語言開發, 因此可以佈署在大範圍的機器上. 一個典型的案例是一台機器跑一個單獨的 NameNode 節點, 叢集中的其他機器則各跑一個 DataNode 實例.
NameNode 是 HDFS 的守護程序, 它主要負責記錄大數據文件如何被分割成數據塊, 被分割後的數據塊分別是存儲到那些 DataNode 數據節點上. NameNode 的主要功能是對內存 I/O 進行集中管理. NameNode 節點是單一的, 這樣就可以大大簡化系統的結構. NameNode 也負責管理與保管所有 HDFS 元數據, 因而用戶文件數據的 讀/寫 就可以直接在 DataNode 上而不需要透過 NameNode. 在一般狀況下, 如果是 DataNode 所在的服務器出現故障, Hadoop 叢集依舊可以正常運轉, 或者快速重啟. 但是如果是 NameNode 出現故障, 整個 Hadoop 的服務將因此而中止!
文件系統的命名空間 NameSpace
HDFS 支持傳統的 階層架構文件組織, 用戶可以創建目錄, 並在目錄中創建, 刪除, 移動和重新命名文件. 但是 HDFS 不支持用戶磁碟配額與訪問權限的控制, 也不支援軟/硬鏈接. NameNode 負責維護文件系統的名稱空間, 任何對文件系統名稱空間或屬性的修改都將被 NameNode 記錄下來, 文件副本的數目稱為文件副本係數, 這個設定也是記錄在 NameNode.
數據複製與存放
HDFS 是在一個大叢集中跨機器可靠的存儲超大文件. 它將每個文件存儲成一系列的數據塊, 數據按 64 MB 分成大小等同的一個個數據塊, 除了最後一個, 所有的數據塊大小都是相同的.
1. 數據的複製
2. 副本的存放是 HDFS 可靠性和性能的關鍵
3. 副本選擇
4. 安全模式
文件系統元數據的持久化
NameNode 節點上保存著 HDFS 的命名空間, 在對任何文件系統的元數據進行創建, 修改, 刪除等操作時, NameNode 會採用 Editlog 的事務日誌文件記錄下來. 整個 HDFS 的文件系統的命名空間, 包含數據塊的映射, 文件屬性, 數據塊的副本訊息都會存儲在這個 FsImage 文件中. 而透過這個 Editlog, 系統在重開機後就能回復到關機前的狀態.
HDFS 的通信協議
HDFS 通訊協議是建立在 TCP/IP 網絡協議之上. 客戶端透過 TCP 端口連接到 NameNode, 然後使用 ClientProtocol 協議與 NameNode 節點進行資訊交換. 在 DataNode 上採用 DataNodeProtocol 協議來與 NameNode 主節點進行資訊交換. 遠程調用 RPC 模型被抽象出來並封裝成 ClientProtocol 和 DataProtocol 協議. 一般情況下 NameNode 節點不會主動發起 RPC 請求 而是 接收來自客戶端或是 DataNode 的 RPC 請求.
HDFS 的 Robust
HDFS 的可靠性主要表現在即使出現錯誤情況下, 也要保證能夠進行數據存儲. 常見的 3 種錯誤狀況是 NameNode 故障, DataNode 故障 與 網路割裂 (Network Partitions).
1. 磁碟數據錯誤
2. 叢集均衡
3. 數據完整性
4. 元數據磁碟錯誤
5. 快照
HDFS 的數據組織
1. 數據塊
2. 數據塊的存放
3. 數據塊流水線複製
HDFS 的可訪問性
應用程序可以通過多種方式來訪問 HDFS
HDFS 的存儲空間回收
1. 文件的刪除和恢復
2. 減少副本數
MapReduce 的體系結構:
MapReduce 是 Hadoop 的主要核心組件之一. Hadoop Map/Reduce 是一個使用簡易的軟體框架, 基於它寫出來的應用程序能夠運行在由上千個節點組成的大型叢集上, 並以一種可靠容錯的方式並行處理 TB 級別的數據集. 採用 MapReduce 架構實現的程序能夠在由大量的普通配置的計算機構成的叢集中實現並行化操作. MapReduce 系統在運行過程中只關心數據如何分割, 如何調度, 以及集群中計算機如何對錯誤進行處理, 管理著計算機之間的通信. 採用 MapReduce 架構可以使那些沒有進行過併行計算和分布式計算的開發人員能充分利用分布式系統的豐富資源進行併行式, 分布式的開發.
MapReduce 框架由一個單獨的 master JobTracker 和叢集節點上的 slave TaskTracker 共同組成. master 負責調度一個作業中的所有任務, 把這些任務分布在不同的 slave 上. master 監控 slave 節點上這些任務的執行情況, 並重新執行失敗的任務, 而 slave 僅負責執行由 master 指派的任務.
MapReduce 是一種編成模式
MapReduce 是一種編成模式, 一種雲計算的核心計算方式並採用分布式運算計算模式, 也是簡化的分布式編成模式.
1 MapReduce 主要解決問題
2. MapReduce 編成模式的核心思想
3. MapReduce 與分布式文件系統 HDFS 的關係
Map/Reduce
MapReduce 處理大規模數據其核心就是 Map/Reduce 函數. 這兩個函數的具體功能由用戶根據自己的需求設計實現, 只要能夠按照用戶自定義的規則, 將輸入的
在 Reduce 階段, Reduce 任務從不同的 Map 接收來的數據整合在一起並進行排序, 然後調用用戶自定義的 Reduce 函數, 對輸入的
MapReduce 將處理大數據的過程拆解成 Map 與 Reduce 的過程如下圖:
Map/Reduce 範例:
接著我們要了解 Map/Reduce 最好的方法就是來看一個簡單的範例. 考慮你有一堆 Words, 你希望知道每個 Word 出現的次數, 如果放在 Map/Reduce 的流程中, 看起來會像下面的圖:
Supplement:
* [ Python 文章收集 ] python內置函數 map/reduce/filter
沒有留言:
張貼留言