黃 沾,鄒大均
(中國電子科技網(wǎng)絡(luò)信息安全有限公司,四川 成都 610041)
隨著計(jì)算機(jī)應(yīng)用的推廣和智能設(shè)備的廣泛普及,人類的日常生活特別是互聯(lián)網(wǎng)服務(wù)所產(chǎn)生的數(shù)據(jù)量正在快速飆升。全球著名科技咨詢機(jī)構(gòu)和IT服務(wù)公司EMC在2014年3月份發(fā)布的《2020年的數(shù)字宇宙》報(bào)告稱,到2020年,數(shù)字宇宙將會(huì)膨脹到40 000 EB,也就是說2020年人均數(shù)據(jù)量將達(dá)到5 200 GB以上[1]。由于數(shù)據(jù)規(guī)模的龐大,傳統(tǒng)的數(shù)據(jù)分析與處理工具已經(jīng)不能滿足當(dāng)前的數(shù)據(jù)分析需求。如何處理分析這些數(shù)據(jù),逐漸成為了一個(gè)新領(lǐng)域,“大數(shù)據(jù)”的概念也應(yīng)運(yùn)而生[2]。
目前,越來越多的公司正在運(yùn)用大數(shù)據(jù)手段來分析用戶的行為、公司的購買力以及增值信息、市場(chǎng)動(dòng)向等。大數(shù)據(jù)能力逐漸成為一個(gè)企業(yè)生存能力的重要組成部分。社會(huì)各行各業(yè)對(duì)大數(shù)據(jù)技術(shù)的需求在不斷增長,大數(shù)據(jù)技術(shù)正在快速前進(jìn)[3]。
當(dāng)前,Hadoop已經(jīng)成為大數(shù)據(jù)技術(shù)的代名詞。這項(xiàng)受Google GFS和MapReduce啟發(fā)的項(xiàng)目,已經(jīng)快速發(fā)展成一個(gè)完整的大數(shù)據(jù)軟件生態(tài)系統(tǒng)。但是,對(duì)于整個(gè)大數(shù)據(jù)生態(tài)系統(tǒng)來說,將它很好地運(yùn)用融合到自己的研究領(lǐng)域并非易事。首先,大數(shù)據(jù)組件很多都是開源系統(tǒng),相對(duì)專業(yè),非技術(shù)人員部署和配置無從下手。其次,在部署大數(shù)據(jù)組件前需要搭建基本的操作系統(tǒng)環(huán)境和一些基礎(chǔ)運(yùn)行環(huán)境,如網(wǎng)絡(luò)配置、ssh、jdk等。僅僅把整個(gè)集群部署啟動(dòng)要花費(fèi)大量成本和精力。而除了部署之外,集群中主機(jī)以及組件的管理也是繁瑣而又常見的工作,如新增主機(jī)、下線主機(jī)、組件參數(shù)調(diào)整等。為了解決這些問題,Ambari項(xiàng)目誕生,以便解決大數(shù)據(jù)組件的管理問題。Ambari項(xiàng)目作為Hadoop官方認(rèn)可的生態(tài)系統(tǒng)的一部分,隨著其越來越完善,可以認(rèn)為Ambari已經(jīng)解決了組件管理問題。但是,Ambari并非該問題的完美答案,主要缺乏如下的主機(jī)管理功能。
(1)電源管理:電源管理可以隨時(shí)對(duì)主機(jī)執(zhí)行開機(jī)和關(guān)機(jī)操作,是集群管理中的一個(gè)基本功能。
(2)操作系統(tǒng)部署:Ambari需要已經(jīng)部署操作系統(tǒng),所以管理系統(tǒng)必須提供便捷的部署操作系統(tǒng)的方法。
(3)網(wǎng)絡(luò)管理:hadoop組件要求集群之間都通過域名訪問,所以管理系統(tǒng)必須有網(wǎng)絡(luò)管理的功能。
(4)SSH訪問:Ambari要求所有主機(jī)都能通過公鑰訪問,管理系統(tǒng)需要自動(dòng)部署好。
(5)Ambari安裝源:Ambari組件安裝源非常龐大(超過8 GB),管理系統(tǒng)需要準(zhǔn)備好離線安裝環(huán)境,同時(shí)要為每臺(tái)主機(jī)導(dǎo)入Ambari安裝源的簽名公鑰,以便正確安裝Ambari及其組件。
因此,筆者設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)融合主機(jī)管理與組件管理的大數(shù)據(jù)集群管理系統(tǒng)。下面將從設(shè)計(jì)目標(biāo)、方案、實(shí)現(xiàn)三個(gè)方面分別進(jìn)行描述。
本系統(tǒng)的設(shè)計(jì)目標(biāo)是一個(gè)覆蓋大數(shù)據(jù)集群全生命周期管理的系統(tǒng),具有自動(dòng)化部署,使用便捷,可以兼容大多數(shù)主機(jī)類型等特性。
(1)自動(dòng)化:除了必要的信息輸入流程外,所有部署流程全部自動(dòng)化。
(2)一致性:保證集群內(nèi)系統(tǒng)配置和大數(shù)據(jù)組件配置一致,同時(shí)可以保證同樣的集群配置數(shù)據(jù)可以重復(fù)部署。
(3)兼容性:可以部署在滿足電源管理需求的各類主機(jī)或機(jī)架式設(shè)備、vmware虛擬主機(jī)以及各種云上的主機(jī)。
(4)全生命周期管理:不僅負(fù)責(zé)初始化安裝部署,而且集群建立后所有主機(jī)和大數(shù)據(jù)組件都可以進(jìn)行管理,如增加或刪除主機(jī)、主機(jī)下線上線等操作。
(5)離線部署:所有需要的組件都已包含在安裝介質(zhì)中,在不能連接互聯(lián)網(wǎng)的特殊網(wǎng)絡(luò)環(huán)境中也可以使用。
(6)便捷管理:提供WEB/CLI客戶端供管理員使用。
圖1 網(wǎng)絡(luò)拓?fù)?/p>
本方案中集群管理系統(tǒng)放置在集群管理服務(wù)器主機(jī)上,與集群內(nèi)主機(jī)直接互通,拓?fù)淙鐖D1所示。
從用戶的角度看,集群管理服務(wù)器(或controller)提供集群管理的各種功能和必備服務(wù),同時(shí)對(duì)集群管理客戶端(WEB/CLI)提供基于HTTP的API。管理員通過客戶端訪問controller,controller通過網(wǎng)絡(luò)連接下發(fā)相應(yīng)的管理命令,同時(shí)也接受集群主機(jī)狀態(tài)上報(bào)請(qǐng)求。
為了提供操作系統(tǒng)部署的功能,controller需要運(yùn)行dhcp、tftp、nfs服務(wù)供集群主機(jī)網(wǎng)絡(luò)啟動(dòng)。datasource服務(wù)供主機(jī)cloud-init正確初始化主機(jī)和安裝操作系統(tǒng)。為了給集群提供域名服務(wù),controller也需要運(yùn)行域名解析服務(wù)。Ambari服務(wù)器和安裝源也運(yùn)行在controller。
集群初始化部署開始前,需要完成一些準(zhǔn)備工作,如集群規(guī)劃(確定集群域名、網(wǎng)絡(luò)配置、角色劃分等)、硬件檢查(主要是否支持電源管理)等,然后按照如下步驟進(jìn)行部署:
(1)通過安裝介質(zhì)將包含管理系統(tǒng)的操作系統(tǒng)安裝到controller;
(2)通過客戶端訪問controller;
(3)進(jìn)行網(wǎng)絡(luò)初始化設(shè)置,包括域名、IP地址段等信息;
(4)增加集群主機(jī)信息,包括IPMI信息、主機(jī)名、地址等;
(5)初始化集群,選擇主機(jī)身份與啟用的服務(wù);
(6)集群開始自動(dòng)部署。
集群完成初次部署后,系統(tǒng)提供主機(jī)管理與組件管理兩大功能。
主機(jī)管理方面,系統(tǒng)提供如下功能:
(1)電源管理,實(shí)現(xiàn)主機(jī)開機(jī)與關(guān)機(jī)功能;
(2)上線下線,當(dāng)主機(jī)因?yàn)楦鞣N原因(如硬件損壞)不能正常工作時(shí),可以通過下線功能進(jìn)行維護(hù),并盡量減少該主機(jī)運(yùn)行的組件影響;
(3)主機(jī)配置,更改主機(jī)名、網(wǎng)絡(luò)配置等。組件管理方面,系統(tǒng)提供如下功能:
(1)新增刪除組件,可以新增或者刪除組件,如hive、pig、spark等;
(2)啟動(dòng)停止組件;
(3)組件配置修改,針對(duì)每個(gè)組件有不同的配置可供修改,如hdfs修改存儲(chǔ)的冗余數(shù),yarn可以修改container的資源占用等。
為了實(shí)現(xiàn)上述系統(tǒng),需要整合多個(gè)現(xiàn)有技術(shù)。下面從關(guān)鍵技術(shù)及其用法出發(fā),講述功能實(shí)現(xiàn)的方法。
3.1.1 電源管理
電源管理是主機(jī)管理的基礎(chǔ),不同類型的主機(jī)支持不同類型的電源管理方案,如主流服務(wù)器都支持IPMI方案,而像VMware的虛擬主機(jī)和Amazon等公有云都有自己的解決方案。為了支持不同類型的方案,系統(tǒng)做了一個(gè)可擴(kuò)展的電源管理,功能有查詢電源狀態(tài)、開機(jī)、關(guān)機(jī)與調(diào)整啟動(dòng)順序。下面以IPMI和VMware方案舉例說明。
(1)IPMI
IPMI是智能型平臺(tái)管理接口(Intelligent Platform Management Interface)的縮寫,是管理基于Intel結(jié)構(gòu)的企業(yè)系統(tǒng)中使用的外圍設(shè)備采用的一種工業(yè)標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)由英特爾、惠普、NEC、美國戴爾電腦和SuperMicro等公司制定。用戶可以利用IPMI監(jiān)視服務(wù)器的物理健康特征,如溫度、電壓、風(fēng)扇工作狀態(tài)、電源狀態(tài)等[4]。對(duì)IPMI服務(wù)器的管理可以通過ipmitool工具包完成,如(<>內(nèi)為用戶輸入?yún)?shù)):
開機(jī):ipmitool-I lanplus-H<bmc_address>-U<user>-P<password>chassis power on
關(guān)機(jī):ipmitool-I lanplus-H<bmc_address>-U<user>-P<password>chassis power off
查詢電源狀態(tài):ipmitool-I lanplus-H <bmc_address>-U<user>-P<password>chassis power off
設(shè)置網(wǎng)絡(luò)啟動(dòng)優(yōu)先:ipmitool-I lanplus-H<bmc_address>-U<user>-P<password>chassis bootdev pxe options=persistent
(2)VMware
VMware旗下的桌面級(jí)產(chǎn)品(workstation)和datacenter產(chǎn)品(vShpere)都支持通過vShpere SDK來遠(yuǎn)程管理。Pyvmomi模塊是該SDK的Python綁定,可以在python中方便調(diào)用,如(<>內(nèi)為用戶輸入?yún)?shù)):
from pyVim import connect
from tools import task
SI=connect.SmartConnect(host=<HOST>,user=<user>,pwd=<password>,port=<port>)
VM=SI.content.searchIndex.FindByDnsName(None,<name>,True)
print VM.runtime.powerState#查詢電源狀態(tài)
TASK=VM.PowerOn()#開機(jī)
TASK=VM.PowerOff()#關(guān)機(jī)
tasks.wait_for_tasks(SI,[TASK])
3.1.2 網(wǎng)絡(luò)啟動(dòng)PXE
PXE(Preboot Execute Environment,預(yù)啟動(dòng)執(zhí)行環(huán)境)是由Intel公司開發(fā)的最新技術(shù),工作于Client/Server的網(wǎng)絡(luò)模式,支持工作站通過網(wǎng)絡(luò)從遠(yuǎn)端服務(wù)器下載映像,并由此支持通過網(wǎng)絡(luò)啟動(dòng)操作系統(tǒng)。啟動(dòng)過程中,終端要求服務(wù)器分配IP地址,再用TFTP(Trivial File Transfer Protocol)或MTFTP(Multicast Trivial File Transfer Protocol)協(xié)議下載一個(gè)啟動(dòng)軟件包到本機(jī)內(nèi)存中,由這個(gè)啟動(dòng)軟件包完成終端(客戶端)基本軟件設(shè)置,從而引導(dǎo)預(yù)先安裝在服務(wù)器中的終端操作系統(tǒng)[5]。PXE可以引導(dǎo)多種操作系統(tǒng)。目前,幾乎所有主機(jī)都內(nèi)置了PXE啟動(dòng)功能。
PXE啟動(dòng)需要controller開啟DHCP服務(wù)和TFTP服務(wù)。集群主機(jī)需要設(shè)置為網(wǎng)絡(luò)優(yōu)先啟動(dòng),以避免主機(jī)已有操作系統(tǒng),而導(dǎo)致與管理系統(tǒng)中主機(jī)狀態(tài)不一致的問題。所以,必須動(dòng)態(tài)提供TFTP服務(wù)器上的文件,當(dāng)主機(jī)還沒有成功部署操作系統(tǒng)時(shí),TFTP服務(wù)器提供PXE需要的內(nèi)核和文件系統(tǒng)。當(dāng)主機(jī)已經(jīng)成功部署時(shí),則直接返回失敗。主機(jī)PXE啟動(dòng)失敗后,會(huì)自動(dòng)從已安裝的系統(tǒng)引導(dǎo)。
3.1.3 NFS
從網(wǎng)絡(luò)安裝操作系統(tǒng)除了需要PXE啟動(dòng)提供的內(nèi)核和initrd外,還需要提供一個(gè)完整功能的文件系統(tǒng),這可以通過NFS實(shí)現(xiàn)。在controller端開啟NFS,在PXE內(nèi)核啟動(dòng)參數(shù)后添加NFS參數(shù),主機(jī)即可以NFS為根文件系統(tǒng)運(yùn)行。
3.1.4 Cloud-init
當(dāng)主機(jī)從PXE啟動(dòng)后,根據(jù)主機(jī)的狀態(tài),需要完成相應(yīng)的任務(wù),如檢測(cè)主機(jī)硬件信息、安裝操作系統(tǒng)等,這時(shí)需要借助cloud-init。顧名思義,cloud-init是為了完成云上主機(jī)的初始化工作而開發(fā)的,已經(jīng)成為虛擬機(jī)元數(shù)據(jù)管理和OS系統(tǒng)配置初始化的事實(shí)標(biāo)準(zhǔn)。最早,cloud-init由ubuntu的母公司Canonical開發(fā),主要思想是當(dāng)用戶首次創(chuàng)建虛擬機(jī)時(shí),將前臺(tái)設(shè)置的主機(jī)名、密碼或者秘鑰等存入元數(shù)據(jù)的服務(wù)器。這些元數(shù)據(jù)在cloud-init中被稱為userdata,而提供數(shù)據(jù)的來源為datasource。Controller會(huì)建立一個(gè)datasource的http服務(wù)器,Cloud-init在啟動(dòng)過程中訪問datasource獲取userdata。根據(jù)userdata的信息,將網(wǎng)絡(luò)配置(主機(jī)名、域名、域名服務(wù)器、IP地址以及網(wǎng)關(guān))等信息設(shè)置完成,然后寫入ssh公鑰。
3.1.5 Curtin
Curtin是由Canonical開發(fā)的快速、自動(dòng)安裝操作系統(tǒng)的工具。Curtin除了能通過配置文件描述如何進(jìn)行磁盤劃分、網(wǎng)絡(luò)配置以及需要安裝的軟件包以外,還支持hook功能,可以在安裝過程中執(zhí)行需要的腳本,如將Ambari安裝源的key獲取并導(dǎo)入。
3.1.6 Ambari
本系統(tǒng)中,所有大數(shù)據(jù)組件的管理工作實(shí)際都由Ambari完成,系統(tǒng)僅負(fù)責(zé)調(diào)用Ambari提供的restful API來完成實(shí)際的工作。
主機(jī)管理的核心是主機(jī)狀態(tài)管理。任意主機(jī)處于下列狀態(tài)之一:
(1)新建(NEW):管理員添加主機(jī)信息至主機(jī)數(shù)據(jù)庫,并有完善的電源管理信息。系統(tǒng)可以自由控制主機(jī)的電源狀態(tài)。
(2)就緒(READY):已探測(cè)出基本的硬件信息,如磁盤數(shù)量以及容量、網(wǎng)卡數(shù)量等。在此可以更改磁盤分區(qū)、地址等配置。READY狀態(tài)的主機(jī)也可以再次執(zhí)行探測(cè)硬件信息的操作,適用于主機(jī)硬件有更新的情況。
(3)已部署(DEPLOYED):操作系統(tǒng)已經(jīng)正常安裝,網(wǎng)絡(luò)和基礎(chǔ)運(yùn)行環(huán)境已正常運(yùn)行。Ambari agent端已正常安裝并接受controller管理,此時(shí)該主機(jī)可以進(jìn)行大數(shù)據(jù)組件的配置與管理。
(4)下線(OFFLINE):主機(jī)下線,如果該主機(jī)有某個(gè)服務(wù)運(yùn)行,那么該主機(jī)會(huì)退出該組件服務(wù)。
這些狀態(tài)的轉(zhuǎn)換如圖2所示。
圖2 主機(jī)狀態(tài)轉(zhuǎn)換
狀態(tài)轉(zhuǎn)換的具體流程如下。
(1)無→NEW:將主機(jī)納入管理系統(tǒng)。主機(jī)信息分為兩部分,一是基本主機(jī)信息,包含主機(jī)名和MAC地址(用以分辨各個(gè)主機(jī)),二是主機(jī)電源管理信息。電源管理信息必須管理員手動(dòng)輸入,而主機(jī)基本信息可以手動(dòng)輸入,也可以從自動(dòng)保存的備用主機(jī)信息庫選取,減輕了管理員部分工作。當(dāng)新的主機(jī)通過PXE啟動(dòng)后,在cloud-init運(yùn)行時(shí)請(qǐng)求datasource,controller會(huì)發(fā)現(xiàn)沒有該主機(jī)信息,然后將該主機(jī)信息加入備用主機(jī)信息庫。主機(jī)發(fā)現(xiàn)沒有自身狀態(tài)信息就會(huì)自動(dòng)關(guān)機(jī)。
(2)NEW→READY:系統(tǒng)會(huì)主動(dòng)開啟主機(jī),主機(jī)從PXE啟動(dòng)后,在cloud-init處會(huì)執(zhí)行探測(cè)硬件信息。探測(cè)的信息包括CPU的型號(hào)、內(nèi)存等,最重要的是磁盤和網(wǎng)卡信息。探測(cè)完成后,主機(jī)會(huì)自動(dòng)關(guān)機(jī)。管理員可以在這里編輯磁盤分區(qū)、網(wǎng)絡(luò)配置等。此時(shí),主機(jī)已經(jīng)做好安裝操作系統(tǒng)的所有準(zhǔn)備。
(3)READY→DEPLOYED:主機(jī)在網(wǎng)絡(luò)啟動(dòng)后,cloud-init調(diào)用Curtin完成操作系統(tǒng)的安裝與配置。Curtin會(huì)chroot至新系統(tǒng)中,完成網(wǎng)絡(luò)配置文件寫入、SSH公鑰寫入、Ambari安裝key導(dǎo)入以及安裝基礎(chǔ)運(yùn)行環(huán)境(Python,JRE)。Cloud-init在curtin成功完成后會(huì)通知controller更改主機(jī)狀態(tài)為DEPLOYED,從而完成整個(gè)操作系統(tǒng)的安裝過程。
(4)DEPLOYED→OFFLINE:標(biāo)記主機(jī)下線后組件管理會(huì)將該主機(jī)從集群中暫時(shí)去除。
(5)OFFLINE→DEPLOYED:標(biāo)記主機(jī)上線后,集群組件將重新激活。
(6)DEPLOYED→READY:已部署的機(jī)器可以退回至READY狀態(tài),這需要將主機(jī)退出集群,清除磁盤數(shù)據(jù)。
(7)任意→無:刪除主機(jī),該主機(jī)不再接受系統(tǒng)管理。如果主機(jī)上有任意運(yùn)行的組件,需要退出組件,卸載組件。同時(shí),管理員可以確定是否需要格式化硬盤,以便清除數(shù)據(jù)。
組件管理是通過調(diào)用Ambari導(dǎo)出的API實(shí)現(xiàn)的。下面通過curl工具示例獲取某個(gè)主機(jī)安裝的組件列表(其中,Cluster是集群id,HostName是主機(jī)id):
curl-uadmin∶admin-H’X-Requested-By∶ambari’-s-XGEThttp∶//localhost∶8080/api/v1/clusters/$Cluster/hosts/$Host?fields=host_components
一般組件管理功能Ambari都有對(duì)應(yīng)的API處理,有兩個(gè)功能需要特別注意。
(1)Ambari代理安裝。為了接受Ambari服務(wù)端的管理,所有集群內(nèi)主機(jī)都需要安裝Ambari代理。這需要調(diào)用Ambari的bootstrap API來實(shí)現(xiàn)。而bootstrap的實(shí)現(xiàn)依賴于集群主機(jī)SSH的公鑰訪問。在調(diào)用bootstrap時(shí),需要在輸入信息中傳入可以訪問集群主機(jī)的SSH私鑰,然后通過不斷查詢安裝請(qǐng)求狀態(tài),即可知道代理是否成功安裝。
(2)集群初始化,集群初始化需要分為兩個(gè)步驟。第一,需要搜集集群的初始化配置信息。第二,將集群配置信息轉(zhuǎn)換為json格式,調(diào)用Ambari的blueprint API來完成集群的初始化。搜集初始化配置信息,主要是確定哪些主機(jī)加入集群、運(yùn)行哪些組件以及每個(gè)組件的參數(shù)。比如,HDFS需要確定name server、standby以及data node分別由哪些主機(jī)擔(dān)任。
本文提出的大數(shù)據(jù)集群管理系統(tǒng)解決了在現(xiàn)有系統(tǒng)中存在的各種弊端,為集群管理提供了一個(gè)有效的解決方案。同時(shí),該系統(tǒng)還有很多需要改進(jìn)的地方,如支持更多的組件、更多類型的主機(jī)等,這將是下一步的研究?jī)?nèi)容。