克服部署挑戰(zhàn),讓Hadoop和云成為最佳拍檔
Hadoop 和云似乎是***搭檔。它們都包含靈活和分布式的處理與存儲,而且都帶有一個靈活的實(shí)例系統(tǒng)。它們還使您能夠根據(jù)數(shù)據(jù)和處理需求來擴(kuò)大和收縮 Hadoop 集群。但這會引發(fā)各種管理與調(diào)度問題。本文將了解所有這些問題,并描述基于云的 Hadoop 部署的挑戰(zhàn)與優(yōu)勢。
了解云部署的范圍
Hadoop 系統(tǒng)是一個用起來頗有挑戰(zhàn)性的環(huán)境,但由于云環(huán)境所具有的限制(與自由),云部署會引入額外的復(fù)雜性。
例如,借助云中的 Hadoop,如何處理可變的集群規(guī)模與信息的有效分布?如何有效地?cái)U(kuò)大和收縮云環(huán)境,以便應(yīng)付您期望處理的 Hadoop 負(fù)載?如何計(jì)劃和控制任務(wù)與處理,以便在云實(shí)例可用時(shí)***限度地利用它們?
根據(jù)具體云服務(wù)的不同,云部署的優(yōu)勢與劣勢會對這些環(huán)境中 Hadoop 的使用產(chǎn)生相應(yīng)的影響。請記住,與公有云相比,私有云服務(wù)的約束與限制存在巨大差異。如果使用自己的 VM 環(huán)境或諸如 OpenStack 這樣的解決方案時(shí),那么您將擁有極大的靈活性來定制服務(wù)與功能。
為了讓云中的 Hadoop 發(fā)揮***功效,您首先需要了解已經(jīng)存在的云部署解決方案,以及它們對于 Hadoop 環(huán)境有哪些影響。
基于服務(wù)的云部署
某些云解決方案完全基于某個特定服務(wù),該服務(wù)將會加載并處理數(shù)據(jù)。例如,借助 IBM Bluemix®,您可以基于 IBM InfoSphere® BigInsights™ 配置一個 MapReduce 服務(wù),該服務(wù)可以處理高達(dá) 20GB 的信息。但 Hadoop 服務(wù)的大小、配置與復(fù)雜性是不可配置的。其他基于服務(wù)的解決方案也提供同樣類別的復(fù)雜性。
您必須根據(jù)自己的需要來選擇或配置服務(wù)解決方案的大小,因?yàn)槟赡軣o法控制磁盤、I/O、CPU 或 RAM 的可用性。
確定需求的惟一途徑就是通過測試。在計(jì)算結(jié)果上再增加 25% 或更高,以便為使用率***和最復(fù)雜的情況留出余地。
基于(虛擬)機(jī)器的云部署
盡管云環(huán)境完全基于機(jī)器或虛擬機(jī)風(fēng)格的部署,Hadoop 在虛擬環(huán)境中的安裝方式與在物理機(jī)器上極為相似。您可以對可配置參數(shù)的范圍進(jìn)行配置,而這些參數(shù)會改變您針對集群部署的選擇。
每個節(jié)點(diǎn)的配置尤其需要認(rèn)真考慮,包括 CPU、RAM、磁盤容量和磁盤 I/O 速度。盡管優(yōu)秀的 Hadoop 集群部署可以隱藏節(jié)點(diǎn)之間的鏡像差異,但在需要標(biāo)準(zhǔn)支持和提高速度與運(yùn)算能力時(shí),了解配置可以幫助您調(diào)整部署的規(guī)模。
和所有基于云的系統(tǒng)或安裝部署一樣,配置取決于以下因素:
CPU
精確的 CPU 計(jì)算或任意單元。除非部署的是基于 YARN 的解決方案,否則應(yīng)考慮為集群內(nèi)所有的數(shù)據(jù)與處理節(jié)點(diǎn)部署完全相同的配置。這種方法讓計(jì)算所需的集群規(guī)模與容量變得更輕松。針對基于 YARN 的部署,可以將集群內(nèi)不同節(jié)點(diǎn)配置為支持和處理不同級別的 CPU 容量。例如,這種方法可以使用指定項(xiàng)目的特定高性能 CPU 節(jié)點(diǎn)組來擴(kuò)展現(xiàn)有集群。
RAM
所有節(jié)點(diǎn)都至少應(yīng)該擁有 4GB 空間,但此空間的大小可能會受到實(shí)際可用空間的限制。此外還要記住,一定要留出一些空間用于文件緩存,這樣可以提高性能。有些解決方案(如 HBase)可以使用額外的內(nèi)存。
存儲器容量
確保對操作系統(tǒng)和 Hadoop 存儲使用了單獨(dú)的卷,這種實(shí)踐可以提高性能并讓擴(kuò)展 HDFS 存儲變得更簡單。在縮放集群大小之前,應(yīng)估計(jì)要使用的存儲容量,并標(biāo)準(zhǔn)化指定的大小。這種方法可確保在整個集群上實(shí)現(xiàn)***程度的平均分布。
磁盤 I/O
HDFS 環(huán)境應(yīng)該限制磁盤 I/O 的暴露,因?yàn)樗泄ぷ鞫挤植荚诩荷稀H欢跊]有必要的情況下,不要將磁盤 I/O 限制到節(jié)點(diǎn)無法有效訪問和處理數(shù)據(jù)的程度。在眾多云環(huán)境中,基準(zhǔn)或***的磁盤 I/O 配置可能過低,甚至降低了總體性能。更糟糕的是,如果無法確保磁盤 I/O 速率位于某個特定水平上,那么在處理任務(wù)的過程中,可能會遭遇性能下降。
網(wǎng)絡(luò) I/O
Hadoop 需要進(jìn)行大量的網(wǎng)絡(luò) I/O 才能完成操作;除了原始寫入之外,每個文件都至少被復(fù)制兩次,而且 MapReduce 操作期間使用的數(shù)據(jù)都必須采用類似的方式通過網(wǎng)絡(luò)進(jìn)行傳輸。在眾多云環(huán)境中,網(wǎng)絡(luò)性能是受限的,這可能成為部署中的一個限制因素。
混合型云部署
在一些混合型云部署中,有些元素是固定的,而其他元素是可變的。在這種情況下,您可以在某些限制下定義特定的機(jī)器容量,同時(shí)控制節(jié)點(diǎn)的總體數(shù)量。在這些 Hadoop 云部署中,選擇正確的 RAM 與 CPU 組合,然后調(diào)整集群,使之滿足這種配置。
#p#
擴(kuò)展與收縮 Hadoop 集群
云環(huán)境最吸引人的方面之一就是能夠擴(kuò)展和收縮 Hadoop 集群的規(guī)模,使之滿足將要提交的任務(wù)對于負(fù)載與存儲的要求。在以基于服務(wù)架構(gòu)為基礎(chǔ)的云環(huán)境中,擴(kuò)展與收縮通常是通過云服務(wù)的控制部分進(jìn)行管理的。
擴(kuò)展集群通常很容易,因?yàn)橥ㄟ^給現(xiàn)有配置增加更多節(jié)點(diǎn),就可以更加輕松地使用額外的資源。收縮集群困難一些,有可能會導(dǎo)致性能受損和任務(wù)中斷。
根據(jù)您選擇的云環(huán)境,用于增加或減少 Hadoop 集群規(guī)模的具體方法也會有所不同?;诜?wù)的云環(huán)境有一些內(nèi)置的伸縮功能?;谔摂M機(jī)的單元需要在集群內(nèi)進(jìn)行部署、安裝軟件和授權(quán)。
使用有彈性的 Hadoop 集群
真正有彈性的 Hadoop 集群需要大量的工作與管理。即便是啟動云服務(wù),大量增加節(jié)點(diǎn),稍后再刪除它們,實(shí)際的數(shù)據(jù)增加與管理工作也會很復(fù)雜。
大問題在于,對于要以***效率處理問題的集群而言,真正需要做的是將數(shù)據(jù)與工作負(fù)載分布到集群上。
此外,還要考慮這些處理所花費(fèi)的時(shí)間。甚至在最理想的情況下,啟動每個節(jié)點(diǎn)并讓它們開始處理工作的過程需要花費(fèi) 5 到 10 分鐘。
收縮規(guī)模一直是更為復(fù)雜的問題,因?yàn)楸仨毐苊饪赡鼙4嫱粩?shù)據(jù)塊的所有副本的節(jié)點(diǎn)停止運(yùn)行。為了縮小集群的規(guī)模,必須首先執(zhí)行再次平衡,確定數(shù)據(jù)被正確存儲,而且數(shù)據(jù)副本分布在余下的節(jié)點(diǎn)上,如果需要再次縮小規(guī)模,只需重復(fù)以上過程即可。
擴(kuò)展 Hadoop 集群
使用新節(jié)點(diǎn)擴(kuò)展集群是一種常見的需求,過程也很簡單。通常,在云環(huán)境中增加節(jié)點(diǎn)時(shí),新節(jié)點(diǎn)的大小與容量與現(xiàn)有節(jié)點(diǎn)相同。這種方法有助于未來的容量規(guī)劃。這條通用規(guī)則不適用于以下情形:
在您計(jì)劃使用更多空間、CPU 或 RAM 容量升級節(jié)點(diǎn)時(shí)。
在集群到達(dá) 80% 容量之前擴(kuò)展集群時(shí)。僅在當(dāng)前容量達(dá)到 80% 時(shí)才增加節(jié)點(diǎn)數(shù)量。被動等待擴(kuò)展集群可能會導(dǎo)致容量不夠用。
決定增加更多節(jié)點(diǎn)后,實(shí)際的過程則十分簡單:
- 向云環(huán)境添加新節(jié)點(diǎn)。
- 在每個新節(jié)點(diǎn)上安裝 Hadoop。(從鏡像獲取一個預(yù)先安裝好的節(jié)點(diǎn)是最容易的方式。)
- 在主節(jié)點(diǎn)上的 conf/slaves 文件中添加新節(jié)點(diǎn)的信息。
- 啟動如 清單 1 中所示的 Hadoop 流程。
清單 1. 啟動 Hadoop 流程
- $ hadoop-daemon.sh start datanode
- $ hadoop-daemon.sh start tasktracker
不同的 Hadoop 變體可能有不同的步驟,但這些屬于基本步驟。您可能還想確保主節(jié)點(diǎn)通過檢查 dfs.hosts 配置能夠正確識別它們。為了檢查它們是否被正確識別,可以運(yùn)行 清單 2 中的代碼。
清單 2. 確保 Hadoop 變體被正確識別
- $ hadoop mradmin -refreshNodes
- $ hadoop dfsadmin -refreshNodes
這段代碼針對 MapReduce 任務(wù)處理來設(shè)置節(jié)點(diǎn),但沒有移動任何現(xiàn)有數(shù)據(jù)。下一步驟是確保移動文件塊。
重新分布已存儲的數(shù)據(jù)塊
可以在集群內(nèi)移動已存儲的數(shù)據(jù)塊,以便更好地使用增加的節(jié)點(diǎn),移動的方法有如下幾種:
將文件復(fù)制到不同的目錄。這項(xiàng)操作將自動重新分布數(shù)據(jù)塊,因?yàn)槲募挥行е貙懙?HDFS 中。這個步驟需要額外的工作,但它可以與工作流同時(shí)執(zhí)行。
臨時(shí)增加復(fù)制容量。默認(rèn)值為 3。將這個值提高到 4 將向集群添加新的數(shù)據(jù)塊副本。將這個值減少為 3 將從某些機(jī)器上移除數(shù)據(jù)塊。
顯式啟動一次調(diào)整操作:
- $ start-balancer.sh
請記住,啟動任意類型的調(diào)整操作都需要大量的 I/O 與網(wǎng)絡(luò)傳輸,直到調(diào)整完成為止。
收縮 Hadoop 集群
收縮 Hadoop 集群時(shí)要考慮以下因素:
- 是否能安全地縮小集群規(guī)模? 如果有任務(wù)正在運(yùn)行,在每個節(jié)點(diǎn)上運(yùn)行一次停止運(yùn)行過程(decommission process)。此過程將刪除節(jié)點(diǎn)并以可重新開始的方式停止所有正在運(yùn)行的任務(wù)(使用狀態(tài) KILLED_UNCLEAN),這樣當(dāng)下次檢查隊(duì)列并且 JobTracker 重新分配任務(wù)時(shí),就可以在可用節(jié)點(diǎn)上重新安排任務(wù)執(zhí)行。
- 是否能夠在其他節(jié)點(diǎn)上釋放空間?請記住,縮小集群規(guī)模就是減少用于復(fù)制數(shù)據(jù)的計(jì)算機(jī)數(shù)量,并提高剩余節(jié)點(diǎn)上的磁盤使用。
注意: 一次停止運(yùn)行的節(jié)點(diǎn)絕不能超過一個。
云環(huán)境的魅力在于,可以在 100 個節(jié)點(diǎn)的集群中啟動 20 個新節(jié)點(diǎn)來應(yīng)對高峰,稍后便可移除它們。這種方法使得集群面臨較少的風(fēng)險(xiǎn),甚至可能完全移除已存儲數(shù)據(jù)的風(fēng)險(xiǎn)。停止運(yùn)行過程會自動在余下節(jié)點(diǎn)中重新分布數(shù)據(jù)副本。盡管可以減少大的數(shù)據(jù)塊,但這樣做會給系統(tǒng)帶來很大的負(fù)載。但會減少多個數(shù)據(jù)塊中的節(jié)點(diǎn)。
停止運(yùn)行的最安全方法是分階段完成停止運(yùn)行過程。例如,如果要移除 20 個節(jié)點(diǎn),每次停止運(yùn)行 3 到 5 個節(jié)點(diǎn):
將要移除的節(jié)點(diǎn)從集群添加到 dfs.hosts.exclude 設(shè)置。
運(yùn)行 dfs 刷新來更新節(jié)點(diǎn)列表:
- $ hadoop dfsadmin -refreshNodes
刷新 MapReduce 配置:
- $ hadoop mradmin -refreshNodes
節(jié)點(diǎn)現(xiàn)在被標(biāo)記為已停止運(yùn)行。在節(jié)點(diǎn)最終停止運(yùn)行并安全移除機(jī)器之前,要將數(shù)據(jù)副本復(fù)制到其他集群中的其他主機(jī)。
現(xiàn)在,對每個額外的數(shù)據(jù)塊重復(fù)這些步驟。通常,此過程花費(fèi)的時(shí)間要長于擴(kuò)展過程,但它消除了數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
升級節(jié)點(diǎn)配置
云環(huán)境的主要優(yōu)勢之一是可以靈活地修改單獨(dú)節(jié)點(diǎn)配置,甚至可以根據(jù)需要完全更新和替換節(jié)點(diǎn)。您可以分階段地完成這些修改,將前面描述的擴(kuò)展和收縮過程合二為一。您甚至可以將這個過程作為針對特定任務(wù)的計(jì)劃擴(kuò)展與收縮過程的一個組成部分。
例如,要將 20 個數(shù)據(jù)節(jié)點(diǎn)從 4 CPU 系統(tǒng)變?yōu)?8 CPU 系統(tǒng),可以執(zhí)行以下步驟:
- 添加 4 個具有新配置的新節(jié)點(diǎn)。
- 將它們添加到配置。
- 啟動服務(wù)。
- 執(zhí)行調(diào)整。
- 從舊配置停止運(yùn)行 4 個數(shù)據(jù)節(jié)點(diǎn)
- 重復(fù)這些步驟。
結(jié)果是獲得了一個首先通過添加新配置節(jié)點(diǎn)進(jìn)行擴(kuò)展,然后通過移除舊配置節(jié)點(diǎn)進(jìn)行收縮的集群。
#p#
任務(wù)調(diào)度與分布
根據(jù)任務(wù)調(diào)度需要確定擴(kuò)展與收縮集群的時(shí)間,以及處理該過程所需的容量大小。
借助云模型,您有時(shí)可以使用多個單獨(dú)的集群代替一個大型集群,從中獲得一些優(yōu)勢。您可以根據(jù)數(shù)據(jù)復(fù)雜性和集群規(guī)模來調(diào)度工作。例如,一個較大的處理任務(wù)可能需要更多的節(jié)點(diǎn),但需要的存儲較少,而其他任務(wù)可能需要更多的存儲,但需要的處理節(jié)點(diǎn)較少。
在云中進(jìn)行處理時(shí),嘗試在***化集群配置的同時(shí)不擴(kuò)展或增加集群規(guī)模。很多工具都能做到這一點(diǎn),包括基本的任務(wù)調(diào)度和使用復(fù)雜的工作流,比如 IBM InfoSphere BigInsights 中的應(yīng)用程序管理器和 Oozie。我們的目標(biāo)是在不增加成本的情況下讓集群獲得***性能,并確保不會讓集群過載到無法輕松擴(kuò)展或恢復(fù)的程度。
應(yīng)對存儲與負(fù)載高峰
最復(fù)雜的過程很可能是了解如何應(yīng)對突如其來的存儲與負(fù)載高峰。根據(jù)部署環(huán)境,可用的選擇可能有很大差異。對于您可以改變的一些因素,當(dāng)您意識到集群已經(jīng)超出容量時(shí),您會怎樣做?
顯著的觀點(diǎn)是從一開始就嘗試避免這個特定問題。您可能希望時(shí)刻關(guān)注容量,并確保留出 20% 到 30% 的容量來處理工作。運(yùn)行容量超過 80% 時(shí)會帶來一些麻煩。
確定需求
首先確定是否需要增加磁盤或 MapReduce 容量。這二者具有不同的屬性。二者的做法均是為了添加更多的節(jié)點(diǎn),添加更多的節(jié)點(diǎn)通常可以解決問題,但其代價(jià)可能是不必要的。
如果問題是在存儲上,那么可以考慮給現(xiàn)有節(jié)點(diǎn)增加更多的存儲設(shè)備。有些云環(huán)境能夠在不重新引導(dǎo)或修改系統(tǒng)的情況下提供這個選項(xiàng)。在這種情況下,可以將 dfs.datanode.data.dir 配置更新為包含新掛載的目錄。這個選項(xiàng)始終比使用新節(jié)點(diǎn)擴(kuò)展集群要快得多,也容易得多。
如果屬于長期問題,則應(yīng)該考慮 增加節(jié)點(diǎn)和使用擁有更大容量的節(jié)點(diǎn)替換一些現(xiàn)有的節(jié)點(diǎn)。從長遠(yuǎn)角度看,這是一項(xiàng)值得的投資,因?yàn)檫@樣做可以防止在未來面臨高峰時(shí)出現(xiàn)更多的問題。
如果需要 CPU 能力,但是只愿意等待存儲需求而不愿意進(jìn)行調(diào)整,那么可以添加新的節(jié)點(diǎn),安裝 Hadoop,然后啟動數(shù)據(jù)節(jié)點(diǎn)與任務(wù)跟蹤器過程,但不執(zhí)行任何調(diào)整。
確定是否能通過足夠快地?cái)U(kuò)展(和收縮)來達(dá)到效果
如果與任務(wù)的計(jì)劃長度相比,高峰期較短,那么可能不值得添加節(jié)點(diǎn),因?yàn)閯?chuàng)建新主機(jī)所花費(fèi)的時(shí)間比處理任務(wù)還要長。
盡管不存在通用規(guī)則,但要牢記,云部署或許能夠?qū)⒐?jié)點(diǎn)容量提高 10%,甚至是 100%,但以完全線性的方式來看它可能不會提高性能,特別是在云環(huán)境中。
如果任務(wù)的預(yù)計(jì)運(yùn)行時(shí)間是 6 小時(shí),而您可以在不到一小時(shí)內(nèi)將集群的規(guī)模有效提高 50%,那么擴(kuò)展集群是值得的。
當(dāng)高峰結(jié)束時(shí)是否也能夠及時(shí)收縮?
考慮高峰結(jié)束時(shí)收縮規(guī)模所需的時(shí)間長短。收縮需要花費(fèi)額外的時(shí)間來完成停止運(yùn)行過程,并將數(shù)據(jù)塊重新分布到集群的余下節(jié)點(diǎn)上。圖 1 顯示了同一任務(wù)在 10 個節(jié)點(diǎn)上運(yùn)行,然后在更多節(jié)點(diǎn)上運(yùn)行的大約時(shí)間,其中包括向集群添加節(jié)點(diǎn)和讓節(jié)點(diǎn)停止運(yùn)行的時(shí)間,所有時(shí)間的測量單位均為小時(shí)。
從這張圖中可以看出,增加 5 個節(jié)點(diǎn)很快,將集群規(guī)模擴(kuò)展三倍很簡單,但在節(jié)點(diǎn)停止運(yùn)行時(shí)額外花費(fèi)了 2.5 小時(shí)的時(shí)間。此過程最終僅節(jié)省了一個小時(shí),但成本卻變?yōu)樵瓉淼娜丁?/p>
結(jié)束語
在云中部署 Hadoop 需要了解云環(huán)境的限制,并能夠根據(jù)需要動態(tài)地?cái)U(kuò)展和收縮集群規(guī)模的優(yōu)點(diǎn)。但靈活的特性不代表沒有缺陷。因此,有效的 Hadoop 部署需要您了解運(yùn)行任務(wù),以及擴(kuò)展和收縮過程所需的時(shí)間長短,從而將云中任務(wù)執(zhí)行的時(shí)間縮至最短。
原文鏈接:http://www.ibm.com/developerworks/cn/data/library/ba/ba-hadoop-in-cloud/index.html