薛志云, 何 軍, 張丹陽, 曹維焯
(南京信息工程大學 電子與信息工程學院,江蘇 南京 210044)
?
·計算機技術應用·
Hadoop和Spark在實驗室中部署與性能評估
薛志云, 何 軍, 張丹陽, 曹維焯
(南京信息工程大學 電子與信息工程學院,江蘇 南京 210044)
隨著互聯(lián)網(wǎng)技術的發(fā)展,數(shù)據(jù)量成爆炸性增長趨勢,單機難以存儲、組織和分析這些海量數(shù)據(jù)。面對單機難以處理海量數(shù)據(jù)的現(xiàn)狀,建立分布式計算平臺對于今后科研工作和實驗教學具有重要的意義。就如何在實驗室環(huán)境下搭建分布式計算平臺做了詳細說明并對hadoop和spark的性能進行比較,包括Hadoop和Spark集群的安裝和部署,Spark集成開發(fā)環(huán)境的建立,同一組數(shù)據(jù)集在兩個平臺上進行Kmeans聚類的時間對比。對于建設分布式計算平臺具有一定的指導意義。
大數(shù)據(jù); 分布式計算; Hadoop; YARN; Spark
隨著計算機技術的發(fā)展,互聯(lián)網(wǎng)已滲透到工作和生活的各個方面,互聯(lián)網(wǎng)所產(chǎn)生的數(shù)據(jù)量成爆炸性增長。如何高效地存儲、組織和分析這些海量數(shù)據(jù)成為現(xiàn)今的研究熱點。分布式計算概念是將一個大任務分布到大量通過網(wǎng)絡連接的計算機集群上,每個計算機處理一個或多個子任務,這些子任務可以同時被處理,共同協(xié)作來完成對大任務的計算。分布式計算開發(fā)和維護需要考慮的情形非常多變,使得分布式編程相對于傳統(tǒng)編程顯得更加復雜,分布式框架可以通過封裝分布式計算細節(jié)來解決這一問題,使得開發(fā)效率成倍提高。
Hadoop[1-3]是一種基于MapReduce[4-5]的分布式計算框架,它由MapReduce框架和HDFS文件系統(tǒng)組成。最初的Hadoop版本存在單節(jié)點故障問題,直至Hadoop 2.X版本,本平臺所用Hadoop版本為Hadoop2.2.0.。Spark[6-7]是用Scala編寫、基于RDD彈性分布式內(nèi)存數(shù)據(jù)集的分布式計算框架。相較于Hadoop,Spark允許將MapReduce的中間結果存儲在內(nèi)存中,省去大量的磁盤I/O操作,運行效率更高。Spark on YARN(Yet Another Resource Negotiator)模式可以將Spark作業(yè)提交到Hadoop集群上,由Hadoop集群對作業(yè)進行資源調(diào)配。
Hadoop和Spark可被配置在通用硬件上,將實驗室中閑置的PC機匯聚起來,形成一個分布式計算集群以便提供高性能的計算和海量數(shù)據(jù)的存儲[8-9]。本文將就如何在實驗室環(huán)境中搭建分布式計算平臺做了詳細的說明,包括實驗室機器的基本配置和拓撲結構,Hadoop和Spark集群的安裝部署以及Spark開發(fā)環(huán)境的建立。最后以Kmeans[10]為例,將Hadoop和Spark做性能對比。
1.1 安裝環(huán)境準備
1.1.1 硬件環(huán)境
利用實驗室機房中閑置的PC機,通過集線器將PC機連接成局域網(wǎng)。本平臺先選用4臺PC機,由于Hadoop和Spark的可擴展性,可以很方便地添加新的結點到集群中。
每臺PC機器裝有虛擬機[11-12]并搭載Ubuntu 32 bit操作系統(tǒng),配有4GB內(nèi)存和20GB的存儲。設置虛擬機的網(wǎng)絡連接方式為橋接模式,并給虛擬機設置靜態(tài)IP,確保虛擬機之間可以相互ping通。這樣,就實現(xiàn)了機器之間的互聯(lián)。選定其中1臺PC機作為master(即為namenode),另外3臺作為slave(即為datanode)。
為了方便對集群的管理,在每臺PC機上建立Hadoop用戶,并給Hadoop用戶賦予root權限。將有關Hadoop和Spark的操作均放在Hadoop用戶下進行。
修改每臺機器的主機名,將其主機名依次修改為master、slave1、slave2和slave3。在每臺機器用gedit打開/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
這樣,每個結點就擁有集群中每個結點與其IP對應的映射。
1.1.2 安裝JDK
Hadoop是用Java語言開發(fā)的分布式計算框架,所以集群中的每個結點需要安裝JDK。從官網(wǎng)上下載JDK的ubuntu版本jdk-8u25-linux-i586.tar.gz到桌面上,在/usr/loca/下新建java 文件夾,并將jdk-8u25-linux-i586.tar.gz從桌面復制到java文件夾下,解壓縮該文件:
$sudo scp -r jdk-8u25-linux-i586.tar.gz
/usr/local/java/
$sudo tar xzvf jdk-8u25-linux-i586.tar.gz
解壓完成后,打開~/.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
運行以下命令使環(huán)境變量生效:
$source ~/.bashrc
1.1.3 配置ssh免密碼登陸
Hadoop集群在運行時需要通過ssh[13]免密碼服務來進行通信。Ubuntu自帶ssh客戶端,需要自行下載ssh服務器。在連網(wǎng)的情況下,輸入如下命令來安裝ssh服務器:
$sudo apt-get install openssh-server
$sudo apt-get update
使用ssh登陸到集群的另一結點時需要輸入結點的密碼,為方便通信避免每次輸密碼的麻煩,需要配置集群之間ssh免密碼登陸。具體操作過程如下:
(1) 生成公鑰和私鑰。在每個結點輸入以下命令,生成公鑰和私鑰:
$ssh-keygen -t rsa -P ""
提示選擇目錄時,直接按enter鍵即可。這樣,公鑰和私鑰直接在~/.ssh/目錄下。
(2) 登陸。以master和slave1結點為例,配置master與slave1間免密碼登陸,依次進行以下操作。
在master結點操作,將master的公鑰拷貝到slave結點上:
$scp id_rsa.pub Hadoop@slave1:~/
在slave結點操作,將拷貝過來的公鑰追加到authorized_keys中:
$cat id_rsa.pub >> authorized_keys
(3) 配置slave1。免密碼登陸master
在slave結點操作,將slave1的公鑰拷貝到master結點上:
$scp id_rsa.pub Hadoop@master:~/
在master結點操作,將拷貝過來的公鑰追加到authorized_keys中:
$cat id_rsa.pub >> authorized_keys
用同樣的方法可以實現(xiàn)master和集群中其他結點之間的免密碼登陸。
1.2 配置Hadoop文件
Hadoop版本比較多,本實驗平臺采用Hadoop2.2.0,該版本提出了YARN[14]的概念,穩(wěn)定性較以前也有了提升,并可支持Spark作業(yè)。
從Hadoop官網(wǎng)下載Hadoop-2.2.0.tar.gz保存到master結點的桌面上,將其復制到/usr/local/目錄下并對其解壓縮,執(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文件夾的權限賦予Hadoop用戶:
Hadoop
下面需要對Hadoop中的文件進行配置,Hadoop2.2.0所需配置的文件都在/usr/local/Hadoop/etc/Hadoop目錄下
(1) 配置slaves。打開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的值:
為便于分析,假設儲罐內(nèi)LNG經(jīng)BOG換熱后完全變?yōu)轱柡蛻B(tài)LNG,分析所需要的LNG過冷度。其中,LNG儲罐內(nèi)壓力為0.3 MPa,對應飽和溫度為-146.6℃。
export
JAVA_HOME=/usr/local/java/jdk1.8.0_25
(4) 修改該目錄下的四個.xml文件。其中將mapred-site.xml.template文件另存為mapred-site.xml文件。
打開core-site.xml進行編輯:
…
…
打開hdfs-site.xml進行編輯:
…
…
打開mapred-site.xml進行編輯:
…
mapreduce.framework.name
…
打開yarn-site.xml進行編輯:
…
yarn.resourcemanager.admin.address
…
最后,將Hadoop文件通過scp命令發(fā)送到各個slave結點。這樣,就完成了Hadoop集群的部署。
2.1 安裝Scala
Spark是由Scala語言開發(fā)實現(xiàn)的,需要Scala運行環(huán)境的支持。首先將scala-2.10.4.tar.gz下載到master結點桌面上并將其復制到/usr/local/目錄下,并對其解壓縮:
$sudo scp scala-2.10.4.tar.gz /usr/local/
$sudo tar xzvf scala-2.10.4.tar.gz
解壓完成后,打開~/.bashrc文件,配置Scala環(huán)境變量,在該文檔末尾加上如下內(nèi)容:
export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin
再source一下使環(huán)境變量生效,安裝scala跟之前安裝JDK相類似,這里不做詳細闡述。
2.2 配置Spark文件
實驗平臺選用Spark1.0.0版本,從Spark官網(wǎng)上下載已預先編譯好的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。打開slaves文件并添加如下內(nèi)容:slave1,slave2,slave3。
(2) 配置spark-env.sh。將spark-env.sh.template文件另存為spark-env.sh文件,打開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結點上安裝完成之后,通過scp命令將spark發(fā)布到各個slave結點,至此Spark集群的安裝部署成功。
YARN是第二代MapReduce,主要是為了解決第一代MapReduce擴展性差,不支持多計算框架而被提出,YARN可作為Spark資源調(diào)度的管理器。Spark on YARN資源管理調(diào)度如圖1所示。
圖1 Spark on YARN資源管理調(diào)度
3.1 啟動Hadoop集群
集群安裝配置成功之后,首先要格式化HDFS,在master結點的/usr/local/Hadoop目錄下輸入以下指令:
$bin/Hadoop namenode -format
格式化成功之后,通過Hadoop/sbin目錄下的一個腳本start-all.sh來啟動Hadoop集群的各個服務功能:
$sbin/start-all.sh
集群啟動成功之后,可以通過登錄web界面輸入:master:8088和master:50070來查看集群啟動和運行情況。
3.2 Spark-submit提交作業(yè)到YARN
Spark可以單獨運行,也可以運行在已有的集群上,如Amazon EC2、Apache Mesos、Hadoop YARN。采用YARN模式運行,其實就是把spark作為一個客戶端提交作業(yè)給YARN,用YARN來管理作業(yè)的資源調(diào)度。
Spark中可以通過Spark-submit將作業(yè)提交到Hadoop YARN,輸入以下指令,運行一個Demo計算π的值:
bin/spark-submit
--class
org.apache.spark.examples.SparkPi
--master yarn-cluster
lib/spark-examples*.jar 2
運行成功之后從Hadoop Web管理界面可以查看到作業(yè)被提交到了Haddop平臺上,并可查看運行狀態(tài)和結果。
Spark運行環(huán)境搭建完成之后,為了方便對Spark應用程序的開發(fā),使用Intellij IDEA來配置Spark開發(fā)環(huán)境。
4.1 Intellij IDEA的安裝
下載ideaIC-13.1.4b.tar.gz,并解壓縮到/usr/local/目錄下。進入idea/bin目錄,在終端輸入:./idea.sh打開Intellij IDEA的界面。需要進入Configure-->Plugins-->Install JetBrains plugin頁面下載和安裝scala插件,安裝完成后重啟IDEA。至此,IDEA可用于開發(fā)Scala程序,IDEA安裝成功。
4.2 Spark Kmeans運行
以Kmeans為例來說明spark源碼在IDEA中的執(zhí)行步驟,以后可以在IDEA中開發(fā)Spark應用程序。首先新建一個Scala工程,為方便開發(fā),新建時要選擇SBT,SBT完成之后會自動建立好一些目錄。此時右擊src目錄下的main下的scala,在彈出的“New”下選擇“Scala Class”,輸出文件名為Kmeans,Kind選為Object。
將Spark 中Kmeans的源碼拷貝到新建的工程中,此時代碼中有些變量不被識別,需要導入Spark-Hadoop對應的jar包。點擊編譯,此時系統(tǒng)會報沒有指定master URL等錯誤。需要配置Kmeans的執(zhí)行環(huán)境,指定運行所需用到的參數(shù)。至此,Spark Kmeans運行成功。
集群搭建成功之后,準備了5組數(shù)據(jù)集在Hadoop和Spark平臺上做Kmeans運算。其中Kmeans在Spark平臺上的運行4.2中已做說明。Mahout[15-16]是基于Hadoop Mapreduce 的機器學習算法庫,Hadoop Kmeans已在Mahout中實現(xiàn)。將Mahout配置到集群中即可在Hadoop平臺上運行Kmeans。由于Mahout配置相對而言比較容易,這里不做詳細說明。
實驗后分別記下5組數(shù)據(jù)集在2個平臺的運行時間,并通過matlab畫出運行時間對比直方圖如圖2所示。我們可以看出Spark對于處理Kmeans算法的效率比Hadoop快100倍。
圖2 Kmeans運行時間對比
該實驗平臺分別搭建了Hadoop和Spark分布式計算平臺,可以被運用于大規(guī)模的數(shù)據(jù)計算。通過分別在兩個平臺上運行Kmeans算法,我們發(fā)現(xiàn),Spark更適合用于需要迭代的機器學習算法,隨著數(shù)據(jù)集的增大,Spark的優(yōu)勢更加明顯。
在今后工作中,可以在了解和掌握Spark編程機制的基礎上,在現(xiàn)有的平臺上做一些分布式開發(fā),將傳統(tǒng)的單機版本的機器學習算法部署到分布式計算平臺
上,已解決單機無法承載大數(shù)據(jù)計算的問題。
[1] 陸嘉恒. Hadoop實戰(zhàn)[M].北京:機械工業(yè)出版社,2012.
[2] 周 品.Hadoop 云計算實戰(zhàn)[M]. 北京:清華大學出版社,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] 付 偉,嚴博,吳曉平.云計算實驗平臺建設關鍵技術研究[J]. 實驗室研究與探索,2013,32(11): 78-81.
[9] 陳慧芬,盧慶武. 云計算在高校機房管理中的應用[J]. 實驗室研究與探索,2013,32(7):213-216.
[10] 何 清,李 寧,羅文娟,等.大數(shù)據(jù)下的機器學習算法綜述[J].模式識別與人工智能,2014, 27(4): 327-336.
[11] 何增穎.虛擬機技術的實驗教學應用[J].實驗科學與技術,2010,8(1): 80-82.
[12] 郁書好,蘇守寶.VMware下的多操作系統(tǒng)實驗環(huán)境構建[J].實驗室研究與探索,2013,32(9):106-108.
[13] OpenSSL官網(wǎng). http://www.openssh.com/. 2012
[14] 董西成.Hadoop技術內(nèi)幕:深入解析YARN架構設計與實現(xiàn)原理[M].北京:機械工業(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
國家自然科學基金項目(61203273);江蘇省自然科學基金項目(BK20141004);南京信息工程大學大學生實踐創(chuàng)新訓練計劃項目(201410300175)
薛志云(1990-),女,江蘇泰州人,碩士生,研究方向為大數(shù)據(jù)機器學習。E-mail:nuistxzy@163.com
何 軍(1978-),男,河南鄭州人,博士,講師,主要從事大數(shù)據(jù)機器學習和計算機視覺等方面的研究。
E-mail:jhe@nuist.edu.cn
TP 302.1
A
1006-7167(2015)11-0077-05