MapReduce是一個可以對大量數據進行分佈式處理的軟件框架,MapReduce的重要創新是當處理一個大數據集查詢時會將其任務分解並在運行的多個節點中處理。
當數據量很大時就無法在一臺服務器上解決問題,此時分佈式計算優勢就體現出來。將這種技術與Linux服務器結合可獲得性價比極高的替代大規模計算陣列的方法。
對於分佈式計算,每個服務器必須具備對數據的訪問能力,這就是HDFS(Hadoop Distributed File System)所起到的作用。
HDFS與MapReduce的結合是強大的
(1)在處理大數據的過程中,當Hadoop集羣中的服務器出現錯誤時,整個計算過程並不會終止。
(2)HFDS可保障在整個集羣中發生故障錯誤時的數據冗餘。當計算完成時將結果寫入HFDS的一個節點之中。
(3)HDFS對存儲的數據格式並無苛刻的要求,數據可以是非結構化或其它類別。相反關係數據庫在存儲數據之前需要將數據結構化並定義架構。
(4)開發人員編寫代碼責任是使數據有意義。Hadoop MapReduce級的編程利用Java APIs,並可手動加載數據文件到HDFS之中。
Namenode是整個文件系統的管理節點。它維護着整個文件系統的文件目錄樹,文件/目錄的元信息和每個文件對應的數據塊列表, 接收用戶的操作請求。不可缺少。
提供真實文件數據的存儲服務。 缺少一個可以由其他單位填補。
文件塊: 最基本的存儲單位。
1、客戶端調用Fi leSystem 實例的create 方法,創建文件。NameNode 通過一些檢查,比如文件是否存在,客戶端是否擁有創建權限等;通過檢查之後,在NameNode 添加文件信息。注意,因爲此時文件沒有數據,所以NameNode 上也沒有文件數據塊的信息。 2、創建結束之後, HDFS 會返回一個輸出流DFSDataOutputStream 給客戶端。 3、客戶端調用輸出流DFSDataOutputStream 的write 方法向HDFS 中對應的文件寫入數據。 4、數據首先會被分包,這些分包會寫人一個輸出流的內部隊列Data 隊列中,接收完數據分包,輸出流DFSDataOutputStream 會向NameNode 申請保存文件和副本數據塊的若干個DataNode , 這若干個DataNode 會形成一個數據傳輸管道。DFSDataOutputStream 將數據傳輸給距離上最短的DataNode ,這個DataNode 接收到數據包之後會傳給下一個DataNode 。數據在各DataNode之間通過管道流動,而不是全部由輸出流分發,以減少傳輸開銷。 5、因爲各DataNode 位於不同機器上,數據需要通過網絡發送,所以,爲了保證所有DataNode 的數據都是準確的,接收到數據的DataNode 要向發送者發送確認包(ACK Packet ) 。對於某個數據塊,只有當DFSDataOutputStream 收到了所有DataNode 的正確ACK. 才能確認傳輸結束。DFSDataOutputStream 內部專門維護了一個等待ACK 隊列,這一隊列保存已經進入管道傳輸數據、但是並未被完全確認的數據包。 6、不斷執行第3 - 5 步直到數據全部寫完,客戶端調用close 關閉文件。 7、DFSDataInputStream 繼續等待直到所有數據寫人完畢並被確認,調用complete 方法通知NameNode 文件寫入完成。NameNode 接收到complete 消息之後,等待相應數量的副本寫入完畢後,告知客戶端。