薛志云, 何 軍, 張丹陽(yáng), 曹維焯
(南京信息工程大學(xué) 電子與信息工程學(xué)院,江蘇 南京 210044)
?
·計(jì)算機(jī)技術(shù)應(yīng)用·
Hadoop和Spark在實(shí)驗(yàn)室中部署與性能評(píng)估
薛志云, 何 軍, 張丹陽(yáng), 曹維焯
(南京信息工程大學(xué) 電子與信息工程學(xué)院,江蘇 南京 210044)
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,數(shù)據(jù)量成爆炸性增長(zhǎng)趨勢(shì),單機(jī)難以存儲(chǔ)、組織和分析這些海量數(shù)據(jù)。面對(duì)單機(jī)難以處理海量數(shù)據(jù)的現(xiàn)狀,建立分布式計(jì)算平臺(tái)對(duì)于今后科研工作和實(shí)驗(yàn)教學(xué)具有重要的意義。就如何在實(shí)驗(yàn)室環(huán)境下搭建分布式計(jì)算平臺(tái)做了詳細(xì)說(shuō)明并對(duì)hadoop和spark的性能進(jìn)行比較,包括Hadoop和Spark集群的安裝和部署,Spark集成開(kāi)發(fā)環(huán)境的建立,同一組數(shù)據(jù)集在兩個(gè)平臺(tái)上進(jìn)行Kmeans聚類(lèi)的時(shí)間對(duì)比。對(duì)于建設(shè)分布式計(jì)算平臺(tái)具有一定的指導(dǎo)意義。
大數(shù)據(jù); 分布式計(jì)算; Hadoop; YARN; Spark
隨著計(jì)算機(jī)技術(shù)的發(fā)展,互聯(lián)網(wǎng)已滲透到工作和生活的各個(gè)方面,互聯(lián)網(wǎng)所產(chǎn)生的數(shù)據(jù)量成爆炸性增長(zhǎng)。如何高效地存儲(chǔ)、組織和分析這些海量數(shù)據(jù)成為現(xiàn)今的研究熱點(diǎn)。分布式計(jì)算概念是將一個(gè)大任務(wù)分布到大量通過(guò)網(wǎng)絡(luò)連接的計(jì)算機(jī)集群上,每個(gè)計(jì)算機(jī)處理一個(gè)或多個(gè)子任務(wù),這些子任務(wù)可以同時(shí)被處理,共同協(xié)作來(lái)完成對(duì)大任務(wù)的計(jì)算。分布式計(jì)算開(kāi)發(fā)和維護(hù)需要考慮的情形非常多變,使得分布式編程相對(duì)于傳統(tǒng)編程顯得更加復(fù)雜,分布式框架可以通過(guò)封裝分布式計(jì)算細(xì)節(jié)來(lái)解決這一問(wèn)題,使得開(kāi)發(fā)效率成倍提高。
Hadoop[1-3]是一種基于MapReduce[4-5]的分布式計(jì)算框架,它由MapReduce框架和HDFS文件系統(tǒng)組成。最初的Hadoop版本存在單節(jié)點(diǎn)故障問(wèn)題,直至Hadoop 2.X版本,本平臺(tái)所用Hadoop版本為Hadoop2.2.0.。Spark[6-7]是用Scala編寫(xiě)、基于RDD彈性分布式內(nèi)存數(shù)據(jù)集的分布式計(jì)算框架。相較于Hadoop,Spark允許將MapReduce的中間結(jié)果存儲(chǔ)在內(nèi)存中,省去大量的磁盤(pán)I/O操作,運(yùn)行效率更高。Spark on YARN(Yet Another Resource Negotiator)模式可以將Spark作業(yè)提交到Hadoop集群上,由Hadoop集群對(duì)作業(yè)進(jìn)行資源調(diào)配。
Hadoop和Spark可被配置在通用硬件上,將實(shí)驗(yàn)室中閑置的PC機(jī)匯聚起來(lái),形成一個(gè)分布式計(jì)算集群以便提供高性能的計(jì)算和海量數(shù)據(jù)的存儲(chǔ)[8-9]。本文將就如何在實(shí)驗(yàn)室環(huán)境中搭建分布式計(jì)算平臺(tái)做了詳細(xì)的說(shuō)明,包括實(shí)驗(yàn)室機(jī)器的基本配置和拓?fù)浣Y(jié)構(gòu),Hadoop和Spark集群的安裝部署以及Spark開(kāi)發(fā)環(huán)境的建立。最后以Kmeans[10]為例,將Hadoop和Spark做性能對(duì)比。
1.1 安裝環(huán)境準(zhǔn)備
1.1.1 硬件環(huán)境
利用實(shí)驗(yàn)室機(jī)房中閑置的PC機(jī),通過(guò)集線(xiàn)器將PC機(jī)連接成局域網(wǎng)。本平臺(tái)先選用4臺(tái)PC機(jī),由于Hadoop和Spark的可擴(kuò)展性,可以很方便地添加新的結(jié)點(diǎn)到集群中。
每臺(tái)PC機(jī)器裝有虛擬機(jī)[11-12]并搭載Ubuntu 32 bit操作系統(tǒng),配有4GB內(nèi)存和20GB的存儲(chǔ)。設(shè)置虛擬機(jī)的網(wǎng)絡(luò)連接方式為橋接模式,并給虛擬機(jī)設(shè)置靜態(tài)IP,確保虛擬機(jī)之間可以相互ping通。這樣,就實(shí)現(xiàn)了機(jī)器之間的互聯(lián)。選定其中1臺(tái)PC機(jī)作為master(即為namenode),另外3臺(tái)作為slave(即為datanode)。
為了方便對(duì)集群的管理,在每臺(tái)PC機(jī)上建立Hadoop用戶(hù),并給Hadoop用戶(hù)賦予root權(quán)限。將有關(guān)Hadoop和Spark的操作均放在Hadoop用戶(hù)下進(jìn)行。
修改每臺(tái)機(jī)器的主機(jī)名,將其主機(jī)名依次修改為master、slave1、slave2和slave3。在每臺(tái)機(jī)器用gedit打開(kāi)/etc/hosts文件,并修改文件內(nèi)容。
$sudo gedit /etc/hosts
將其內(nèi)容修改為:
192.168.1.120 master
192.168.1.121 slave1
192.168.1.122 slave2
192.168.1.123 slave3
這樣,每個(gè)結(jié)點(diǎn)就擁有集群中每個(gè)結(jié)點(diǎn)與其IP對(duì)應(yīng)的映射。
1.1.2 安裝JDK
Hadoop是用Java語(yǔ)言開(kāi)發(fā)的分布式計(jì)算框架,所以集群中的每個(gè)結(jié)點(diǎn)需要安裝JDK。從官網(wǎng)上下載JDK的ubuntu版本jdk-8u25-linux-i586.tar.gz到桌面上,在/usr/loca/下新建java 文件夾,并將jdk-8u25-linux-i586.tar.gz從桌面復(fù)制到j(luò)ava文件夾下,解壓縮該文件:
$sudo scp -r jdk-8u25-linux-i586.tar.gz
/usr/local/java/
$sudo tar xzvf jdk-8u25-linux-i586.tar.gz
解壓完成后,打開(kāi)~/.bashrc文件,配置java環(huán)境變量:
$sudo gedit ~/.bashrc
在該文檔末尾加上如下內(nèi)容:
export
JAVA_HOME=/usr/local/java/jdk1.8.0_25
export PATH=JAVA_HOME/bin:PATH
運(yùn)行以下命令使環(huán)境變量生效:
$source ~/.bashrc
1.1.3 配置ssh免密碼登陸
Hadoop集群在運(yùn)行時(shí)需要通過(guò)ssh[13]免密碼服務(wù)來(lái)進(jìn)行通信。Ubuntu自帶ssh客戶(hù)端,需要自行下載ssh服務(wù)器。在連網(wǎng)的情況下,輸入如下命令來(lái)安裝ssh服務(wù)器:
$sudo apt-get install openssh-server
$sudo apt-get update
使用ssh登陸到集群的另一結(jié)點(diǎn)時(shí)需要輸入結(jié)點(diǎn)的密碼,為方便通信避免每次輸密碼的麻煩,需要配置集群之間ssh免密碼登陸。具體操作過(guò)程如下:
(1) 生成公鑰和私鑰。在每個(gè)結(jié)點(diǎn)輸入以下命令,生成公鑰和私鑰:
$ssh-keygen -t rsa -P ""
提示選擇目錄時(shí),直接按enter鍵即可。這樣,公鑰和私鑰直接在~/.ssh/目錄下。
(2) 登陸。以master和slave1結(jié)點(diǎn)為例,配置master與slave1間免密碼登陸,依次進(jìn)行以下操作。
在master結(jié)點(diǎn)操作,將master的公鑰拷貝到slave結(jié)點(diǎn)上:
$scp id_rsa.pub Hadoop@slave1:~/
在slave結(jié)點(diǎn)操作,將拷貝過(guò)來(lái)的公鑰追加到authorized_keys中:
$cat id_rsa.pub >> authorized_keys
(3) 配置slave1。免密碼登陸master
在slave結(jié)點(diǎn)操作,將slave1的公鑰拷貝到master結(jié)點(diǎn)上:
$scp id_rsa.pub Hadoop@master:~/
在master結(jié)點(diǎn)操作,將拷貝過(guò)來(lái)的公鑰追加到authorized_keys中:
$cat id_rsa.pub >> authorized_keys
用同樣的方法可以實(shí)現(xiàn)master和集群中其他結(jié)點(diǎn)之間的免密碼登陸。
1.2 配置Hadoop文件
Hadoop版本比較多,本實(shí)驗(yàn)平臺(tái)采用Hadoop2.2.0,該版本提出了YARN[14]的概念,穩(wěn)定性較以前也有了提升,并可支持Spark作業(yè)。
從Hadoop官網(wǎng)下載Hadoop-2.2.0.tar.gz保存到master結(jié)點(diǎn)的桌面上,將其復(fù)制到/usr/local/目錄下并對(duì)其解壓縮,執(zhí)行命令如下:
$sudo scp Hadoop-2.2.0.tar.gz /usr/local
$sudo tar xzvf Hadoop-2.2.0.tar.gz
將解壓縮生成的文件重命名為Hadoop:
$sudo mv Hadoop-2.2.0 Hadoop
將Hadoop文件夾的權(quán)限賦予Hadoop用戶(hù):
Hadoop
下面需要對(duì)Hadoop中的文件進(jìn)行配置,Hadoop2.2.0所需配置的文件都在/usr/local/Hadoop/etc/Hadoop目錄下
(1) 配置slaves。打開(kāi)slaves文件并添加如下內(nèi)容:slave1,slave2,slave3。
(2) 配置Hadoop-env.sh。修改JAVA_HOME的值:
export
JAVA_HOME=/usr/local/java/jdk1.8.0_25
(3) 配置yarn-env.sh。修改JAVA_HOME的值:
為便于分析,假設(shè)儲(chǔ)罐內(nèi)LNG經(jīng)BOG換熱后完全變?yōu)轱柡蛻B(tài)LNG,分析所需要的LNG過(guò)冷度。其中,LNG儲(chǔ)罐內(nèi)壓力為0.3 MPa,對(duì)應(yīng)飽和溫度為-146.6℃。
export
JAVA_HOME=/usr/local/java/jdk1.8.0_25
(4) 修改該目錄下的四個(gè).xml文件。其中將mapred-site.xml.template文件另存為mapred-site.xml文件。
打開(kāi)core-site.xml進(jìn)行編輯:
…
…
打開(kāi)hdfs-site.xml進(jìn)行編輯:
…
…
打開(kāi)mapred-site.xml進(jìn)行編輯:
…
mapreduce.framework.name
…
打開(kāi)yarn-site.xml進(jìn)行編輯:
…
yarn.resourcemanager.admin.address
…
最后,將Hadoop文件通過(guò)scp命令發(fā)送到各個(gè)slave結(jié)點(diǎn)。這樣,就完成了Hadoop集群的部署。
2.1 安裝Scala
Spark是由Scala語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)的,需要Scala運(yùn)行環(huán)境的支持。首先將scala-2.10.4.tar.gz下載到master結(jié)點(diǎn)桌面上并將其復(fù)制到/usr/local/目錄下,并對(duì)其解壓縮:
$sudo scp scala-2.10.4.tar.gz /usr/local/
$sudo tar xzvf scala-2.10.4.tar.gz
解壓完成后,打開(kāi)~/.bashrc文件,配置Scala環(huán)境變量,在該文檔末尾加上如下內(nèi)容:
export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin
再source一下使環(huán)境變量生效,安裝scala跟之前安裝JDK相類(lèi)似,這里不做詳細(xì)闡述。
2.2 配置Spark文件
實(shí)驗(yàn)平臺(tái)選用Spark1.0.0版本,從Spark官網(wǎng)上下載已預(yù)先編譯好的spark-1.0.0-bin-Hadoop2.tar.gz,按照之前安裝Hadoop的步驟將Spark解壓縮至/usr/local/目錄下:
$sudo scp spark-1.0.0-bin-Hadoop2.tar.gz
/usr/local/
$sudo tar xzvf
spark-1.0.0-bin-Hadoop2.tar.gz
解壓縮好Spark之后需要配置Spark的文件,所需配置的文件均在/usr/local/spark/conf目錄下。
(1) 配置slaves。打開(kāi)slaves文件并添加如下內(nèi)容:slave1,slave2,slave3。
(2) 配置spark-env.sh。將spark-env.sh.template文件另存為spark-env.sh文件,打開(kāi)spark-env.sh,在文件最頂端輸入以下內(nèi)容:
export
JAVA_HOME=/usr/local/java/jdk1.8.0_25
export SCALA_HOME=/usr/local/scala
export HADOOP_CONF_DIR=
$HADOOP_HOME/etc/Hadoop
export SPARK_MASTER_IP=master
export SPARK_WORKER_MEMORY=2g
Spark在master結(jié)點(diǎn)上安裝完成之后,通過(guò)scp命令將spark發(fā)布到各個(gè)slave結(jié)點(diǎn),至此Spark集群的安裝部署成功。
YARN是第二代MapReduce,主要是為了解決第一代MapReduce擴(kuò)展性差,不支持多計(jì)算框架而被提出,YARN可作為Spark資源調(diào)度的管理器。Spark on YARN資源管理調(diào)度如圖1所示。
圖1 Spark on YARN資源管理調(diào)度
3.1 啟動(dòng)Hadoop集群
集群安裝配置成功之后,首先要格式化HDFS,在master結(jié)點(diǎn)的/usr/local/Hadoop目錄下輸入以下指令:
$bin/Hadoop namenode -format
格式化成功之后,通過(guò)Hadoop/sbin目錄下的一個(gè)腳本start-all.sh來(lái)啟動(dòng)Hadoop集群的各個(gè)服務(wù)功能:
$sbin/start-all.sh
集群?jiǎn)?dòng)成功之后,可以通過(guò)登錄web界面輸入:master:8088和master:50070來(lái)查看集群?jiǎn)?dòng)和運(yùn)行情況。
3.2 Spark-submit提交作業(yè)到Y(jié)ARN
Spark可以單獨(dú)運(yùn)行,也可以運(yùn)行在已有的集群上,如Amazon EC2、Apache Mesos、Hadoop YARN。采用YARN模式運(yùn)行,其實(shí)就是把spark作為一個(gè)客戶(hù)端提交作業(yè)給YARN,用YARN來(lái)管理作業(yè)的資源調(diào)度。
Spark中可以通過(guò)Spark-submit將作業(yè)提交到Hadoop YARN,輸入以下指令,運(yùn)行一個(gè)Demo計(jì)算π的值:
bin/spark-submit
--class
org.apache.spark.examples.SparkPi
--master yarn-cluster
lib/spark-examples*.jar 2
運(yùn)行成功之后從Hadoop Web管理界面可以查看到作業(yè)被提交到了Haddop平臺(tái)上,并可查看運(yùn)行狀態(tài)和結(jié)果。
Spark運(yùn)行環(huán)境搭建完成之后,為了方便對(duì)Spark應(yīng)用程序的開(kāi)發(fā),使用Intellij IDEA來(lái)配置Spark開(kāi)發(fā)環(huán)境。
4.1 Intellij IDEA的安裝
下載ideaIC-13.1.4b.tar.gz,并解壓縮到/usr/local/目錄下。進(jìn)入idea/bin目錄,在終端輸入:./idea.sh打開(kāi)Intellij IDEA的界面。需要進(jìn)入Configure-->Plugins-->Install JetBrains plugin頁(yè)面下載和安裝scala插件,安裝完成后重啟IDEA。至此,IDEA可用于開(kāi)發(fā)Scala程序,IDEA安裝成功。
4.2 Spark Kmeans運(yùn)行
以Kmeans為例來(lái)說(shuō)明spark源碼在IDEA中的執(zhí)行步驟,以后可以在IDEA中開(kāi)發(fā)Spark應(yīng)用程序。首先新建一個(gè)Scala工程,為方便開(kāi)發(fā),新建時(shí)要選擇SBT,SBT完成之后會(huì)自動(dòng)建立好一些目錄。此時(shí)右擊src目錄下的main下的scala,在彈出的“New”下選擇“Scala Class”,輸出文件名為Kmeans,Kind選為Object。
將Spark 中Kmeans的源碼拷貝到新建的工程中,此時(shí)代碼中有些變量不被識(shí)別,需要導(dǎo)入Spark-Hadoop對(duì)應(yīng)的jar包。點(diǎn)擊編譯,此時(shí)系統(tǒng)會(huì)報(bào)沒(méi)有指定master URL等錯(cuò)誤。需要配置Kmeans的執(zhí)行環(huán)境,指定運(yùn)行所需用到的參數(shù)。至此,Spark Kmeans運(yùn)行成功。
集群搭建成功之后,準(zhǔn)備了5組數(shù)據(jù)集在Hadoop和Spark平臺(tái)上做Kmeans運(yùn)算。其中Kmeans在Spark平臺(tái)上的運(yùn)行4.2中已做說(shuō)明。Mahout[15-16]是基于Hadoop Mapreduce 的機(jī)器學(xué)習(xí)算法庫(kù),Hadoop Kmeans已在Mahout中實(shí)現(xiàn)。將Mahout配置到集群中即可在Hadoop平臺(tái)上運(yùn)行Kmeans。由于Mahout配置相對(duì)而言比較容易,這里不做詳細(xì)說(shuō)明。
實(shí)驗(yàn)后分別記下5組數(shù)據(jù)集在2個(gè)平臺(tái)的運(yùn)行時(shí)間,并通過(guò)matlab畫(huà)出運(yùn)行時(shí)間對(duì)比直方圖如圖2所示。我們可以看出Spark對(duì)于處理Kmeans算法的效率比Hadoop快100倍。
圖2 Kmeans運(yùn)行時(shí)間對(duì)比
該實(shí)驗(yàn)平臺(tái)分別搭建了Hadoop和Spark分布式計(jì)算平臺(tái),可以被運(yùn)用于大規(guī)模的數(shù)據(jù)計(jì)算。通過(guò)分別在兩個(gè)平臺(tái)上運(yùn)行Kmeans算法,我們發(fā)現(xiàn),Spark更適合用于需要迭代的機(jī)器學(xué)習(xí)算法,隨著數(shù)據(jù)集的增大,Spark的優(yōu)勢(shì)更加明顯。
在今后工作中,可以在了解和掌握Spark編程機(jī)制的基礎(chǔ)上,在現(xiàn)有的平臺(tái)上做一些分布式開(kāi)發(fā),將傳統(tǒng)的單機(jī)版本的機(jī)器學(xué)習(xí)算法部署到分布式計(jì)算平臺(tái)
上,已解決單機(jī)無(wú)法承載大數(shù)據(jù)計(jì)算的問(wèn)題。
[1] 陸嘉恒. Hadoop實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2012.
[2] 周 品.Hadoop 云計(jì)算實(shí)戰(zhàn)[M]. 北京:清華大學(xué)出版社,2012.
[3] Shvachko Konstantin. The Hadoop distributed file system[C]//Mass Storage Systems and Technologies (MSST),2010,26th Symposium on IEEE:1-10.
[4] Dean J, Ghemawat S. MapReduce: simplified data processing on large clusters[J]. Communications of the ACM, 2008, 51(1):107-113.
[5] Dean J, Ghemawat S. MapReduce: a flexible data processing tool[J]. Communications of the ACM, 2010, 53(1): 72-77.
[6] Karau H. Fast Data Processing With Spark[M].Bermingham:Packt Publishing Ltd, 2013.
[7] Zaharia M, Chowdhury M, Das T,etal. Fast and interactive analytics over Hadoop data with Spark[J]. USENIX; login, 2012, 37(4): 45-51.
[8] 付 偉,嚴(yán)博,吳曉平.云計(jì)算實(shí)驗(yàn)平臺(tái)建設(shè)關(guān)鍵技術(shù)研究[J]. 實(shí)驗(yàn)室研究與探索,2013,32(11): 78-81.
[9] 陳慧芬,盧慶武. 云計(jì)算在高校機(jī)房管理中的應(yīng)用[J]. 實(shí)驗(yàn)室研究與探索,2013,32(7):213-216.
[10] 何 清,李 寧,羅文娟,等.大數(shù)據(jù)下的機(jī)器學(xué)習(xí)算法綜述[J].模式識(shí)別與人工智能,2014, 27(4): 327-336.
[11] 何增穎.虛擬機(jī)技術(shù)的實(shí)驗(yàn)教學(xué)應(yīng)用[J].實(shí)驗(yàn)科學(xué)與技術(shù),2010,8(1): 80-82.
[12] 郁書(shū)好,蘇守寶.VMware下的多操作系統(tǒng)實(shí)驗(yàn)環(huán)境構(gòu)建[J].實(shí)驗(yàn)室研究與探索,2013,32(9):106-108.
[13] OpenSSL官網(wǎng). http://www.openssh.com/. 2012
[14] 董西成.Hadoop技術(shù)內(nèi)幕:深入解析YARN架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理[M].北京:機(jī)械工業(yè)出版社,2013.
[15] Owen S,Anil R,Dunning T,etal. Mahout in action[M]. New York: Manning Publications Co,2011.
[16] Giacomelli P. Apache Mahout Cookbook [M].Bermingham:Packt Publishing Ltd, 2013.
The Deployment and Performance Evaluation of Hadoop and Spark in Laboratory Environment
XUEZhi-yun,HEJun,ZHANGDang-yang,CAOWei-zhuo
(School of Electronic and Information Engineering, Nanjing University of Information Science and Technology, Nanjing 210044, China)
With the development of the Internet technology, data volume is streaming. A single machine cannot store, organize and analyze massive data. Facing to the current situation, it is meaningful to build distributed computing platform for further research and experimental teaching. This paper gives a detailed description of the establishment of distributed computing platform and makes a performance comparison between Hadoop and Spark. The comparison focuses on the time consuming, and includes the building of Hadoop and Spark platforms, establishing the Spark development environment, using an identical set of dataset to do Kmeans clustering. It will be helpful for someone who is going to construct distributed computing platform.
distributed computing; Hadoop; YARN; Spark
2015-03-30
國(guó)家自然科學(xué)基金項(xiàng)目(61203273);江蘇省自然科學(xué)基金項(xiàng)目(BK20141004);南京信息工程大學(xué)大學(xué)生實(shí)踐創(chuàng)新訓(xùn)練計(jì)劃項(xiàng)目(201410300175)
薛志云(1990-),女,江蘇泰州人,碩士生,研究方向?yàn)榇髷?shù)據(jù)機(jī)器學(xué)習(xí)。E-mail:nuistxzy@163.com
何 軍(1978-),男,河南鄭州人,博士,講師,主要從事大數(shù)據(jù)機(jī)器學(xué)習(xí)和計(jì)算機(jī)視覺(jué)等方面的研究。
E-mail:jhe@nuist.edu.cn
TP 302.1
A
1006-7167(2015)11-0077-05