天天看點

五分鐘深入 Hadoop 核心

五分鐘深入 Hadoop 核心

五分鐘深入 Hadoop 核心

回顧

上篇文章我們說到,Hadoop 的工作下圖所示,負責把 mapper function 裝載到要運作 mapper 的機器上,然後執行 mapper function,之後負責把 mapper 的結果 shuffle 到要運作 reducer 的機器上,下載下傳 reducer 運作得到最終結果。

五分鐘深入 Hadoop 核心

那麼下面,我們就通過學習 Hadoop 的 component 架構,來了解 Hadoop 是怎麼做到這幾步的。

架構

JobTracker

我們上面說了:Hadoop 是一個很強大的 Framework, 那使用者怎麼使用呢?Hadoop 提供了一個叫做 JobTracker 的 component, 去等待使用者送出的Hadoop 任務。

具體說來, 使用者告訴 JobTracker 要運作什麼 mapper function 和 reducer function, 這個非常 make sense 對不對?Hadoop 就是要幫助使用者運作mapper 和 reducer, 不知道他們是什麼樣的怎麼行?

那 Mapper 和 Reducer 長什麼樣呢?

我們用 Java 舉例:使用者需要用一個 class 實作 Hadoop 定義的 Mapper 接口,使用者在這個 class 裡提供 mapper function 的具體實作(當然 Hadoop 也支援别的語言),同樣的 reducer function 也是使用者實作 Reducer 接口的 class.

既然是 java, 這兩個 class 就會存在 jar 中,是以使用者要告訴 JobTracker 這個 jar 的路徑是什麼,也要告訴這個 jar 裡,哪個 class 是 mapper, 哪個是 reducer. 隻有這樣,JobTracker 才能幫助使用者把 mapper function 和 reducer function 部署到要運作的機器上。

除此之外,使用者還要告訴 JobTracker 要處理的資料在哪裡。實際上,資料存儲使用的是 HDFS 檔案系統。我們之後會為大家詳細介紹,這裡請大家把 HDFS 想象成普通電腦裡的檔案系統就好,使用檔案夾結構,比如 Linux 下的 /root, /usr, /etc ……

特别的是,HDFS 為了擴大容量,把檔案存在很多台機器上,但使用者不需要知道分布的具體細節:隻要告訴 HDFS 我要哪個目錄下的檔案,HDFS 就會很神奇的找到相應的機器為使用者讀取資料(這就是分布式檔案系統的特點)。

使用者需要告訴 JobTracker 這個任務裡需要處理的資料資料存在 HDFS 的哪個目錄下面就 OK 啦。同樣的,使用者也要告訴 JobTracker 這個 Hadoop 任務的輸出在哪裡,通常也是一個HDFS上的目錄。

JobTracker 是以一個程序的形式運作的,一直等待使用者送出的任務。說白了,就好像大家玩過的掃雷:你打開這個遊戲後,那個視窗一直等待你點選滑鼠。我們要記住的是一個 Hadoop cluster 裡隻有一個 JobTracker.

JobTracker 接收了使用者送出的任務之後它做什麼呢?

它就要挑選機器來執行 mapper / reducer function.

我們剛才說過,任務要處理的資料被 HDFS 管理。使用者是不知道資料存在哪些機器上的,而隻要告訴 HDFS 一個目錄,它就知道到哪台機器取。

這樣 JobTracker 告訴 HDFS 使用者送出的輸入資料的路徑,HDFS 就會告訴 JobTracker 資料在哪台機器上,Job Tracker 也就可以把 mapper function 運作在那台機器上,這樣就可以達到非常好的運作效率:mapper function 處理本台機器上的資料。

我們知道 HDFS 和 Hadoop 運作在一組機器上,那這些機器有可能還在運作别的軟體,或者處理之前送出的任務。這就有可能造成:明明資料就在 Host A 上,但是 Host A 太忙,沒有空閑資源運作 mapper function, 這種情況怎麼辦呢?

這樣的情況下,JobTracker 可能就要退而求其次了:把 mapper function 運作在一個離資料很近的機器上,比如和資料所在機器網絡連接配接速度很快的機器 Host B. 這樣,在資料從 Host A 讀取到 Host B之後,mapper function 就可以的繼續執行。

說起來簡單,但是前提是 JobTracker 需要知道每台機器忙不忙,否則它怎麼知道存資料的目前機器不能用,或者選擇另一個不忙的機器呢?

Hadoop 所做的就是為每一台機器定義 N 個 slot, 就是能同時運作 N 個 mapper function 或者 reducer function, 用幾個 slot 被占用評斷機器忙不忙。

一個機器有幾個 slot 是機器管理者根據機器 cpu 和記憶體情況設定的,在使用者送出任務以前就定義好了。Jobtracker 通過追蹤每一台機器上還有幾個 slot可以用來判斷機器的繁忙程度。

這裡你是不是覺得 Hadoop 繞彎子?直接看每台機器 cpu 和 memory 不就好了,為什麼還通過 slot 表示?恭喜你,你已經有 Hadoop 2.0 architect 的水準了:) 我們之後讨論哈。

之前說過 JobTracker 隻是運作在一台機器上的一個程序,那它如何知道其他機器有哪些 slot 呢?

答案是:它是通過 TaskTracker 來完成的。

TaskTracker

TaskTracker 是運作在每一台機器上的一個 daemon. 它的首要任務就是 keep track of 本台機器有哪些 slot.

這個工作比較簡單:TaskTracker 啟動時,它從機器管理者寫的 config file 裡讀出這台機器有幾個 slot; 當 JobTracker 配置設定給這台機器一個 mapper function 或者 reducer function, 那 TaskTracker 就會記錄下 slot 減少一個。

TaskTracker and Slots

TaskTracker 有一個 heartbeat 機制,就是每隔幾秒鐘或者幾分鐘向 JobTracker 發一個資訊,告之目前機器還有幾個 free slot. 這樣,JobTracker 就知道所有 Hadoop 機器資源使用情況。那麼下次 JobTracker 收到使用者送出的任務時,就有足夠的資訊決定向哪個機器配置設定 mapper 或 reducer 任務。

JobTracker task allocation to TaskTrackers

那麼當 JobTracker 決定了給機器 a, c, e, f (out of 機器 a-h) 配置設定任務之後,JobTracker 就向每一台機器發消息,告訴它你要執行的 mapper 或者 reducer function 是什麼。

在Java裡,這一步就是告訴每一台機器 jar 的路徑,以及 mapper class 和 reducer class 的名稱。

如果配置設定的是 mapper function, JobTracker 還要告訴 TaskTracker mapper 要處理的資料路徑。我們之前提到了 JobTracker 會盡可能把 mapper 配置設定到資料所在的機器,這樣 mapper 可以從本地檔案讀取資料了。

當 TaskTracker 得知所有這些資訊之後,就可以運作 mapper/reducer.

我們之前說 Hadoop 會去執行 mapper function 和 reducer function, TaskTracker 就是 Hadoop 裡負責這個任務的 component.

mapper function 和 reducer function 運作結束以後,TaskTracker 會報告給 JobTracker 運作結果。當所有 mapper 和 reducer 運作結束後,整個 Job 就完成了!

Hadoop / MapReduce 作為非常成熟的大資料架構,已經被部署在很多知名公司的實際系統中、發揮着重要作用,比如 Amazon, Facebook, Apple 等等。