天天看點

跨機房的hadoop叢集

http://www.cppblog.com/whspecial/archive/2013/10/27/203940.html

首先需要說明一點,跨機房hadoop可能應用場景并不是很多,國内像BAT這種巨頭也許需要,但是大部分的中小公司也許并不需要這個,也許這是個屠龍之技,呵呵。

把這個問題分三段來講,第一段是問題出現的背景,第二段是解決該問題的難點,第三段是最終的解決方案。

(一) 背景:

先要看下為什麼需要做一個跨機房的大叢集?

大叢集的優點在于資料管理和授權容易(這個問題在一個多部門的大公司還是很重要的);跨部門的使用資料容易,無需重複拉取資料。

在叢集達到一定規模時,單機房(機房内的容量是有限的)已經無法滿足叢集的需求了,要想一勞永逸的解決問題,需要建設一個跨機房的hadoop叢集。

(二)技術挑戰:

2.1 NameNode的性能問題:

         在管理一個巨大的hadoop叢集時,由于原始的Namenode是單節點,是以會成為一個性能瓶頸,遇到的性能問題主要包括兩方面:存儲容量問題(存儲中繼資料)和計算壓力(處理rpc請求,修改記憶體樹時候需要全局鎖)問題。

         其中存儲容量問題可以依賴記憶體的垂直擴充來解決,但是計算壓力卻很難通過提升硬體來解決(因為目前廠商的主要發展方向是多核,而非提高主頻)

2.2機房之間的網絡限制:

         機房之間的網絡永遠是個硬體條件的限制,跨機房的網絡傳輸帶來了資料延時和帶寬限制:

1, 延時一般是在10ms之内,而hadoop上大部分運作的是離線作業,基本可接受

2, 帶寬限制的問題比較大,因為單機房内的點對點帶寬一般是在1Gbps,而機房之間的帶寬确在20Mbps左右,非常有限。

2.3資源組之間的管理

         每個部門可以看做一個資源組,它們可能會互相使用對方的資料,是以如何規劃計算和存儲的位置就很重要,否則會在多個機房之間出現大量的資料拷貝。

(三)解決方案:

先看下整個跨叢集hadoop的架構圖:

跨機房的hadoop叢集

重點介紹裡面三點,也就是和上面三個問題相對應的:

1, 可以看到這裡畫出了兩個NN(namenode),它們實際上還是屬于一個hadoop叢集,這是業界裡的一個解決方案:HDFS Fedaration,它為了解決中繼資料節點性能問題;

2, 可以看到這裡有一個cross node節點,它是用來在兩個機房之間同步資料的,它的設計考慮到了機房間的網絡限制;

3, 最後是groupA、groupB,這是為了解決資料産出方和使用方關系來用的。

3.1 Federation

Federation相關資料見:

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Federation.html#HDFS_Federation

跨機房的hadoop叢集

為了水準擴充Namenode,federation使用了多個互相獨立的namenode。它們之間互相不需要通信,每個datenode需要向全部namenode注冊并發送資訊。

BlockPool是屬于一個namenode的block集合,每個blockpool之間也是互相獨立的。

         在federation裡,有一個需要關注的問題,就是多個namenode的位址如何對使用者進行透明?它采用的解決方案是目錄樹挂載的方案(社群有個viewFS,應該就是為了解決這個問題):熟悉linux或者nfs的朋友應該都知道mount這個概念,目錄樹挂載就是這個意思。

不過使用目錄樹挂載也存在着一個問題,就是各個子目錄下的存儲資源需要人為的介入管理,不能出現嚴重的不均。

3.2 crossNode

         機房間的網絡限制要求不能出現大規模、長時間的資料拷貝,需要一個專門管理機房間資料拷貝的程序,叫做crossNode。它是獨立部署的一個節點,和中繼資料節點是分離的。

         它能提供的功能概括來說主要包括以下三點:

a) 根據預置的跨機房檔案,進行資料拷貝

b) 處理實時的資料拷貝請求

c) 進行跨機房的資料流量控制

如何得知跨機房檔案清單?

         由于離線任務基本都是定時觸發的,可以根據對曆史作業的分析來形成一個跨機房檔案清單

3.3   資源組之間的管理

各個資源組之間存在資料的依賴,我們希望通過資源組管理,能實作大部分任務在本機房内産出資料,隻有少量跨機房産出資料;大部分任務讀取本機房的資料副本,隻有少量跨機房讀取資料。

為了辨別資源組之間的資料依賴性,定義一個資源組之間的距離概念:一個資源組通路另一個資源組的資料量越多,則兩者的距離越近,應該将距離接近的資源組放在同一個機房内。

為了讓計算和産出盡可能地靠近,使用一個MRProxy,對于不同類型的任務做不同處理:

a)            離線計算:跨機房清單中的資料正在傳輸中(DC1->DC2),DC2上的 Job 被暫停排程,等待傳輸完畢

b)            Ad-hoc查詢:DC2上的 Job 需要讀DC1上的資料,Job暫停排程,通知 CrossNode,資料傳輸完畢後繼續排程

c)             特殊情況:跨機房資料 Join,DC1大表,DC2小表,Job 排程到DC1上,跨機房直接讀取DC2資料,無需等待

由于是根據視訊和ppt整理,并沒有代碼或者文檔,是以可能有些地方的了解有偏差,歡迎來提意見~

繼續閱讀