1. 程式人生 > >hadoop原理學習——hdfs讀資料

hadoop原理學習——hdfs讀資料


       當客戶端打算從 HDFS 中取資料的時候,例如一個作業的結果,同樣需要首先與 Name Node 打交道,的值想取的資料被存放在哪裡,Name Node 同樣會給客戶端一個清單,然後客戶端去 Name Node 指定的某個 Data Node 中拿資料(通過TCP 50010 埠)。         客戶端不會逐個 Data Node 去拿資料,而是由 Name Node 指定的那個 Data Node 分別去其他的 Data Node 那裡拿資料。好像客戶端在說:“Name Node,告訴我資料都在哪兒?”,Name Node 說“他們在 Data Node x、y、z,你去 Data Node x 拿資料吧”,客戶端於是告訴 Data Node X,你把 y 和 z 的資料一起拿來並送到我這裡來。

       還有一種情況,其中一個 Data Node 的守護程序本身將需要讀取HDFS的某些資料塊,例如Data Node 被要求來處理資料,但是他本地沒有,因此它必須從另一個數據節點中解鎖資料並通過網路傳輸到本地開始處理。         在這裡,Name Node 同樣會考慮“機架意識”,並通過機架意識來找到最近的 Data Node 並將資料傳輸過去。         現在,我們已經知道 File.txt 被分發到不同的 Data Node上,也知道了他們是如何運轉的了,現在我們就開始看看 Hadoop 是具體如何使用 Map Reduce 框架來進行快速運算的吧。         第一步是 Map 階段,在我們的例子中,我們要求我們的 Hadoop 叢集計算出郵件中“Refund”單詞的數量。 在一開始,客戶端會提交一個 Map Reduce 作業,例如:“在 File.txt 中有多少個 Refund?”當然,這句話是翻譯自 Java 語言,通過 Java 編寫好一個 Map Reduce 作業並提交作業給 Job Tracker。Job Tracker 與 Name Node 協調得到哪些 Data Node 包含 File.txt 的資料塊。 然後 Job Tracker 開始在這些 Data Node 上啟用 Task Tracker。 Task Tracker 開始 Map 作業並監視任務進度。Task Tracker同時也提供心跳和任務狀態給 Job Tracker。         當所有的 Map 任務完成後,每個節點都會存放一個結果在其本地物理磁碟上,這被稱為“中間資料”。接下來,就是將這些中間資料通過網路傳送給一個執行 Reduce 任務的節點。

       Job Tracker 總會盡量挑選處理 Map 任務的節點來處理 Reduce 任務,因為 Map 處理的資料就在本地,不需要通過網路來傳輸,但是,Job Tracker 並不保證一定會挑選本地節點,因為可能 Map 任務較多,沒有資源來執行 Reduce 任務,這樣,就會挑選其他的節點來完成 Reduce 任務。
        同樣,Job Tracker 會根據機架意識來挑選同一機架內的其他節點來完成 Reduce 任務。         第二步就是 Reduce,當 Map 生成了中間資料後,現在我們需要將所有的這些中間資料彙總計算生成最終的資料。         Job Tracker 可能會挑選叢集中任意一個節點來作為 Reduce 任務的處理伺服器,此時可能會一次性有大量的資料湧向 Reduce 任務所在的節點伺服器,這種情況通常被稱為“Incast”或“fan-in”。這需要牛逼點的交換機以及內部流量管理和足夠的緩衝區(不要太大,也不要太小)。緩衝區的大小最終可能會造成不必要的附帶損害(流量相關)。但這是另外一個話題。         現在 Reduce 已經收集到了所有從 Map 計算得到的中間資料,並可以開始最後階段的計算,在本文的例子中,我們僅僅是簡單的將各個結果相加即可得到“Refund”的數量。然後將結果寫入到 Results.txt 檔案。客戶端可以從HDFS中讀取Results.txt 檔案,並將工作視為完成。         這個例子並沒有造成大量的中間資料和流量佔用問題,但是實際生產環境可能會造成大量的中間資料和頻寬瓶頸。這就是 Map Reduce 作業中程式碼如何計算的一門學問,如果用最優化的程式碼來完成作業是需要我們來決定的。

        如果在 Hadoop 叢集運算過程中添加了新的機架,那麼資料的負載均衡就成為了一個問題所在,如何讓新增加的機架迅速的融入到計算環境中來成為了一個很迫切的問題。

        是的,Hadoop的確包含一個名為 Balancer 的工具。Balancer作業與節點,並試圖提供計算平衡。但是預設的 Balancer 可利用的網路頻寬是非常低的 1mb/s。不過此設定可以通過hdfs-site.xml 中的 dfs.balance.bandwidthPerSec 引數來設定。         Balancer 可以很好的照顧你的叢集。鑑於 Balancer 的預設頻寬設定,他可能需要較長的時間來完成均衡的操作,可能幾天,也可能幾周。