張恬恬 孫紹華
摘 要:隨著數據挖掘逐漸被應用到金融、娛樂、商業和醫療等多個行業,近年來涌現出各種用于處理海量數據的數據處理引擎,如MapReduce、Spark等。為了使高校實驗室更深入地進行數據挖掘領域的理論研究,簡要闡述分析了Spark技術及HDFS的概念與基本原理,詳細介紹了基于Spark的云計算平臺配置方法和實現過程,并對平臺搭建過程中遇到的問題進行總結。實驗結果證明,該平臺能夠有效完成分布式數據處理任務。
關鍵詞:Spark;HDFS;云平臺;數據處理
DOI:10.11907/rjdk.172906
中圖分類號:TP391
文獻標識碼:A 文章編號:1672-7800(2018)004-0191-03
Abstract:In recent years, a variety of open source data processing engines are emerging such as MapReduce, Spark, etc., which are used to efficiently handle massive amounts of data. In order to offer the laboratory of the university deeper research of the field of data mining, this paper briefly analyzes the concept and basic principle of Spark technology and HDFS, and then introduces configuration method and implementation process of the Spark-based cloud computing platform.The experiments show that the platform can effectively complete the distributed data processing tasks.
Key Words:Spark; HDFS; cloud platform; data processing
1 Spark及分布式系統簡介
1.1 Spark技術
Spark是類Hadoop MapReduce的通用數據分析集群計算框架,起源于加利福尼亞大學伯克利分校。為了解決現有Hadoop版本在計算模式、計算性能、處理能力及系統構架上的缺點,大部分計算框架采取各種計算模式與內存計算模式混合,以實現高實時性的大數據查詢與計算分析[1],而其中最為完善和流行的便是Spark生態系統。
Spark處理方法一直在行業內被廣泛借鑒。彈性分布式數據集(RDD)是Spark使用的主要抽象,其通過內存存儲數據,以改善速度和資源問題[2];它能夠在不進行復制的情況下提供容錯機制,并且支持迭代計算;它支持一組豐富的高級工具,包括用于SQL的Spark SQL結構化數據處理、用于機器學習的MLlib、用于圖處理的GraphX和Spark Streaming[3]。因此,Spark更適用于數據挖掘與機器學習等需要迭代的算法。
1.2 分布式系統
Hadoop分布式文件系統(HDFS)是Hadoop集群中所有節點進行數據存儲的文件系統,適用于通用硬件及大規模數據集的應用,具有高容錯性、高吞吐率、高擴展性和高可靠性等特點[4-7]。
HDFS采用master/slave架構。一個HDFS由一個NameNode(master)和多個DataNode(slave)組成,其中master負責管理文件系統命名空間和Client對文件的訪問,slave負責管理所在節點的存儲。HDFS對外提供一個文件系統命名空間,允許用戶將數據存為文件格式。
2 Spark云平臺實現方法
Spark云平臺是西安石油大學服務器虛擬出的4個節點,使用內部地址,無密碼登錄。下面主要介紹在Ubuntu系統下部署Spark云平臺的方法,所用操作系統為Ubuntu 14.04.1 LTS,Hadoop[8]版本為2.6.4,Spark版本為1.6.2。
2.1 網絡配置
集群中包括1個主節點:tulip01,3個從節點:tulip02、tulip03、tulip04。其中tulip01節點主要配置NameNode和JobTracker角色,負責總管分布式數據并分解任務執行;3個從節點配置DataNode和TaskTracker角色,負責分布式數據存儲以及任務執行。
2.2 SSH無密碼驗證配置
云平臺各節點間需要進行數據訪問,如果每個節點訪問均需要驗證,效率將大大降低,所以配置 SSH免密碼的方法直接遠程連入被訪問節點,以提高效率。
(1)確認聯網的情況下,在Ubuntu服務器上安裝SSH,并驗證SSH是否安裝成功:
root@tulip01:~# apt-get install ssh
root@tulip01:~# ssh -V
(2)生成密鑰:
root@tulip01:~# ssh-keygen -t dsa -P ‘ -f ~/.ssh/id_dsa
(3)生成公私密鑰,主節點執行以下命令:
root@tulip01:~# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
從節點將工作節點的密鑰發送到主節點,并將密鑰添加進公鑰中,然后將生成的公鑰發送到每個節點上,執行以下命令:
root@tulip02:~#scp /root/.ssh/id_rsa.pub root@tulip01:/root/.ssh/id_rsa.pub.worker
root@tulip01:~# cat ~/.ssh/id_rsa.pub.workerx >> ~/.ssh/authorized_keys
root@tulip01:~# scp ~/.ssh/authorized_keys root@tulip02:~/.ssh/authorized_keys
(4)使子節點通過SSH免密碼登錄主節點,先將文件復制到從節點與主節點相同的文件夾內,然后用同樣方法配置另外兩個子節點:
root@tulip01:~# scp authorized_keys tulip02:~/.ssh/
至此,主節點和每個從節點能夠相互無密碼地驗證登錄。
2.3 Java環境配置
所有節點上都需安裝 JDK,先在主節點安裝,然后其它節點按照步驟重復進行即可(注意:安裝JDK以及配置環境變量,需要以root身份進行)。
(1)上傳并解壓JDK安裝包,將JDK安裝包解壓在“/usr/data”文件夾下。
(2)在“/etc/profile”文件下配置環境變量,添加以下內容:
export JAVA_HOME=/usr/data/jdk-8u111-linux-x64
export JRE_HOME=MYMJAVA_HOME/jre
export CLASSPATH=.:MYMJAVA_HOME/lib:MYMJRE_HOME/lib
export PATH=MYMJAVA_HOME/bin:MYMPATH
export HADOOP_HOME=/usr/data/hadoop-2.6.4
export PATH=MYMPATH:MYMHADOOP_HOME/sbin:MYMHADOOP_HOME/bin
2.4 Hadoop集群部署
運行Spark需要用到Hadoop的HDFS作為數據存儲設施,所以各個節點都要安裝Hadoop。先在主節點上安裝,然后其它節點按照相同步驟進行安裝配置。下面以root身份安裝和配置Hadoop:
(1)上傳并解壓Hadoop安裝包,并在“/usr/data/hadoop-2.6.4”目錄下分別創建tmp。dfs/name、dfs/data步驟類似,用于存放命名空間及數據信息,并將所建的文件夾權限分給Hadoop用戶。
root@tulip01:~# chown -R hadoop:hadoop /usr/data/hadoop-2.6.4
(2)配置文件hadoop-env.sh和yarn-env.sh,分別添加Java路徑信息,注意步驟(2)~(5)所配置的文件均在“/usr/data/hadoop-2.6.4/etc/hadoop/”目錄里。
export JAVA_HOME=/usr/data/jdk-8u111-linux-x64
(3)配置文件core-site.xml。將fs.default.name的value值改為hdfs://202.200.84.234:9000,將hadoop.tmp.dir的value值改為file:/usr/data/hadoop-2.6.4//tmp。
(4)配置文件hdfs-site.xml。將dfs.namenode.secondary.http-address的value值改為202.200.84.234:50090。
(5)配置文件 mapred-site.xml ,將mapred.job.tracker的value值改為tulip01:9001。
(6)配置文件yarn-site.xml,將yarn.resourcemanager.hostname的value值改為tulip01,mapred.job.tracker改為202.200.84.234:9001。
(7)在“/usr/data/hadoop/etc/hadoop-2.6.4/slaves”文件下添加從節點信息。
(8)在剩余節點上安裝配置Hadoop,拷貝Hadoop安裝目錄到tulip02節點,并賦予該節點讀權限。其它節點作相同操作:
root@tulip01:~# scp -r ./hadoop-2.6.4 tulip02:/usr/
root@tulip01:~# chown - R root:tulio02 /usr/data/hadoop-2.6.4/
(9)啟動及驗證。首先,格式化HDFS系統,在 master 上使用用戶 Hadoop 進行操作:
root@tulip01:~# hdfs namenode -format
然后啟動并驗證Hadoop,使用jps命令查看進程,若主節點上出現NameNode、SecondaryNameNode、ResourceManager和 Jps,從節點上出現 DataNode、NodeManager 和 Jps 等進程,則表示集群配置成功。
root@tulip01:~# ./sbin/start-dfs.sh
2.5 Spark集群部署
所有節點都要安裝Spark,先在主節點上安裝,然后其它節點按照相同步驟進行安裝配置。下面以root身份安裝和配置Spark:
(1)上傳并解壓Spark安裝包。將Spark安裝包解壓在“/usr/data”文件夾下。
(2)進入Spark的conf中復制模板配置。 注意步驟(2)~(5)所配置文件均在“/usr/data/spark-1.6.2/conf/”目錄里。
root@tulip01:~# cp spark-env.sh.template spark-env.sh
(3)修改Spark配置變量。編輯“/etc/profile”文件,將SPARK_MASTER_IP設為tulip01、SPARK_WORKER_MEMORY設為16g、SPARK_WORKER_CORES設為3,然后執行source命令使配置生效。
root@tulip01:~# vim spark-env.sh
(4)添加從節點信息。節點修改信息同Hadoop步驟。
root@tulip01:~# cp slaves.template slaves
(5)修改系統默認配置。修改信息詳情如圖1所示。
root@tulip01:~#cp spark-defaults.conf.template spark-defaults.conf
root@tulip01:~# vim spark-defaults.conf
(6)將配置好的Spark文件復制到各子節點對應目錄,即將Spark下的Spark1.6.2拷貝到tulip01節點的對應目錄中。其它節點作相同操作:
root@tulip01:~# scp -r./spark-1.6.2/ tulip01:/usr/
(7)啟動及驗證。首先,啟動并驗證Spark,使用jps命令查看進程,若發現主節點上有master進程,從節點上有worker進程,說明Spark集群配置成功。
root@tulip01:~# ./sbin/start-all.sh
然后進行Spark集群監控,通過監控頁面http://202.200.84.234:8080/查看,若可以看到1個master節點和3個slave節點,表明Spark集群已經正常運行。
3 Spark云平臺測試
Spark集群搭建完成后,通過Spark Shell的交互界面進行交互式編程。通過一個實例對云平臺進行測試,即統計HDFS上一個文件README.md中“spark”的出現頻率。
在Spark Shell交互界面scala>運行如下代碼:
val file=sc.textFile("hdfs://202.200.84.234:9000/usr/data/root/README.md")
val sparks=file.filter(line => line.contains("Spark"))
sparks.count
然后,使用Linux自帶的wc命令進行統計:
root@tulip01:~# grep Spark README.md
最后,將Spark Shell下的運行結果與Linux命令執行結果進行對比,若結果相同,則說明Spark云平臺搭建成功。
4 結語
Spark云平臺目前具備以下優勢:①數據存儲可靠、安全,能有效避免數據丟失、病毒入侵等問題;②對硬件設施要求不高,使用方便快捷;③計算能力強,不再局限于單機運行,可利用成千上萬臺計算機和服務器執行超級計算類任務;④存儲容量大,具備良好的可擴展性。值得注意的是,目前Spark云平臺還有諸多問題有待完善,如脫機問題、故障問題等。下一步工作主要是在Spark云平臺下進行相關算法的研究與應用。
參考文獻:
[1] MORAIS T S. Survey on frameworks for distributed computing: Hadoop, Spark and storm[C].DSIE'15 Doctoral Symposium in Informatics Engineering.2015.
[2] MENG X, BRADLEY J, YAVUZ B, et al. MLlib: machine learning in apache spark[J]. Journal of Machine Learning Research,2015,17(1):1235-1241.
[3] ZAHARIA M, CHOWDHURY M, FRANKLIN M J, et al. Spark: cluster computing with workingsets[C].Usenix Conference on Hot Topics in Cloud Computing. USENIX Association, 2010:10.
[4] 許吳環,顧瀟華.大數據處理平臺比較研究[J].軟件導刊,2017,16(4):212-214.
[5] 范素娟,田軍鋒,FANSU-JUAN,等.基于Hadoop的云計算平臺研究與實現[J].計算機技術與發展,2016(7):127-132.
[6] 王彥明,奉國和,薛云.近年來Hadoop國外研究綜述[J].計算機系統應用,2013,22(6):1-5.
[7] 孟小峰,慈祥.大數據管理:概念、技術與挑戰[J].計算機研究與發展,2013,50(1):146-169.
[8] LANDSET S, KHOSHGOFTAAR T M, RICHTER A N, et al. A survey of open source tools for machine learning with big data in the Hadoop ecosystem[J]. Journal of Big Data,2015,2(1):24.
(責任編輯:黃 健)