秦黃,劉曉娟,李滿,劉曉莉
(廣州工商學(xué)院,廣東 廣州 518200)
近年來,大數(shù)據(jù)產(chǎn)業(yè)得到了大力發(fā)展,數(shù)據(jù)不再是一串冰冷的數(shù)字,越來越多的企業(yè)開始重視數(shù)據(jù),大學(xué)也開始普及數(shù)據(jù)科學(xué)和大數(shù)據(jù)專業(yè)。Hadoop 是Apache 開源基金會開發(fā)的分布式系統(tǒng),由HDFS 和YARM 組成。Hadoop 是采用Java 語言開發(fā)的分散計算平臺,適用于大數(shù)據(jù)領(lǐng)域的分布式存儲和計算,是當前廣泛使用的大數(shù)據(jù)計算工具。
Hadoop 在大數(shù)據(jù)領(lǐng)域中具有舉足輕重的地位,是研究大數(shù)據(jù)技術(shù)的基石。從某種程度上說,一個人對Hadoop 基礎(chǔ)知識掌握的扎實與否決定其在大數(shù)據(jù)技術(shù)道路上能走多遠。在生成環(huán)境下或者是學(xué)習(xí)大數(shù)據(jù)的過程中,經(jīng)常會遇到因使用場景的不同而應(yīng)用不同集群配置的情況,若采用傳統(tǒng)的部署方式需要進行很多煩瑣重復(fù)的工作,會加大時間成本和生產(chǎn)成本。隨著數(shù)據(jù)量的不斷增大,原有DataNode 節(jié)點的容量已經(jīng)不能滿足數(shù)據(jù)存儲的需求,需要在原有集群基礎(chǔ)上動態(tài)添加新的數(shù)據(jù)節(jié)點,但是傳統(tǒng)的擴容方式過程煩瑣且容易出錯。
為了實現(xiàn)Hadoop 集群上多節(jié)點的快速搭建和便捷的擴容縮容,在本文中我們提出一種基于Docker 容器快速構(gòu)建多節(jié)點Hadoop 集群的引入方案。
現(xiàn)有的虛擬化技術(shù)包含容器虛擬化與服務(wù)器虛擬化,二者的目標是相通的,目的都是為應(yīng)用程序建立一個孤立環(huán)境,但容器虛擬化技術(shù)與服務(wù)器虛擬化相比更為輕量。
這是由于服務(wù)器虛擬化技術(shù)是從操作系統(tǒng)層下手,不像傳統(tǒng)的虛擬機技術(shù)那樣虛擬出一套硬件驅(qū)動后,在其上運行一個完整的操作系統(tǒng),對用戶來說相當于使用物理性質(zhì)的虛擬機。而容器虛擬化技術(shù)則不同,它與宿主機共用內(nèi)核,直接將一個應(yīng)用程序及其所運行的環(huán)境依賴打包成鏡像。為了與服務(wù)器虛擬化技術(shù)產(chǎn)生的虛擬機區(qū)分開來,容器技術(shù)產(chǎn)生的環(huán)境就稱為容器。容器技術(shù)的輕量,具體體現(xiàn)為所建立的容器用不上1 分鐘甚至幾秒鐘內(nèi)就可以啟用,遠比需要數(shù)分鐘甚至幾十分鐘才能開啟的傳統(tǒng)虛擬機來得快。
容器提供了可以在分散且隔離的環(huán)境中運行和維護應(yīng)用程序的功能。因為應(yīng)用程序被制作成擁有完整架構(gòu)體系的鏡像并建立在獨立的容器中,在這種隔離和獨立空間的保證下,可以在給定的物理機器上同時運行多個容器。此外,容器是輕量級且獨立的,又包含運行應(yīng)用程序所需的所有內(nèi)容,因此用戶不需要依賴主機上安裝的內(nèi)容。用戶可以在工作時或生產(chǎn)環(huán)境下快速便捷地共享容器或移植鏡像,并確保與之共享的每一個用戶都能獲得相同環(huán)境下的相同容器或鏡像,有效解決了運行環(huán)境改變而帶來的各個組件之間的兼容性問題。
綜上,利用Docker 可以實現(xiàn)對環(huán)境的快速構(gòu)建,避免了環(huán)境不一致和依賴沖突等問題。將所有的應(yīng)用、配置和依賴打包進容器中,以便在任何環(huán)境下都能夠有效運行。容器虛擬化技術(shù)藉由鏡像妥善解決了在線和離線環(huán)境的問題,保證生活周期中應(yīng)用或服務(wù)環(huán)境的標準化,非常有利于持續(xù)部署與測試。因此,容器虛擬化技術(shù)迅速成為新興的虛擬化方式,Docker 容器與以往的虛擬化方式相比具有顯著的優(yōu)勢。
Docker 容器技術(shù)中包含三個重要組件,分別是鏡像、容器和倉庫。通常來說,鏡像用于創(chuàng)建容器,這與Java語言中的班級與實例的關(guān)系相似。鏡像是靜態(tài)定義,容器是執(zhí)行鏡像時的實體,可以創(chuàng)建、啟動、停止、刪除和暫停容器。在Docker 技術(shù)的原理中,容器表示具有完整的最后一個操作系統(tǒng)的應(yīng)用程序。Docker 容器完全使用沙箱機制,相互之間不會有任何接口,對資源的額外需求很低,運行時不需要專門的虛擬化管理程序,只需占用較小的存儲空間。
Docker 的倉庫是集中存放鏡像文件的場所,倉庫中存放很多的鏡像,每個鏡像具有不同的標簽用于標注版本和其他信息。當需要在其他服務(wù)器上使用某個鏡像時,就可以直接從倉庫中獲取,也就是說倉庫可為鏡像提供存儲和分發(fā)的服務(wù)。
Docker 使用client-server 體系結(jié)構(gòu),Docker 客戶端可以與Docker 守護進程(即Docker 服務(wù)器)建立通信??蛻舳撕褪刈o進程可以在同一系統(tǒng)中運行??蛻舳艘部梢赃B接到遠程Docker 守護進程。Docker 客戶端和Docker 守護進程也可以使用JavaAPI,通過UNIX 插口或網(wǎng)絡(luò)接口實現(xiàn)通信和連接。
CentOS 是最常用的Linux 操作系統(tǒng),本文使用CentOS7來演示如何搭建Docker 運行環(huán)境,搭建過程比較簡單,可分為以下三步:
(1)條件準備。選擇Docker 支持的操作系統(tǒng),目前市面上絕大多數(shù)的操作系統(tǒng)Docker 都支持,這里選用的是CentOS 系統(tǒng)的7.9 版本。安裝Docker 引擎,需要具備一個穩(wěn)定的或長期支持的CentOS 版本,不支持測試或存檔版本。
(2)完成安裝。Docker 的安裝方法有多種,包括yum安裝、rpm 包安裝、便捷非交互式腳本安裝等。
啟動Docker 服務(wù)并查看服務(wù)狀態(tài),如圖1所示。
圖1 啟動Docker 服務(wù)
Docker 鏡像是Docker 的重要組成部分,一層一層地重疊而成,但鏡像卻是獨立的不可寫入的對象。鏡像內(nèi)是簡單的操作系統(tǒng)且較多使用Linux 操作系統(tǒng),還包括執(zhí)行應(yīng)用程序所需的文件和依賴性軟件包,同時也會根據(jù)不同的應(yīng)用場景疊加應(yīng)用程序。Docker 容器技術(shù)解決了普通虛擬機龐大臃腫的問題。鏡像可以理解為一種構(gòu)建時(build-time)結(jié)構(gòu),而容器可以理解為一種運行時(run-time)結(jié)構(gòu)。
映像是一個只讀模板,其中包含有關(guān)創(chuàng)建Docker 容器的說明。通常情況下,一個映像是基于另一個映像而存在的,并且映像還具有一些額外的自定義層來實現(xiàn)具體的功能。用戶可以創(chuàng)建自己的映像,也可以使用其他人創(chuàng)建的鏡像,用戶可在Docker 的倉庫中找到其他開發(fā)者發(fā)布的映像。
如圖2所示,所有的Docker 鏡像都起始于一個基礎(chǔ)鏡像層,在修改或增加新的內(nèi)容時,就會在當前鏡像層之上創(chuàng)建新的鏡像層,比如在centOS7 的鏡像里添加了JDK,那么就會在CentOS7 的基礎(chǔ)鏡像層上添加一個包含JDK 的鏡像層。鏡像運行時應(yīng)用了宿主機的Kernel 內(nèi)核,內(nèi)核的上一層一般是操作系統(tǒng)(比如CentOS、Ubuntu 等),再上一層是運行環(huán)境或應(yīng)用程序服務(wù)(如JDK、Apache 等)。
圖2 Docker 分層鏡像
使用docker run 命令從一個鏡像中創(chuàng)建啟動容器,一個鏡像可以創(chuàng)建為多個容器,一旦鏡像通過容器啟動后,二者之間就會產(chǎn)生一定的依賴關(guān)系,另外,容器啟動后,鏡像是無法被刪除的。Docker 鏡像可以從官方公共鏡像倉庫DockerHub 中獲取。鏡像倉庫是容器環(huán)境的重要組成部分,用于保存和管理鏡像文件。DockerHub 中有Docker 官方提供的鏡像和許多社區(qū)開發(fā)者貢獻的鏡像,必要時還可以根據(jù)需要自行定制鏡像。
制作鏡像的方法主要有兩種:一種是打包鏡像生成的容器,另一種是使用鏡像文件制作鏡像。一般的生產(chǎn)環(huán)境中通常使用Dockerfile 文件來創(chuàng)建并定義用戶所需的應(yīng)用。Dockfile 是由Docker 程序解釋的腳本,Dockerfile 由對應(yīng)于Linux 下的命令構(gòu)成。
使用Dockerfile 文件制作鏡像的主要流程是先創(chuàng)建一個Dockerfile,在Dockerfile 中自定義創(chuàng)建鏡像的組件,最后生成并測試映像。通過在Dockerfile 文件中輸入相應(yīng)的指令來配置用戶所需的環(huán)境和功能,Dockerfile 中的每條指令都會在映像中疊加一個層。更改Dockerfile 并重新生成映像時,只會重新生成已更改的層。基于這樣的模式,Docker 與其他虛擬化技術(shù)相比更加快捷。
在基于Docker 容器快速搭建多節(jié)點Hadoop 集群部署方案中,使用鏡像文件制作鏡像,鏡像層級結(jié)構(gòu)如圖3所示,基礎(chǔ)鏡像為Ubuntu14,在基礎(chǔ)鏡像的基礎(chǔ)上完成依賴包的配置(比如JDK、SSH、wget 等基礎(chǔ)服務(wù)以及環(huán)境變量、免密登錄的配置)。定義Dockerfile 時需要創(chuàng)建一個文件夾作為生成hadoop 鏡像的場所,生成鏡像所需的資源和鏡像文件Dockerfile 都存放在這個文件夾下,此文件夾可以任意命名,但是生成鏡像的文件必須命名為Dockerfile。
圖3 鏡像層級結(jié)構(gòu)
基于Docker 容器快速搭建多節(jié)點Hadoop 集群部署方案借助阿里云服務(wù)器來完成,利用Docker 容器模擬多節(jié)點,具體性能表如表1所示。
表1 硬件信息
集群搭建的軟件環(huán)境如表2所示。環(huán)境搭建完成后,利用設(shè)計好的Dockerfile 創(chuàng)建定制鏡像,再根據(jù)定制鏡像創(chuàng)建容器進行實際搭建。
表2 組件版本信息
本方案中Hadoop 集群結(jié)構(gòu)設(shè)計如圖4所示,包含一個主節(jié)點、2 個從節(jié)點,由于不涉及存儲性能要求,故本方案中的HDFS 采用默認副本數(shù),不進行額外修改。
圖4 Hadoop 集群結(jié)構(gòu)
本方案先在阿里云服務(wù)器上搭建好集群間的虛擬網(wǎng)絡(luò),并通過定制鏡像完成1 個主節(jié)點容器和2 個從節(jié)點容器的創(chuàng)建,然后進入主節(jié)點容器,通過腳本啟動Hadoop 集群,通過訪問Hadoop 集群的主節(jié)點50070 即可查看集群情況。需要注意的是,根據(jù)容器啟動時的端口映射規(guī)則,此時主節(jié)點的50070 會映射宿主機的50070 端口,因此實際上是通過訪問宿主機的50070 端口來獲取集群情況,如圖5所示,集群狀態(tài)是活躍的。
圖5 集群情況
WordCount 可以說是最簡單的MapReduce 程序,多節(jié)點Hadoop 集群部署完成后,以詞頻統(tǒng)計WordCount 為例,對集群進行測試,驗證集群運行情況。
以詞頻統(tǒng)計WordCount 為例,對集群進行測試,詳情為:
(1)WordCount 的過程如圖6所示,按照mapreduce編程規(guī)范分別編寫Mapper、Reducer,完成詞頻統(tǒng)計。
圖6 MapReduce 程序工作流程
(2)在完成必要的準備工作之后執(zhí)行WordCount 程序,程序運行情況如圖7所示。
圖7 WordCount 程序運行情況
(3)監(jiān)控WordCount 程序運行時硬件資源使用情況。由前文可知WordCount 程序是MapRecuce 程序,需要消耗計算資源,因此圖8CPU 使用情況符合測試預(yù)期。
圖8 CPU 使用情況
WordCount 程序的目的是通過MapReduce 計算框架詞頻統(tǒng)計,需要占用較多內(nèi)存,所以如圖9所示的內(nèi)存使用情況符合測試預(yù)期。
圖9 內(nèi)存使用情況
如圖10所示,系統(tǒng)負載量跟活躍進程數(shù)量有直接關(guān)系,因此在WordCount 程序運行期間系統(tǒng)負載呈明顯上升趨勢是符合測試預(yù)期的。
圖10 系統(tǒng)負載情況
(4)通過瀏覽器監(jiān)控界面查看統(tǒng)計結(jié)果,如圖11所示。
圖11 統(tǒng)計結(jié)果
傳統(tǒng)的應(yīng)用程序開發(fā)完成后,需要準備很多的設(shè)置說明文檔以幫助其他開發(fā)人員進一步開發(fā),而Docker 的封裝和隔離特性讓煩瑣的部署配置工作變得簡單。鏡像中引入各種復(fù)雜的安裝配置環(huán)境,且Docker 虛擬出一套完整的操作系統(tǒng),所以兼容性問題得到保障,同時也大大節(jié)省了部署配置和測試驗證時間,在生產(chǎn)環(huán)境下省去很多成本,極大地提高了開發(fā)測試效率。容器是輕量級的操作系統(tǒng),在物理機器的系統(tǒng)上操作,不需要像虛擬機那樣翻譯指令,直接使用物理機器的CPU 命令即可。
Docker 的應(yīng)用也明顯改善了學(xué)習(xí)和生產(chǎn)環(huán)境,生產(chǎn)環(huán)境下的一些配置是極其煩瑣的,如果需要將應(yīng)用服務(wù)環(huán)境移植到另一臺機器,就要反復(fù)地進行配置和調(diào)試,這樣會消耗大量的時間和人力,對企業(yè)來說將是一筆不小的投入。Docker 技術(shù)完美地解決了這個問題,同時開發(fā)人員還可以利用Docker 來解決協(xié)作編碼時環(huán)境不兼容的問題,Docker 之所以發(fā)展如此迅速,也是因為它提供了系統(tǒng)平滑移植、容器虛擬化技術(shù)的標準化解決方案。