摘要:該文闡述了Spark處理技術(shù)在大數(shù)據(jù)框架上的性能提升優(yōu)勢(shì),分析了BDAS生態(tài)系統(tǒng)框架中Spark的任務(wù)處理流程圖。詳細(xì)說(shuō)明了Spark集群的搭建過(guò)程和運(yùn)行狀態(tài),并通過(guò)Spark Shell的交互界面進(jìn)行交互式編程,實(shí)現(xiàn)對(duì)文本內(nèi)容中單詞出現(xiàn)次數(shù)的統(tǒng)計(jì)。
關(guān)鍵詞:大數(shù)據(jù); Spark; 集群; Yarn; 交互式編程
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)15-0014-03
Abstract: The performance advantages of Spark processing technical in big data framework is described, the process flowchart of Spark in the framework of BDAS ecosystem is analyzed. The construction process and running state of Spark cluster are described in detail.Statistics on the number of words in the text content by interactive programming through the Shell Spark interactive interface.
Key words: big data; spark; cluster; yarn; interactive programming
隨著計(jì)算機(jī)和信息技術(shù)的迅猛發(fā)展和普及,傳統(tǒng)的計(jì)算技術(shù)和信息系統(tǒng)的處理能力已經(jīng)無(wú)法滿足數(shù)百TB甚至數(shù)十到數(shù)百PB規(guī)模的行業(yè)企業(yè)大數(shù)據(jù),因此,處于大數(shù)據(jù)時(shí)代的今天,更為高效的大數(shù)據(jù)處理技術(shù)、方法和手段取得了巨大的發(fā)展。
1 大數(shù)據(jù)處理技術(shù)概述
Hadoop和Spark兩者都是大數(shù)據(jù)框架。Hadoop實(shí)質(zhì)上更多是一個(gè)分布式數(shù)據(jù)基礎(chǔ)設(shè)施: 它將巨大的數(shù)據(jù)集分派到一個(gè)由普通計(jì)算機(jī)組成的集群中的多個(gè)節(jié)點(diǎn)進(jìn)行存儲(chǔ),意味著您不需要購(gòu)買和維護(hù)昂貴的服務(wù)器硬件。而Spark是基于內(nèi)存計(jì)算的大數(shù)據(jù)并行計(jì)算框架,它基于內(nèi)存計(jì)算。相比Hadoop MapReduce,Spark在性能上提高了100倍[1],不僅提高了在大數(shù)據(jù)環(huán)境下數(shù)據(jù)處理的實(shí)時(shí)性,同時(shí)保證了高容錯(cuò)性和高可伸縮性。
Hadoop的MapReduce在過(guò)去10年的時(shí)間成了大數(shù)據(jù)處理的代名詞,而Spark作為一個(gè)嶄新的大數(shù)據(jù)生態(tài)系統(tǒng),逐漸取代傳統(tǒng)的MapReduce而成為新一代大數(shù)據(jù)處理技術(shù)。以下通過(guò)Spark集群大數(shù)據(jù)處理平臺(tái)的搭建與測(cè)試來(lái)進(jìn)行研究。
2 Spark技術(shù)分析
2.1 Spark生態(tài)系統(tǒng)BDAS
目前Spark已經(jīng)發(fā)展成為包含眾多子項(xiàng)目的大數(shù)據(jù)計(jì)算平臺(tái)。伯克利將Spark的整個(gè)生態(tài)系統(tǒng)成為伯克利數(shù)據(jù)分析棧(BDAS),其核心框架就是Spark,其他子項(xiàng)目在Spark上層提供了更高層、更豐富的計(jì)算范式。BDAS結(jié)構(gòu)框架,如圖1所示。
2.2 Spark的任務(wù)處理流程圖
Spark是整個(gè)BDAS的核心組件,是一個(gè)大數(shù)據(jù)分布式編程框架,不僅實(shí)現(xiàn)了MapReduce的算子map函數(shù)和reduce函數(shù)及計(jì)算模型,還提供更為豐富的算子,如filter、join、groupByKey等。Spark將分布式數(shù)據(jù)抽象為天性分布式數(shù)據(jù)集(RDD),實(shí)現(xiàn)了應(yīng)用任務(wù)調(diào)度、RPC、序列化和壓縮,并為運(yùn)行在其上的上層組件提供API。其底層采用Scala函數(shù)式語(yǔ)言編寫而成,并且所提供的API深度借鑒Scala函數(shù)式的編程思想,提供與Scala類似的編程接口。如圖2為Spark的任務(wù)處理流程。
3 Spark集群的安裝與部署
實(shí)際應(yīng)用中,Spark主要部署在Linux系統(tǒng)的集群中。如果要完整使用Spark,需要預(yù)先安裝Hadoop,因此在Linux系統(tǒng)中安裝Spark需要預(yù)先安裝JDK、Scala等依賴。以1個(gè)Master節(jié)點(diǎn)和3個(gè)Slave節(jié)點(diǎn)進(jìn)行部署,首先在主節(jié)點(diǎn)和子節(jié)點(diǎn)上完成基礎(chǔ)步驟的安裝,包括:JDK安裝、Scala安裝、配置SSH免密碼登錄、Hadoop安裝配置及啟動(dòng)[3],然后再開(kāi)始進(jìn)行Spark集群的安裝與部署。
3.1 Spark集群的搭建
已經(jīng)完成基礎(chǔ)安裝的1個(gè)主節(jié)點(diǎn)和3個(gè)子節(jié)點(diǎn)IP地址分別為:Master:10.230.10.160;Slave1: 10.230.10.161;Slave2: 10.230.10.162;Slave3: 10.230.10.163。
1)下載并解壓Spark安裝文件
從官網(wǎng)下載spark1.3.1安裝文件(集群采用的軟件版本是Hadoop2.6.0和Spark1.3.1),并在主節(jié)點(diǎn)Master的usr/local/spark/spark1.3.1的目錄下,解壓下載好的spark-1.3.1-bin-hadoop2.6.tgz。命令行如下:
[root@Master ~]# tar -xzvf /root/down-spark/spark-1.3.1-bin-hadoop2.6.tgz /usr/local/spark
并將釋放后的文件夾名改為spark1.3.1。
2)配置spark的環(huán)境變量
配置Spark的環(huán)境變量,使用命令行:vi /etc/profile
在profile文件最后添加:
## SPARK
export SPARK_HOME=spark的絕對(duì)路徑(此處是:/usr/local/spark/spark1.3.1)
export PATH=$PATH:$SPARK_HOME/bin
然后保存退出
并重新運(yùn)行profile,使其生效。命令行:
[root@Master spark1.3.1]# source /etc/profile
3)配置spark的相關(guān)文件
(1)slaves文件的配置
拷貝conf/slaves.template為slaves,并使用vi命令編輯slaves,將Worker節(jié)點(diǎn)添加進(jìn)去。添加子節(jié)點(diǎn)slave名稱的內(nèi)容如下:
Master
Slave1
Slave2
Slave3
(2)spark-env.sh的配置
進(jìn)入Spark的conf目錄,將spark-env.sh.template拷貝到spark-env.sh,并編輯該配置文件,將各種路徑添加進(jìn)去。命令行:vi spark-env.sh。向文件添加:
export JAVA_HOME=Java安裝的絕對(duì)路徑(此處:/usr/lib/java/jdk1.8.0_45)
export SCALA_HOME=Scala安裝的絕對(duì)路徑(此處:/root/app/scala2.10)
export HADOOP_CONF_DIR=hadoop環(huán)境下的配置文件目錄etc/hadoop的絕對(duì)路徑(此處是:/usr/local/hadoop/hadoop-2.6.0/etc/Hadoop)
export SPARK_MASTER_IP=主節(jié)點(diǎn)IP或主節(jié)點(diǎn)IP映射名稱(此處是:Master)
export SPARK_MASTER_PORT=主節(jié)點(diǎn)啟動(dòng)端口(默認(rèn)7077)
export SPARK_MASTER_WEBUI_PORT=集群web監(jiān)控頁(yè)面端口(默認(rèn)8080)
export SPARK_WORKER_CORES=從節(jié)點(diǎn)工作的CPU核心數(shù)目(默認(rèn)1)
export SPARK_WORKER_PORT=從節(jié)點(diǎn)啟動(dòng)端口(默認(rèn)7078)
export SPARK_WORKER_MEMORY=分配給Spark master和 worker 守護(hù)進(jìn)程的內(nèi)存空間(默認(rèn)512m)
export SPARK_WORKER_WEBUI_PORT=從節(jié)點(diǎn)監(jiān)控端口(默認(rèn)8081)
export SPARK_WORKER_INSTANCES=每臺(tái)從節(jié)點(diǎn)上運(yùn)行的worker數(shù)量 (默認(rèn): 1)
該配置文件中的yarn部署是按照spark配置文件的默認(rèn)部署的,如果想根據(jù)實(shí)際情況來(lái)部署的話,可以做相應(yīng)的修改。
(3)Spark文件復(fù)制
將配置好的Spark文件復(fù)制到各個(gè)子節(jié)點(diǎn)slave對(duì)應(yīng)的目錄上:即將spark下的spark1.3.1拷貝到子節(jié)點(diǎn)的對(duì)應(yīng)目錄上。
[root@Master spark]# scp -r ./spark1.3.1/ root@Slave1:/usr/local/spark
[root@Master spark]# scp -r ./spark1.3.1/ root@Slave2:/usr/local/spark
[root@Master spark]# scp -r ./spark1.3.1/ root@Slave3:/usr/local/spark
至此,Spark集群的安裝搭建基本完成。
3.2 Spark On Yarn的集群?jiǎn)?dòng)
(1)Yarn的啟動(dòng):
先進(jìn)入hadoop目錄下,運(yùn)行命令 ./sbin/start-all.sh,然后運(yùn)行jps命令檢測(cè)yarn是否正常啟動(dòng),如果發(fā)現(xiàn)有ResourceManager進(jìn)程,說(shuō)明yarn啟動(dòng)完成
(2)Spark的啟動(dòng)
先進(jìn)入spark目錄下,運(yùn)行命令 ./sbin/start-all.sh,然后運(yùn)行jps命令檢測(cè)spark是否正常啟動(dòng),如果發(fā)現(xiàn)主節(jié)點(diǎn)有Master進(jìn)程,子節(jié)點(diǎn)有Worker進(jìn)程,說(shuō)明spark啟動(dòng)完成。
(3)Spark集群監(jiān)控
Spark啟動(dòng)之后,可以通過(guò)Web查看Spark集群的運(yùn)行狀態(tài),一般都是masterIP:8080,如果打不開(kāi)監(jiān)控頁(yè)面,則要檢查一下防火墻有沒(méi)有禁用。
如圖3所示,通過(guò)監(jiān)控頁(yè)面,可以看到由1個(gè)Master節(jié)點(diǎn)和3個(gè)Slave節(jié)點(diǎn)組成的Spark集群已經(jīng)正常運(yùn)行。至此,Spark On Yarn的集群搭建完成。
3.3 Spark集群控制臺(tái)
(1)在Master端,進(jìn)入spark-shell控制臺(tái)
啟動(dòng)spark on yarn集群后,進(jìn)入Spark的bin目錄,使用spark-shell進(jìn)入控制臺(tái),命令行為:[root@Master bin]# ./spark-shell ,執(zhí)行后出現(xiàn)操作符提示scala>。
而如果要在spark 客戶端(在 Slave節(jié)點(diǎn)),使用 spark-shell 連接集群,以Slave1為例,在子節(jié)點(diǎn)進(jìn)入spark-shell控制臺(tái)的命令行:
[root@Slave1 bin]# ./spark-shell --master spark://Master:7077 --executor-memory 1g
說(shuō)明:其中的“--executor-memory 1g”,根據(jù)實(shí)際內(nèi)存情況進(jìn)行分配
(2)查看SparkUI情況
進(jìn)入Spark的shell世界,根據(jù)輸出的提示信息,可以通過(guò) http://Master:4040,從Web的角度看一下SparkUI的情況。包括:集群的Jobs、Stages、Storage、Environment、Executors等信息。
4 Spark集群的測(cè)試
完成Spark集群的搭建之后,可以通過(guò)Spark Shell的交互界面進(jìn)行交互式編程[4],以下實(shí)例是對(duì)HDFS系統(tǒng)上的一個(gè)文本文檔readme.txt,統(tǒng)計(jì)一下“Spark”一共出現(xiàn)了多少次。
在Spark Shell交互界面 scala> 運(yùn)行如下程序代碼
val file = sc.textFile("hdfs://10.230.10.160:9000/usr/xu/test/readme.txt")
val sparks = file.filter(line => line.contains("Spark"))
sparks.count
最后從執(zhí)行結(jié)果中我們發(fā)現(xiàn)“Spark”這個(gè)詞一共出現(xiàn)了19次。
此時(shí),我們查看Spark Shell的Web控制臺(tái),發(fā)現(xiàn)控制臺(tái)中顯示我們提交了一個(gè)任務(wù)并成功完成,點(diǎn)擊任務(wù)可以看到其執(zhí)行詳情。
那如何驗(yàn)證Spark Shell對(duì)readme.txt這個(gè)文件中的“Spark”出現(xiàn)的19次是正確的呢?其實(shí)方法很簡(jiǎn)單,我們可以使用Linux自帶的wc命令來(lái)統(tǒng)計(jì),即如下命令:
[root@Master spark1.3.1]# grep Spark readme.txt|wc
19 156 1232
發(fā)現(xiàn)此時(shí)的執(zhí)行結(jié)果也是19次,和Spark Shell的計(jì)數(shù)是一樣的。
5 結(jié)束語(yǔ)
以上的Spark集群安裝是在CentOS6.5操作系統(tǒng)上完成,集群采用1個(gè)Master和3個(gè)Slaves。在實(shí)際行業(yè)企業(yè)應(yīng)用中,可以根據(jù)需要增加子節(jié)點(diǎn)數(shù)量,通過(guò)Spark進(jìn)行大規(guī)模機(jī)器學(xué)習(xí)、圖形計(jì)算以及流數(shù)據(jù)分析,以達(dá)到快速分布式計(jì)算的要求?;赟park的應(yīng)用已經(jīng)逐步落地,尤其是在互聯(lián)網(wǎng)領(lǐng)域,如淘寶、騰訊、網(wǎng)易等公司的發(fā)展已經(jīng)成熟,同時(shí)電信、銀行等傳統(tǒng)行業(yè)也開(kāi)始逐步應(yīng)用Spark并取得了較好的效果。因此,在大數(shù)據(jù)分析平臺(tái)中Spark技術(shù)將會(huì)得到更為廣泛的發(fā)展和應(yīng)用。
參考文獻(xiàn):
[1] 陳虹君.基于Hadoop平臺(tái)的Spark框架研究[J].電腦知識(shí)與技術(shù),2014(35).
[2] 高彥杰. Spark大數(shù)據(jù)處理技術(shù)、應(yīng)用與性能優(yōu)化[M] .北京:機(jī)械工業(yè)出版社,2015.12.
[3] 許禮捷.基于CentOS的Hadoop分布式集群的構(gòu)建方法研究[J].沙洲職業(yè)工學(xué)院學(xué)報(bào),2016(1):23-28.
[4] Spark編程指南[EB/OL].http://spark.apache.org/docs/1.3.1/programming-guide.html,2015.