Hadoop分散式檔案系統
Hadoop的核心是HDFS和Map-Reduce,兩者只是理論基礎,不是什麼具體可使用的高階應用。
Hadoop有一個稱為HDFS的分散式系統(Hadoop Distributed FileSystem): 當資料集的大小超過一臺獨立物理計算機的儲存能力時,就有必要對它進行分割槽並存儲到若干臺單獨的計算機上。管理網路上跨多臺計算機儲存的檔案系統稱為分散式檔案系統。
而Map_Reduce是用於資料處理的一種程式設計模型,是hadoop的核心元件之一,可以通過map-reduce很容易在hadoop平臺上進行分散式的計算程式設計。
1.HDFS
HDFS以流式資料訪問模式來儲存超大檔案,它是谷歌的GFS提出之後出現的另外一種檔案系統,它有一定高度的容錯性,而且提供了高吞吐量的資料訪問,非常適合大規模資料集上的應用。
其設計特點為
- 大資料檔案
- 檔案分塊儲存
HDFS會將一個完整的大檔案平均分塊儲存到不同計算器上,它的意義在於讀取檔案時可以從多個主機讀取不同區塊的檔案,多主機讀取比單主機讀取效率要高得多。 - 硬體故障
HDFS認為所有計算機都可能會出問題,為了防止某個主機失效讀取不到該主機的塊檔案,它將同一個檔案塊副本分配到其它某幾個主機上,如果其中一臺主機失效,可以迅速找另一塊副本取檔案。 - 流式資料訪問:
HDFS的構建思路是這樣的:一次寫入,多次讀取是最高效的訪問模式。每次資料分析都涉及該資料集的大部分資料甚至全部,因此讀取整個資料集的時間延遲比讀取第一條記錄的時間延遲更重要。 - 廉價硬體:
Hadoop並不需要執行在昂貴可靠的硬體上,它是設計執行在商用硬體的叢集上的。因此對於龐大的叢集來說,節點故障的機率還是非常高的。HDFS遇到上述故障時,被設計成能夠繼續執行且不讓使用者察覺到明顯的中斷。 - 低時間延遲的資料訪問:
要求低時間延遲資料訪問的應用,不適合在HDFS上執行。HDFS是為高資料吞吐量應用優化的,這可能會以高時間延遲為代價。 - 大量的小檔案:
由於namenode將檔案系統的元資料儲存在記憶體中,所以因此該檔案系統能夠儲存的檔案總數受限於namenode的記憶體容量 - 多使用者寫入,任意修改檔案:
HDFS中的檔案可能只有一個writer,而且寫操作總是將資料新增到檔案的末尾。它不支援具有多個寫入者的操作,也不支援在檔案的任意位置進行修改。
1.1 HDFS優點
高吞吐量訪問,高效性:HDFS的每個block分佈在不同的rack上,在使用者訪問時,HDFS會計算使用最近和訪問量最小的伺服器給使用者提供。由於block在不同的rack上都有備份,所以不再是單資料訪問,所以速度和效率是非常快的。另外HDFS可以並行從伺服器叢集中讀寫,增加了檔案讀寫的訪問頻寬。
高容錯性,可靠性
容量擴充:因為HDFS的block資訊存放到namenode上,檔案的block分佈到datanode上,當擴充的時候,僅僅新增datanode數量,系統可以在不停止服務的情況下做擴充,不需要人工干預。分散式儲存和分散式計算是在叢集節點完成的,所以可以擴充套件至更過的叢集結點。
低成本:hadoop本身是執行在普通PC伺服器組成的叢集中進行大資料的分發及處理工作的,這些叢集是可以支援上千個結點的。
1.2 HDFS的關鍵元素
1.2.1 block:
HDFS也有塊的概念,預設為64MB,與單一磁碟上的檔案系統相似,HDFS上的檔案也被劃分為塊大小的多個分塊,作為獨立的儲存單元。
對分散式檔案系統中的塊進行抽象會帶來很多好處:
- 檔案的所有塊並不需要儲存在同一個磁碟上,因此它們可以利用叢集上的任意一個磁碟進行儲存。
- 塊非常適用於資料備份進而提供資料容錯能力和可用性。將每個塊複製到少數幾個獨立的機器上(預設為3個)。可以確保在發生塊,磁碟或機器故障後資料不丟失。如果發現一個快不可用,系統會從其他地方讀取另一個副本,而這個過程對於使用者來說是透明的。一個因損壞或機器故障而丟失的塊可以從其他候選地點複製到另一臺可以正常執行的機器上,以保證副本的數量回到正常水平。
1.2.2 namenode 和 datanode
HDFS叢集有兩類節點,並以管理者-工作者模式執行,即一個namenode(管理者)和多個datanode(工作者)。namenode管理檔案系統的名稱空間,它維護著檔案系統樹及整棵樹內所有的檔案和目錄。這些資訊以兩個檔案形式永久儲存在本地磁碟上。namenode也記錄著每個檔案中各個塊所在的資料節點資訊。
客戶端通過namenode與datanode互動來訪問整個檔案系統。客戶端提供一個檔案系統介面,因此使用者在程式設計時無需知道namenode和datanode也可實現其功能。
datanode是檔案系統的工作節點,用於儲存block塊檔案。它們根據需要儲存並檢索資料塊(受客戶端或namenode排程),並且定期向namenode傳送它們所儲存的塊的列表。
2. Map-Reduce
將檔案分散式儲存到硬碟是第一步,而從海量資料中提取我們需要的內容就是MapReduce做的事了。其是一套從海量源資料提取分析元素最後返回結果集的程式設計模型。MapReduce的基本原理就是:將大的資料分析分成小塊逐個分析,最後再將提取出來的資料彙總分析,最終獲得我們想要的內容。當然怎麼分塊分析,怎麼做Reduce操作非常複雜,Hadoop已經提供了資料分析的實現,我們只需要編寫簡單的需求命令即可達成我們想要的資料。
2.1 MapReduce其處理過程主要分為兩個步驟
1.對映(Mapping) 函式以key/Value資料對而作為輸入,而輸入資料經過業務邏輯計算產生若干仍舊以Key/Value形式表達的中間數。Map-Reduce計算框架會自動將中間結果中具有相同key值的記錄聚合到一起,並將資料傳送給Reduce函式內定義好的處理邏輯作為其輸入值。
2. 聚合(Reducing) 函式接收到Map階段傳過來的某個Key值及其對應的若干value值的中間結果,函式邏輯對這個Key對應的value內容進行處理。一般是對其進行累加、過濾、轉換等操作,生成Key/Value
形式的結果。
3. Hadoop經典案例
詞典統計:對每次出現的詞,詞頻+1,。但是當資料量非常大時,沒辦法在記憶體中維護一個這麼大的字典,就需要map-reduce過程了。
大概是分為下面幾個環節:
Map階段:
主要完成key-value對生成,這裡是每看到一個單詞,就輸出(單詞,1)的kv對
排序階段
對剛才的kv對進行排序,這樣相同單詞就在一塊兒了
Reduce階段
對同一個單詞的次數進行彙總,得到(詞,頻次)對
4. Hadoop的侷限性與不足
- 抽象層次低,需要手動辨別mapper和reducer邏輯,使用上覆雜
- 只提供Map和Reduce兩個操作,表達力欠缺
- 處理邏輯隱藏在程式碼細節中,沒有整理邏輯
- 中間結果也存放在HDFS上,IO和通訊開銷大
- 時延高,只適合batch資料處理,對於互動式資料處理和實時資料處理的支援不夠
- 對於迭代式資料處理效能比較差
而spark相比hadoop有著更多的優點: - 豐富的API,而後者只有map和reduce
- 中間結果不存磁碟,而hadoop需要把中間結果寫進磁碟
- 執行緒池模型減少任務啟動開銷,而hadoop任務排程和啟動開銷很大
- 能充分利用記憶體,速度快,減少IO操作
- 可以避免排序操作,而hadoop中map和reduce都需要排序
- spark更適合迭代計算(機器學習演算法),而hadoop不適合