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